From 8b7ca9f4fb5fd758e5f3044a533ddf6fe19e0e88 Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 4 Jul 2024 10:40:16 +0800 Subject: [PATCH 001/107] chore(vm): adjust inappropriate log content --- .../tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java index 56366bbdb0c..c8199651a7f 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java @@ -84,7 +84,7 @@ public void validate(UnfreezeBalanceV2Param param, Repository repo) if (!checkUnfreezeBalance(accountCapsule, param.getUnfreezeBalance(), param.getResourceType())) { throw new ContractValidateException( - "Invalid unfreeze_balance, [" + param.getUnfreezeBalance() + "] is error"); + "Invalid unfreeze_balance, [" + param.getUnfreezeBalance() + "] is too large"); } } From 2a3d5ca389ad14b08574d15f3d16da80447927ef Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 4 Jul 2024 10:48:16 +0800 Subject: [PATCH 002/107] impr(test): optimize some unit tests --- .../runtime/vm/BatchValidateSignContractTest.java | 2 +- .../org/tron/common/runtime/vm/Create2Test.java | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index d094f1a3d05..3fa52aa70c0 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -79,7 +79,7 @@ public void staticCallTest() { @Test public void correctionTest() { - contract.setConstantCall(false); + contract.setConstantCall(true); List signatures = new ArrayList<>(); List addresses = new ArrayList<>(); byte[] hash = Hash.sha3(longData); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java index 79ed1c7e1f8..a63abd97930 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java @@ -160,9 +160,16 @@ public void testCreate2() // Trigger contract method: deploy(bytes,uint) long salt = 100L; String hexInput = AbiUtil.parseMethod(methodSign, Arrays.asList(testCode, salt)); - TVMTestResult result = TvmTestUtils - .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - factoryAddress, Hex.decode(hexInput), 0, fee, manager, null); + + TVMTestResult result = null; + for (int i = 1; i < 3; i++) { + result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, fee, manager, null); + if (result.getRuntime().getRuntimeError() == null) { + break; + } + } Assert.assertNull(result.getRuntime().getRuntimeError()); byte[] returnValue = result.getRuntime().getResult().getHReturn(); From 1555a012434faf22056558d8d5e6683f94c0e9a7 Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 12 Jul 2024 12:29:20 +0800 Subject: [PATCH 003/107] func(vm): support for CANCELALLUNFREEZEV2 details --- .../main/java/org/tron/core/vm/VMConstant.java | 2 ++ .../CancelAllUnfreezeV2Processor.java | 13 +++++++++++-- .../java/org/tron/core/vm/program/Program.java | 15 ++++++++++++--- .../tron/common/parameter/CommonParameter.java | 6 ++++++ common/src/main/java/org/tron/core/Constant.java | 1 + .../main/java/org/tron/core/config/args/Args.java | 4 ++++ 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/VMConstant.java b/actuator/src/main/java/org/tron/core/vm/VMConstant.java index 4e7f6b29e3f..abbb6ae6d38 100644 --- a/actuator/src/main/java/org/tron/core/vm/VMConstant.java +++ b/actuator/src/main/java/org/tron/core/vm/VMConstant.java @@ -10,6 +10,8 @@ public class VMConstant { public static final int ONE_THOUSAND = 1000; public static final long SUN_PER_ENERGY = 100; + public static final String WITHDRAW_EXPIRE_BALANCE = "WithdrawExpireBalance"; + private VMConstant() { } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/CancelAllUnfreezeV2Processor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/CancelAllUnfreezeV2Processor.java index 888071a177b..ec1f4363205 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/CancelAllUnfreezeV2Processor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/CancelAllUnfreezeV2Processor.java @@ -7,6 +7,8 @@ import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; import static org.tron.protos.contract.Common.ResourceCode.ENERGY; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.tron.common.utils.DecodeUtil; @@ -14,6 +16,7 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; +import org.tron.core.vm.VMConstant; import org.tron.core.vm.nativecontract.param.CancelAllUnfreezeV2Param; import org.tron.core.vm.repository.Repository; import org.tron.protos.Protocol; @@ -38,13 +41,17 @@ public void validate(CancelAllUnfreezeV2Param param, Repository repo) throws Con } } - public long execute(CancelAllUnfreezeV2Param param, Repository repo) throws ContractExeException { + public Map execute(CancelAllUnfreezeV2Param param, Repository repo) throws ContractExeException { + Map result = new HashMap<>(); byte[] ownerAddress = param.getOwnerAddress(); AccountCapsule ownerCapsule = repo.getAccount(ownerAddress); long now = repo.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(); long withdrawExpireBalance = 0L; for (Protocol.Account.UnFreezeV2 unFreezeV2: ownerCapsule.getUnfrozenV2List()) { if (unFreezeV2.getUnfreezeExpireTime() > now) { + String resourceName = unFreezeV2.getType().name(); + result.put(resourceName, result.getOrDefault(resourceName, 0L) + unFreezeV2.getUnfreezeAmount()); + updateFrozenInfoAndTotalResourceWeight(ownerCapsule, unFreezeV2, repo); } else { // withdraw @@ -57,7 +64,9 @@ public long execute(CancelAllUnfreezeV2Param param, Repository repo) throws Cont ownerCapsule.clearUnfrozenV2(); repo.updateAccount(ownerCapsule.createDbKey(), ownerCapsule); - return withdrawExpireBalance; + + result.put(VMConstant.WITHDRAW_EXPIRE_BALANCE, withdrawExpireBalance); + return result; } public void updateFrozenInfoAndTotalResourceWeight( diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 0b0ef5bc9ba..25eceb09849 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -1996,13 +1996,22 @@ public boolean cancelAllUnfreezeV2Action() { CancelAllUnfreezeV2Processor processor = new CancelAllUnfreezeV2Processor(); processor.validate(param, repository); - long withdrawExpireBalance = processor.execute(param, repository); + Map result = processor.execute(param, repository); repository.commit(); - if (withdrawExpireBalance > 0) { + + if (result.get(VMConstant.WITHDRAW_EXPIRE_BALANCE) > 0) { increaseNonce(); - addInternalTx(null, owner, owner, withdrawExpireBalance, null, + addInternalTx(null, owner, owner, result.get(VMConstant.WITHDRAW_EXPIRE_BALANCE), null, "withdrawExpireUnfreezeWhileCanceling", nonce, null); } + + if (internalTx != null && CommonParameter.getInstance().saveCancelAllUnfreezeV2Details) { + internalTx.setExtra(String.format("{\"%s\":%s,\"%s\":%d,\"%s\":%d}", + BANDWIDTH.name(), result.getOrDefault(BANDWIDTH.name(), 0L), + ENERGY.name(), result.getOrDefault(ENERGY.name(), 0L), + TRON_POWER.name(), result.getOrDefault(TRON_POWER.name(), 0L))); + } + return true; } catch (ContractValidateException e) { logger.warn("TVM CancelAllUnfreezeV2: validate failure. Reason: {}", e.getMessage()); diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 22159063333..1a4110a3908 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -88,6 +88,12 @@ public class CommonParameter { public boolean saveFeaturedInternalTx; @Getter @Setter + @Parameter(names = {"--save-cancel-all-unfreeze-v2-details"}, description = "Record the details of the internal " + + "transactions generated by the CANCELALLUNFREEZEV2 opcode, such as bandwidth/energy/tronpower cancel amount. " + + "(default: false)") + public boolean saveCancelAllUnfreezeV2Details; + @Getter + @Setter @Parameter(names = {"--long-running-time"}) public int longRunningTime = 10; @Getter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 0e634d3ef7d..fc566702ff3 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -221,6 +221,7 @@ public class Constant { public static final String VM_SAVE_INTERNAL_TX = "vm.saveInternalTx"; public static final String VM_SAVE_FEATURED_INTERNAL_TX = "vm.saveFeaturedInternalTx"; + public static final String VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS = "vm.saveCancelAllUnfreezeV2Details"; // public static final String COMMITTEE_ALLOW_SHIELDED_TRANSACTION = "committee.allowShieldedTransaction"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 422efefaed8..0d56b06ad7e 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -883,6 +883,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.VM_SAVE_FEATURED_INTERNAL_TX) && config.getBoolean(Constant.VM_SAVE_FEATURED_INTERNAL_TX); + PARAMETER.saveCancelAllUnfreezeV2Details = + config.hasPath(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS) + && config.getBoolean(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS); + // PARAMETER.allowShieldedTransaction = // config.hasPath(Constant.COMMITTEE_ALLOW_SHIELDED_TRANSACTION) ? config // .getInt(Constant.COMMITTEE_ALLOW_SHIELDED_TRANSACTION) : 0; From 82d52d9f26b7ccd6bb07aa5b3fb3c19257c45cb9 Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 18 Jul 2024 10:39:16 +0800 Subject: [PATCH 004/107] func(vm): change some json format --- actuator/src/main/java/org/tron/core/vm/program/Program.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 25eceb09849..a7a0719695e 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -2006,7 +2006,7 @@ public boolean cancelAllUnfreezeV2Action() { } if (internalTx != null && CommonParameter.getInstance().saveCancelAllUnfreezeV2Details) { - internalTx.setExtra(String.format("{\"%s\":%s,\"%s\":%d,\"%s\":%d}", + internalTx.setExtra(String.format("{\"%s\":%d,\"%s\":%d,\"%s\":%d}", BANDWIDTH.name(), result.getOrDefault(BANDWIDTH.name(), 0L), ENERGY.name(), result.getOrDefault(ENERGY.name(), 0L), TRON_POWER.name(), result.getOrDefault(TRON_POWER.name(), 0L))); From 930362b94ad62a36d1ebeb828023a1b8ce33bda8 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Wed, 14 Aug 2024 16:33:19 +0800 Subject: [PATCH 005/107] feat(net): discard block inventory below the solidified block --- .../main/java/org/tron/core/net/TronNetDelegate.java | 4 ++++ .../org/tron/core/net/service/adv/AdvService.java | 12 ++++++++++-- .../org/tron/core/net/services/AdvServiceTest.java | 7 +++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index cd9c8f01d8b..100bad179bf 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -156,6 +156,10 @@ public BlockId getKhaosDbHeadBlockId() { return chainBaseManager.getKhaosDbHead().getBlockId(); } + public long getSolidifiedBlockNum() { + return chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + } + public BlockId getSolidBlockId() { return chainBaseManager.getSolidBlockId(); } diff --git a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java index 505b53358c8..2241ce8d1ce 100644 --- a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java +++ b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java @@ -121,8 +121,16 @@ public boolean addInv(Item item) { if (item.getType().equals(InventoryType.TRX) && trxCache.getIfPresent(item) != null) { return false; } - if (item.getType().equals(InventoryType.BLOCK) && blockCache.getIfPresent(item) != null) { - return false; + + if (item.getType().equals(InventoryType.BLOCK)) { + if (blockCache.getIfPresent(item) != null) { + return false; + } + + long solidNum = tronNetDelegate.getSolidifiedBlockNum(); + if (new BlockId(item.getHash()).getNum() <= solidNum) { + return false; + } } synchronized (this) { diff --git a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java index d79b54f6f45..8a105c81e0f 100644 --- a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java @@ -73,10 +73,17 @@ private void testAddInv() { Item itemBlock = new Item(Sha256Hash.ZERO_HASH, InventoryType.BLOCK); flag = service.addInv(itemBlock); + Assert.assertFalse(flag); + + BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1000L); + itemBlock = new Item(blockId, InventoryType.BLOCK); + flag = service.addInv(itemBlock); Assert.assertTrue(flag); flag = service.addInv(itemBlock); Assert.assertFalse(flag); + blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 10000L); + itemBlock = new Item(blockId, InventoryType.BLOCK); service.addInvToCache(itemBlock); flag = service.addInv(itemBlock); Assert.assertFalse(flag); From bd7b3d18341abe326dbb65ebcf3d2dfb6ec185be Mon Sep 17 00:00:00 2001 From: waynercheung Date: Wed, 18 Sep 2024 17:54:35 +0800 Subject: [PATCH 006/107] feat(jsonrpc): ethGetBlockByNumber supports finalized --- .../src/main/java/org/tron/core/Wallet.java | 26 +++++++++++++++---- .../core/services/jsonrpc/JsonRpcApiUtil.java | 3 ++- .../services/jsonrpc/TronJsonRpcImpl.java | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 9d7eb75df1b..b3754db9241 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -29,6 +29,10 @@ import static org.tron.core.config.Parameter.DatabaseConstants.PROPOSAL_COUNT_LIMIT_MAX; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.EARLIEST_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.FINALIZED_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.LATEST_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.PENDING_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.TAG_PENDING_SUPPORT_ERROR; import static org.tron.core.vm.utils.FreezeV2Util.getV2EnergyUsage; import static org.tron.core.vm.utils.FreezeV2Util.getV2NetUsage; import static org.tron.protos.contract.Common.ResourceCode; @@ -681,6 +685,16 @@ public Block getBlockByNum(long blockNum) { } } + public Block getFinalizedBlock() { + try { + long blockNum = chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + return chainBaseManager.getBlockByNum(blockNum).getInstance(); + } catch (StoreException e) { + logger.info(e.getMessage()); + return null; + } + } + public BlockCapsule getBlockCapsuleByNum(long blockNum) { try { return chainBaseManager.getBlockByNum(blockNum); @@ -706,10 +720,12 @@ public long getTransactionCountByBlockNum(long blockNum) { public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { if (EARLIEST_STR.equalsIgnoreCase(id)) { return getBlockByNum(0); - } else if ("latest".equalsIgnoreCase(id)) { + } else if (LATEST_STR.equalsIgnoreCase(id)) { return getNowBlock(); - } else if ("pending".equalsIgnoreCase(id)) { - throw new JsonRpcInvalidParamsException("TAG pending not supported"); + } else if (FINALIZED_STR.equalsIgnoreCase(id)) { + return getFinalizedBlock(); + } else if (PENDING_STR.equalsIgnoreCase(id)) { + throw new JsonRpcInvalidParamsException(TAG_PENDING_SUPPORT_ERROR); } else { long blockNumber; try { @@ -724,8 +740,8 @@ public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { public List getTransactionsByJsonBlockId(String id) throws JsonRpcInvalidParamsException { - if ("pending".equalsIgnoreCase(id)) { - throw new JsonRpcInvalidParamsException("TAG pending not supported"); + if (PENDING_STR.equalsIgnoreCase(id)) { + throw new JsonRpcInvalidParamsException(TAG_PENDING_SUPPORT_ERROR); } else { Block block = getByJsonBlockId(id); return block != null ? block.getTransactionsList() : null; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 4efc5994c0d..3891e472e7c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -3,6 +3,7 @@ import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.EARLIEST_STR; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.LATEST_STR; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.PENDING_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.TAG_PENDING_SUPPORT_ERROR; import com.google.common.base.Throwables; import com.google.common.primitives.Longs; @@ -515,7 +516,7 @@ public static long parseEnergyFee(long timestamp, String energyPriceHistory) { public static long getByJsonBlockId(String blockNumOrTag) throws JsonRpcInvalidParamsException { if (PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcInvalidParamsException("TAG pending not supported"); + throw new JsonRpcInvalidParamsException(TAG_PENDING_SUPPORT_ERROR); } if (StringUtils.isEmpty(blockNumOrTag) || LATEST_STR.equalsIgnoreCase(blockNumOrTag)) { return -1; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 0ca57a3b98c..1bb93001055 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -136,6 +136,8 @@ public enum RequestSource { public static final String EARLIEST_STR = "earliest"; public static final String PENDING_STR = "pending"; public static final String LATEST_STR = "latest"; + public static final String FINALIZED_STR = "finalized"; + public static final String TAG_PENDING_SUPPORT_ERROR = "TAG pending not supported"; private static final String JSON_ERROR = "invalid json request"; private static final String BLOCK_NUM_ERROR = "invalid block number"; From 4e65c21678a75964dbf1243555ca6793731bfd0d Mon Sep 17 00:00:00 2001 From: waynercheung Date: Wed, 13 Nov 2024 13:25:41 +0800 Subject: [PATCH 007/107] feat(jsonrpc): make other jsonrpc apis process finalized parameter --- framework/src/main/java/org/tron/core/Wallet.java | 10 +++++++--- .../core/services/jsonrpc/JsonRpcApiUtil.java | 6 +++++- .../core/services/jsonrpc/TronJsonRpcImpl.java | 15 ++++++++++----- .../jsonrpc/filters/LogFilterWrapper.java | 8 ++++---- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index b3754db9241..e7c239511d9 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -685,9 +685,9 @@ public Block getBlockByNum(long blockNum) { } } - public Block getFinalizedBlock() { + public Block getSolidBlock() { try { - long blockNum = chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + long blockNum = getSolidBlockNum(); return chainBaseManager.getBlockByNum(blockNum).getInstance(); } catch (StoreException e) { logger.info(e.getMessage()); @@ -695,6 +695,10 @@ public Block getFinalizedBlock() { } } + public long getSolidBlockNum() { + return chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + } + public BlockCapsule getBlockCapsuleByNum(long blockNum) { try { return chainBaseManager.getBlockByNum(blockNum); @@ -723,7 +727,7 @@ public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { } else if (LATEST_STR.equalsIgnoreCase(id)) { return getNowBlock(); } else if (FINALIZED_STR.equalsIgnoreCase(id)) { - return getFinalizedBlock(); + return getSolidBlock(); } else if (PENDING_STR.equalsIgnoreCase(id)) { throw new JsonRpcInvalidParamsException(TAG_PENDING_SUPPORT_ERROR); } else { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 3891e472e7c..955ba55060f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -1,6 +1,7 @@ package org.tron.core.services.jsonrpc; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.EARLIEST_STR; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.FINALIZED_STR; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.LATEST_STR; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.PENDING_STR; import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.TAG_PENDING_SUPPORT_ERROR; @@ -514,7 +515,8 @@ public static long parseEnergyFee(long timestamp, String energyPriceHistory) { return -1; } - public static long getByJsonBlockId(String blockNumOrTag) throws JsonRpcInvalidParamsException { + public static long getByJsonBlockId(String blockNumOrTag, Wallet wallet) + throws JsonRpcInvalidParamsException { if (PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException(TAG_PENDING_SUPPORT_ERROR); } @@ -522,6 +524,8 @@ public static long getByJsonBlockId(String blockNumOrTag) throws JsonRpcInvalidP return -1; } else if (EARLIEST_STR.equalsIgnoreCase(blockNumOrTag)) { return 0; + } else if (FINALIZED_STR.equalsIgnoreCase(blockNumOrTag)) { + return wallet.getSolidBlockNum(); } else { return ByteArray.jsonHexToLong(blockNumOrTag); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 1bb93001055..5ff915dbdc9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -141,7 +141,8 @@ public enum RequestSource { private static final String JSON_ERROR = "invalid json request"; private static final String BLOCK_NUM_ERROR = "invalid block number"; - private static final String TAG_NOT_SUPPORT_ERROR = "TAG [earliest | pending] not supported"; + private static final String TAG_NOT_SUPPORT_ERROR = + "TAG [earliest | pending | finalized] not supported"; private static final String QUANTITY_NOT_SUPPORT_ERROR = "QUANTITY not supported, just support TAG as latest"; private static final String NO_BLOCK_HEADER = "header not found"; @@ -353,7 +354,8 @@ public String getLatestBlockNum() { public String getTrxBalance(String address, String blockNumOrTag) throws JsonRpcInvalidParamsException { if (EARLIEST_STR.equalsIgnoreCase(blockNumOrTag) - || PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { + || PENDING_STR.equalsIgnoreCase(blockNumOrTag) + || FINALIZED_STR.equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException(TAG_NOT_SUPPORT_ERROR); } else if (LATEST_STR.equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressCompatibleToByteArray(address); @@ -490,7 +492,8 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, long va public String getStorageAt(String address, String storageIdx, String blockNumOrTag) throws JsonRpcInvalidParamsException { if (EARLIEST_STR.equalsIgnoreCase(blockNumOrTag) - || PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { + || PENDING_STR.equalsIgnoreCase(blockNumOrTag) + || FINALIZED_STR.equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException(TAG_NOT_SUPPORT_ERROR); } else if (LATEST_STR.equalsIgnoreCase(blockNumOrTag)) { byte[] addressByte = addressCompatibleToByteArray(address); @@ -525,7 +528,8 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT public String getABIOfSmartContract(String contractAddress, String blockNumOrTag) throws JsonRpcInvalidParamsException { if (EARLIEST_STR.equalsIgnoreCase(blockNumOrTag) - || PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { + || PENDING_STR.equalsIgnoreCase(blockNumOrTag) + || FINALIZED_STR.equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException(TAG_NOT_SUPPORT_ERROR); } else if (LATEST_STR.equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressCompatibleToByteArray(contractAddress); @@ -825,7 +829,8 @@ public String getCall(CallArguments transactionCall, Object blockParamObj) } if (EARLIEST_STR.equalsIgnoreCase(blockNumOrTag) - || PENDING_STR.equalsIgnoreCase(blockNumOrTag)) { + || PENDING_STR.equalsIgnoreCase(blockNumOrTag) + || FINALIZED_STR.equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException(TAG_NOT_SUPPORT_ERROR); } else if (LATEST_STR.equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressCompatibleToByteArray(transactionCall.getFrom()); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java index cf04a1769aa..cf5c5567299 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -51,7 +51,7 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet // then if toBlock < maxBlockNum, set fromBlock = toBlock // then if toBlock >= maxBlockNum, set fromBlock = maxBlockNum if (StringUtils.isEmpty(fr.getFromBlock()) && StringUtils.isNotEmpty(fr.getToBlock())) { - toBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getToBlock()); + toBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getToBlock(), wallet); if (toBlockSrc == -1) { toBlockSrc = Long.MAX_VALUE; } @@ -59,7 +59,7 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet } else if (StringUtils.isNotEmpty(fr.getFromBlock()) && StringUtils.isEmpty(fr.getToBlock())) { - fromBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getFromBlock()); + fromBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getFromBlock(), wallet); if (fromBlockSrc == -1) { fromBlockSrc = currentMaxBlockNum; } @@ -70,8 +70,8 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet toBlockSrc = Long.MAX_VALUE; } else { - fromBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getFromBlock()); - toBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getToBlock()); + fromBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getFromBlock(), wallet); + toBlockSrc = JsonRpcApiUtil.getByJsonBlockId(fr.getToBlock(), wallet); if (fromBlockSrc == -1 && toBlockSrc == -1) { fromBlockSrc = currentMaxBlockNum; toBlockSrc = Long.MAX_VALUE; From a8ea72166e75c0a5cd52febf8887dc2ad93aae6c Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 13 Nov 2024 17:13:08 +0800 Subject: [PATCH 008/107] initial commit --- .../logsfilter/DesensitizedConverter.java | 50 +++++++++++++++++++ .../core/net/service/relay/RelayService.java | 7 +++ framework/src/main/resources/logback.xml | 2 + .../logsfilter/DesensitizedConverterTest.java | 22 ++++++++ 4 files changed, 81 insertions(+) create mode 100644 framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java create mode 100644 framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java diff --git a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java new file mode 100644 index 00000000000..073495d1015 --- /dev/null +++ b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java @@ -0,0 +1,50 @@ +package org.tron.common.logsfilter; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import lombok.extern.slf4j.Slf4j; +import org.tron.core.config.args.Args; + +@Slf4j(topic = "Parser") +public class DesensitizedConverter extends ClassicConverter { + + private static final int SENSITIVE_WORD_SIZE = 1_000; + + private static final Pattern pattern = Pattern.compile( + "/(((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|" + + "([1-9]?\\d))))"); + + private static final Cache sensitiveCache = CacheBuilder.newBuilder() + .maximumSize(SENSITIVE_WORD_SIZE) + .recordStats().build(); + + public static void addSensitive(String key, String value) { + sensitiveCache.put(key, value); + } + + public String desensitization(String content) { + if (sensitiveCache.size() > 0) { + Matcher matcher = pattern.matcher(content); + while (matcher.find()) { + String key = matcher.group(); + String value = sensitiveCache.getIfPresent(key); + if (value != null) { + content = content.replaceAll(key, value); + } else { + content = content.replaceAll(key, "unknown"); + } + } + } + return content; + } + + @Override + public String convert(ILoggingEvent iLoggingEvent) { + String source = iLoggingEvent.getFormattedMessage(); + return Args.getInstance().isFastForward() ? desensitization(source) : source; + } +} diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index dfc5f2e89da..388080a1039 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -18,8 +18,11 @@ import org.tron.common.crypto.SignInterface; import org.tron.common.crypto.SignUtils; import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.logsfilter.DesensitizedConverter; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.TransactionCapsule; @@ -156,6 +159,10 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) { } if (flag) { TronNetService.getP2pConfig().getTrustNodes().add(channel.getInetAddress()); + byte[] addressByte = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, + msg.getAddress().toByteArray()); + DesensitizedConverter.addSensitive(channel.getInetAddress().toString(), + ByteArray.toHexString(addressByte)); } return flag; } catch (Exception e) { diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml index 39c7f463172..7d761bda931 100644 --- a/framework/src/main/resources/logback.xml +++ b/framework/src/main/resources/logback.xml @@ -4,6 +4,8 @@ + diff --git a/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java new file mode 100644 index 00000000000..03ba6276e55 --- /dev/null +++ b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java @@ -0,0 +1,22 @@ +package org.tron.common.logsfilter; + +import org.junit.Assert; +import org.junit.Test; + +public class DesensitizedConverterTest { + + @Test + public void testReplace() { + DesensitizedConverter converter = new DesensitizedConverter(); + DesensitizedConverter.addSensitive("/192.168.1.10", "address1"); + DesensitizedConverter.addSensitive("/197.168.1.10", "address2"); + + String logStr1 = "This is test log /192.168.1.10:100, /197.168.1.10:200, /197.168.1.10:100"; + Assert.assertEquals("This is test log address1:100, address2:200, address2:100", + converter.desensitization(logStr1)); + + String logStr2 = "This is test log /192.168.1.100:100, /197.168.1.10:200, /197.168.1.10:100"; + Assert.assertEquals("This is test log unknown:100, address2:200, address2:100", + converter.desensitization(logStr2)); + } +} From a31763e43a0965c17c9fa1c9eea788e99a8dce6f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 13 Nov 2024 17:24:24 +0800 Subject: [PATCH 009/107] revise if sensitiveCache is empty --- .../logsfilter/DesensitizedConverter.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java index 073495d1015..a618d1243de 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java +++ b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java @@ -27,18 +27,17 @@ public static void addSensitive(String key, String value) { } public String desensitization(String content) { - if (sensitiveCache.size() > 0) { - Matcher matcher = pattern.matcher(content); - while (matcher.find()) { - String key = matcher.group(); - String value = sensitiveCache.getIfPresent(key); - if (value != null) { - content = content.replaceAll(key, value); - } else { - content = content.replaceAll(key, "unknown"); - } + Matcher matcher = pattern.matcher(content); + while (matcher.find()) { + String key = matcher.group(); + String value = sensitiveCache.getIfPresent(key); + if (value != null) { + content = content.replaceAll(key, value); + } else { + content = content.replaceAll(key, "unknown"); } } + return content; } From a154dcbe5f48a74972ea11ec831458ee81b34956 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 13 Nov 2024 17:51:41 +0800 Subject: [PATCH 010/107] ignore / of address --- .../java/org/tron/common/logsfilter/DesensitizedConverter.java | 2 +- .../main/java/org/tron/core/net/service/relay/RelayService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java index a618d1243de..84a681fe379 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java +++ b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java @@ -15,7 +15,7 @@ public class DesensitizedConverter extends ClassicConverter { private static final int SENSITIVE_WORD_SIZE = 1_000; private static final Pattern pattern = Pattern.compile( - "/(((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|" + "(((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|" + "([1-9]?\\d))))"); private static final Cache sensitiveCache = CacheBuilder.newBuilder() diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index 388080a1039..90463f8ab46 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -161,7 +161,7 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) { TronNetService.getP2pConfig().getTrustNodes().add(channel.getInetAddress()); byte[] addressByte = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, msg.getAddress().toByteArray()); - DesensitizedConverter.addSensitive(channel.getInetAddress().toString(), + DesensitizedConverter.addSensitive(channel.getInetAddress().toString().substring(1), ByteArray.toHexString(addressByte)); } return flag; From 7bd057d4356380bfc26e90e655a7aa6ba6887340 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 14 Nov 2024 10:35:22 +0800 Subject: [PATCH 011/107] replace unknown ip with string IP --- .../logsfilter/DesensitizedConverter.java | 4 ++-- .../logsfilter/DesensitizedConverterTest.java | 23 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java index 84a681fe379..1cbe5101f40 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java +++ b/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java @@ -26,7 +26,7 @@ public static void addSensitive(String key, String value) { sensitiveCache.put(key, value); } - public String desensitization(String content) { + private String desensitization(String content) { Matcher matcher = pattern.matcher(content); while (matcher.find()) { String key = matcher.group(); @@ -34,7 +34,7 @@ public String desensitization(String content) { if (value != null) { content = content.replaceAll(key, value); } else { - content = content.replaceAll(key, "unknown"); + content = content.replaceAll(key, "IP"); } } diff --git a/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java index 03ba6276e55..c584d5adf06 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java @@ -1,22 +1,31 @@ package org.tron.common.logsfilter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import org.junit.Assert; import org.junit.Test; public class DesensitizedConverterTest { @Test - public void testReplace() { + public void testReplace() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { DesensitizedConverter converter = new DesensitizedConverter(); - DesensitizedConverter.addSensitive("/192.168.1.10", "address1"); - DesensitizedConverter.addSensitive("/197.168.1.10", "address2"); + DesensitizedConverter.addSensitive("192.168.1.10", "address1"); + DesensitizedConverter.addSensitive("197.168.1.10", "address2"); + + Method method = converter.getClass().getDeclaredMethod( + "desensitization", String.class); + method.setAccessible(true); String logStr1 = "This is test log /192.168.1.10:100, /197.168.1.10:200, /197.168.1.10:100"; - Assert.assertEquals("This is test log address1:100, address2:200, address2:100", - converter.desensitization(logStr1)); + String result1 = (String) method.invoke(converter, logStr1); + Assert.assertEquals("This is test log /address1:100, /address2:200, /address2:100", + result1); String logStr2 = "This is test log /192.168.1.100:100, /197.168.1.10:200, /197.168.1.10:100"; - Assert.assertEquals("This is test log unknown:100, address2:200, address2:100", - converter.desensitization(logStr2)); + String result2 = (String) method.invoke(converter, logStr2); + Assert.assertEquals("This is test log /IP:100, /address2:200, /address2:100", + result2); } } From fe065dac0672311a40df0d71f1de526c582dd5bc Mon Sep 17 00:00:00 2001 From: chaozhu Date: Thu, 14 Nov 2024 17:56:01 +0800 Subject: [PATCH 012/107] update jacoco version --- plugins/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/build.gradle b/plugins/build.gradle index b85a435dc30..7028686f3d0 100644 --- a/plugins/build.gradle +++ b/plugins/build.gradle @@ -6,7 +6,7 @@ apply plugin: 'application' apply plugin: 'checkstyle' jacoco { - toolVersion = "0.8.4" + toolVersion = "0.8.8" } def versions = [ checkstyle: '8.7', From 3da676e260fc5e631445d00b7c807f4f1293d77e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 15 Nov 2024 14:28:12 +0800 Subject: [PATCH 013/107] fix the bug of eth_getLogs --- .../jsonrpc/filters/LogBlockQuery.java | 8 ++-- .../org/tron/core/jsonrpc/JsonRpcTest.java | 46 +++++++++++++++++-- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java index 94e29e657be..7ee6ce74c10 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java @@ -191,17 +191,17 @@ public int[][][] getConditions() { Bloom bloom = Bloom.create(hash); BitSet bs = BitSet.valueOf(bloom.getData()); - int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom - int nonZeroCount = 0; + //number of nonZero positions may be equal or less than number(3) of hash function in Bloom + List bitIndexList = new ArrayList<>(); for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { // operate on index i here if (i == Integer.MAX_VALUE) { break; // or (i+1) would overflow } - bitIndex[nonZeroCount++] = i; + bitIndexList.add(i); } - bitIndexes[j] = bitIndex; + bitIndexes[j] = bitIndexList.stream().mapToInt(Integer::intValue).toArray(); } allConditionsIndex[k] = bitIndexes; } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index f221d0c95ac..81d2af47bbf 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -347,17 +347,16 @@ private int[] getBloomIndex(String s) { Bloom bloom = Bloom.create(Hash.sha3(ByteArray.fromHexString(s))); BitSet bs = BitSet.valueOf(bloom.getData()); - int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom - int nonZeroCount = 0; + List bitIndexList = new ArrayList<>(); for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { // operate on index i here if (i == Integer.MAX_VALUE) { break; // or (i+1) would overflow } - bitIndex[nonZeroCount++] = i; + bitIndexList.add(i); } - return bitIndex; + return bitIndexList.stream().mapToInt(Integer::intValue).toArray(); } @Test @@ -416,4 +415,43 @@ public void testGetConditions() { Assert.fail(); } } + + @Test + public void testGetConditionWithHashCollision() { + try { + List addressList = new ArrayList<>(); + addressList.add("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85"); + addressList.add("0x3038114c1a1e72c5bfa8b003bc3650ad2ba254a0"); + + Object[] topics = new Object[0]; + + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, + null, + addressList, + topics, + null), + 100, + null); + + LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, null, 100, null); + int[][][] conditions = logBlockQuery.getConditions(); + //level = depth(address) + depth(topics), skip null + Assert.assertEquals(1, conditions.length); + //elements number + Assert.assertEquals(2, conditions[0].length); + + Assert.assertEquals(3, conditions[0][0].length); + //Hash collision, only two nonZero position + Assert.assertEquals(2, conditions[0][1].length); + + Assert.assertArrayEquals(conditions[0][0], + getBloomIndex("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85")); + Assert.assertArrayEquals(conditions[0][1], + getBloomIndex("0x3038114c1a1e72c5bfa8b003bc3650ad2ba254a0")); + + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } } From 86ab5add57f683f5f87e9a323cb3ff0e777cd744 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 15 Nov 2024 17:29:31 +0800 Subject: [PATCH 014/107] checkout payment in checkShieldedTRC20NoteValue --- framework/src/main/java/org/tron/core/Wallet.java | 6 ++++++ .../src/main/java/org/tron/core/zen/address/KeyIo.java | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 769274e8f2a..dd5087288dc 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3438,6 +3438,9 @@ private void checkShieldedTRC20NoteValue( if (spendNote.getNote().getValue() < 0) { throw new ContractValidateException("The value in SpendNoteTRC20 must >= 0"); } + if (StringUtils.isEmpty(spendNote.getNote().getPaymentAddress())) { + throw new ContractValidateException("Payment Address in SpendNote should not be empty"); + } } } @@ -3446,6 +3449,9 @@ private void checkShieldedTRC20NoteValue( if (receiveNote.getNote().getValue() < 0) { throw new ContractValidateException("The value in ReceiveNote must >= 0"); } + if (StringUtils.isEmpty(receiveNote.getNote().getPaymentAddress())) { + throw new ContractValidateException("Payment Address in ReceiveNote should not be empty"); + } } } } diff --git a/framework/src/main/java/org/tron/core/zen/address/KeyIo.java b/framework/src/main/java/org/tron/core/zen/address/KeyIo.java index 9dc28b9ff03..85e90f6ad8d 100644 --- a/framework/src/main/java/org/tron/core/zen/address/KeyIo.java +++ b/framework/src/main/java/org/tron/core/zen/address/KeyIo.java @@ -19,6 +19,7 @@ import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.tron.common.utils.Bech32; import org.tron.common.utils.Bech32.Bech32Data; @@ -29,6 +30,9 @@ public class KeyIo { private static String SAPLING_PAYMENT_ADDRESS = "ztron"; public static PaymentAddress decodePaymentAddress(String str) { + if (StringUtils.isEmpty(str)) { + return null; + } byte[] data; Bech32Data bech = Bech32.decode(str); if (bech.hrp.equals(SAPLING_PAYMENT_ADDRESS) From 4717f87407706b848f792ff6d72c89f5ed5e7d1a Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 19 Nov 2024 15:10:05 +0800 Subject: [PATCH 015/107] add test case testCreateShieldedContractParameters2 without payment_address --- .../java/org/tron/core/ShieldWalletTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/framework/src/test/java/org/tron/core/ShieldWalletTest.java b/framework/src/test/java/org/tron/core/ShieldWalletTest.java index 5bc2a31c9d0..fe095723c77 100644 --- a/framework/src/test/java/org/tron/core/ShieldWalletTest.java +++ b/framework/src/test/java/org/tron/core/ShieldWalletTest.java @@ -19,6 +19,7 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; import org.tron.core.exception.ContractExeException; +import org.tron.core.exception.ContractValidateException; import org.tron.core.services.http.JsonFormat; import org.tron.core.services.http.JsonFormat.ParseException; @@ -337,6 +338,48 @@ public void testCreateShieldedContractParameters() throws ContractExeException { } } + @Test + public void testCreateShieldedContractParameters2() throws ContractExeException { + librustzcashInitZksnarkParams(); + Args.getInstance().setFullNodeAllowShieldedTransactionArgs(true); + Wallet wallet1 = spy(new Wallet()); + + doReturn(BigInteger.valueOf(1).toByteArray()) + .when(wallet1).getShieldedContractScalingFactor( + ByteArray.fromHexString("4144007979359ECAC395BBD3CEF8060D3DF2DC3F01")); + String parameter = new String(ByteArray.fromHexString( + "7b0a202020202261736b223a2263323531336539653330383439343933326264383265306365353336" + + "363264313734323164393062373261383437316130613132623835353261333336653032222c0a202" + + "02020226e736b223a2234633662663364643461303634336432306236323866376534353938306335" + + "653138376630376135316436663365383661616631616239313663303765623064222c0a202020202" + + "26f766b223a2231376135386439613530353864613665343263613132636432383964306136616131" + + "363962393236633138653139626361353138623864366638363734653433222c0a202020202266726" + + "f6d5f616d6f756e74223a22313030222c0a2020202022736869656c6465645f726563656976657322" + + "3a5b0a20202020202020207b0a202020202020202020202020226e6f7465223a7b0a2020202020202" + + "02020202020202020202276616c7565223a3130302c0a202020202020202020202020202020202270" + + "61796d656e745f61646472657373223a22222c0a202020202020202020202020202020202272636d2" + + "23a223136623666356534303434346162376565616231316165363631336332376633353131373937" + + "3165666138376237313536306235383133383239633933393064220a2020202020202020202020207" + + "d0a20202020202020207d0a202020205d2c0a2020202022736869656c6465645f54524332305f636f" + + "6e74726163745f61646472657373223a2234313434303037393739333539454341433339354242443" + + "3434546383036304433444632444333463031220a7d")); + PrivateShieldedTRC20Parameters.Builder builder = PrivateShieldedTRC20Parameters.newBuilder(); + try { + JsonFormat.merge(parameter, builder, false); + } catch (ParseException e) { + Assert.fail(); + } + + try { + wallet1.createShieldedContractParameters(builder.build()); + Assert.fail(); + } catch (Exception e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Payment Address in ReceiveNote should not be empty", + e.getMessage()); + } + } + @Test public void testCreateShieldedContractParametersWithoutAsk() throws ContractExeException { librustzcashInitZksnarkParams(); From 704720187336e69d2b9d3dbf14128fe46532bee8 Mon Sep 17 00:00:00 2001 From: chaozhu Date: Mon, 9 Dec 2024 20:14:59 +0800 Subject: [PATCH 016/107] upgrade mockito and optimize tests coverage --- build.gradle | 3 +- .../TransactionLogTriggerCapsuleMockTest.java | 127 ++ .../TransactionLogTriggerCapsuleTest.java | 69 + .../common/runtime/RuntimeImplMockTest.java | 54 + .../java/org/tron/core/WalletMockTest.java | 1330 +++++++++++++++++ .../org/tron/core/db/ManagerMockTest.java | 447 ++++++ .../net/peer/PeerStatusCheckMockTest.java | 28 + .../core/services/http/JsonFormatTest.java | 255 ++++ .../tron/core/services/http/UtilMockTest.java | 243 +++ 9 files changed, 2555 insertions(+), 1 deletion(-) create mode 100644 framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java create mode 100644 framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java create mode 100644 framework/src/test/java/org/tron/core/WalletMockTest.java create mode 100644 framework/src/test/java/org/tron/core/db/ManagerMockTest.java create mode 100644 framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java create mode 100644 framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java create mode 100644 framework/src/test/java/org/tron/core/services/http/UtilMockTest.java diff --git a/build.gradle b/build.gradle index b1aba1c0aa9..c74a31a3c8e 100644 --- a/build.gradle +++ b/build.gradle @@ -52,7 +52,8 @@ subprojects { testAnnotationProcessor 'org.projectlombok:lombok:1.18.12' testImplementation group: 'junit', name: 'junit', version: '4.13.2' - testImplementation "org.mockito:mockito-core:2.13.0" + testImplementation "org.mockito:mockito-core:4.11.0" + testImplementation "org.mockito:mockito-inline:4.11.0" } task sourcesJar(type: Jar, dependsOn: classes) { diff --git a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java new file mode 100644 index 00000000000..65c485b22d9 --- /dev/null +++ b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java @@ -0,0 +1,127 @@ +package org.tron.common.logsfilter; + + +import com.google.protobuf.ByteString; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; +import org.tron.common.logsfilter.trigger.InternalTransactionPojo; +import org.tron.common.runtime.InternalTransaction; +import org.tron.common.runtime.ProgramResult; +import org.tron.common.runtime.RuntimeImpl; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.ReceiptCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.db.TransactionTrace; +import org.tron.p2p.utils.ByteArray; +import org.tron.protos.Protocol; +import org.tron.protos.contract.BalanceContract; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + + +public class TransactionLogTriggerCapsuleMockTest { + + private static final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; + private static final String RECEIVER_ADDRESS = "41abd4b9367799eaa3197fecb144eb71de1e049150"; + private static final String CONTRACT_ADDRESS = "A0B4750E2CD76E19DCA331BF5D089B71C3C2798548"; + + private TransactionCapsule transactionCapsule; + private BlockCapsule blockCapsule; + + @Before + public void setup() { + blockCapsule = new BlockCapsule(1, + Sha256Hash.ZERO_HASH, + System.currentTimeMillis(), + Sha256Hash.ZERO_HASH.getByteString() + ); + } + + @After + public void clearMocks() { + + } + + + @Test + public void testConstructorWithTransactionTrace() { + BalanceContract.TransferContract.Builder builder2 = + BalanceContract.TransferContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + transactionCapsule = spy(new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TransferContract)); + + TransactionTrace trace = mock(TransactionTrace.class); + ReceiptCapsule receiptCapsule = new ReceiptCapsule(Sha256Hash.ZERO_HASH); + RuntimeImpl runtime = mock(RuntimeImpl.class); + List logs = new ArrayList<>(); + logs.add(Protocol.TransactionInfo.Log.newBuilder() + .setAddress(ByteString.copyFrom("address".getBytes())) + .setData(ByteString.copyFrom("data".getBytes())) + .addTopics(ByteString.copyFrom("topic".getBytes())) + .build()); + + Protocol.TransactionInfo.Builder builder = Protocol.TransactionInfo.newBuilder() + .addAllLog(logs); + + ProgramResult programResult = ProgramResult.createEmpty(); + programResult.setHReturn("hreturn".getBytes()); + programResult.setContractAddress(CONTRACT_ADDRESS.getBytes()); + + when(transactionCapsule.getTrxTrace()).thenReturn(trace); + when(trace.getReceipt()).thenReturn(receiptCapsule); + when(trace.getRuntime()).thenReturn(runtime); + when(runtime.getResult()).thenReturn(programResult); + + transactionCapsule.setTrxTrace(trace); + + TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule( + transactionCapsule, blockCapsule,0,0,0, + builder.build(),0); + + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger()); + } + + @Test + public void testGetInternalTransactionList() throws Exception { + BalanceContract.TransferContract.Builder builder2 = + BalanceContract.TransferContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TransferContract); + InternalTransaction internalTransaction = new InternalTransaction( + "parentHash".getBytes(), 10, 0, + "sendAddress".getBytes(), + "transferToAddress".getBytes(), + 100L, "data".getBytes(), "note", + 0L, new HashMap<>() + ); + List internalTransactionList = new ArrayList<>(); + internalTransactionList.add(internalTransaction); + TransactionLogTriggerCapsule triggerCapsule = + new TransactionLogTriggerCapsule(transactionCapsule, blockCapsule); + + Method privateMethod = TransactionLogTriggerCapsule.class.getDeclaredMethod( + "getInternalTransactionList", List.class); + privateMethod.setAccessible(true); + List pojoList = (List) + privateMethod.invoke(triggerCapsule, internalTransactionList); + + Assert.assertNotNull(pojoList); + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java index 76dd6e99158..a2487ac470b 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java @@ -13,13 +13,16 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.p2p.utils.ByteArray; import org.tron.protos.Protocol; +import org.tron.protos.contract.AssetIssueContractOuterClass; import org.tron.protos.contract.BalanceContract; import org.tron.protos.contract.Common; +import org.tron.protos.contract.SmartContractOuterClass; public class TransactionLogTriggerCapsuleTest { private static final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; private static final String RECEIVER_ADDRESS = "41abd4b9367799eaa3197fecb144eb71de1e049150"; + private static final String CONTRACT_ADDRESS = "A0B4750E2CD76E19DCA331BF5D089B71C3C2798548"; public TransactionCapsule transactionCapsule; public BlockCapsule blockCapsule; @@ -175,4 +178,70 @@ public void testConstructorWithCancelAllUnfreezeTrxCapsule() { triggerCapsule.getTransactionLogTrigger().getExtMap().get(BANDWIDTH.name()).longValue()); } + + @Test + public void testConstructorWithTransferCapsule() { + BalanceContract.TransferContract.Builder builder2 = + BalanceContract.TransferContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TransferContract); + + TransactionLogTriggerCapsule triggerCapsule = + new TransactionLogTriggerCapsule(transactionCapsule, blockCapsule); + + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress()); + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getToAddress()); + } + + @Test + public void testConstructorWithTransferAssetCapsule() { + AssetIssueContractOuterClass.TransferAssetContract.Builder builder2 = + AssetIssueContractOuterClass.TransferAssetContract.newBuilder() + .setAssetName(ByteString.copyFrom("AssetName".getBytes())) + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TransferAssetContract); + + TransactionLogTriggerCapsule triggerCapsule = + new TransactionLogTriggerCapsule(transactionCapsule, blockCapsule); + + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress()); + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getToAddress()); + } + + @Test + public void testConstructorWithTriggerSmartContract() { + SmartContractOuterClass.TriggerSmartContract.Builder builder2 = + SmartContractOuterClass.TriggerSmartContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS))); + transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TriggerSmartContract); + + TransactionLogTriggerCapsule triggerCapsule = + new TransactionLogTriggerCapsule(transactionCapsule, blockCapsule); + + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress()); + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getToAddress()); + } + + @Test + public void testConstructorWithCreateSmartContract() { + SmartContractOuterClass.CreateSmartContract.Builder builder2 = + SmartContractOuterClass.CreateSmartContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))); + transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.CreateSmartContract); + + TransactionLogTriggerCapsule triggerCapsule = + new TransactionLogTriggerCapsule(transactionCapsule, blockCapsule); + + Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress()); + } + + + } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java new file mode 100644 index 00000000000..b9381df8460 --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java @@ -0,0 +1,54 @@ +package org.tron.common.runtime; + +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.tron.core.vm.program.Program; + +import java.lang.reflect.Method; + +@Slf4j +public class RuntimeImplMockTest { + @After + public void clearMocks() { + + } + + @Test + public void testSetResultCode1() throws Exception { + RuntimeImpl runtime = new RuntimeImpl(); + ProgramResult programResult = new ProgramResult(); + Method privateMethod = RuntimeImpl.class.getDeclaredMethod( + "setResultCode", ProgramResult.class); + privateMethod.setAccessible(true); + + Program.BadJumpDestinationException badJumpDestinationException + = new Program.BadJumpDestinationException("Operation with pc isn't 'JUMPDEST': PC[%d];", 0); + programResult.setException(badJumpDestinationException); + privateMethod.invoke(runtime, programResult); + + Program.OutOfTimeException outOfTimeException + = new Program.OutOfTimeException("CPU timeout for 0x0a executing"); + programResult.setException(outOfTimeException); + privateMethod.invoke(runtime, programResult); + + Program.PrecompiledContractException precompiledContractException + = new Program.PrecompiledContractException("precompiled contract exception"); + programResult.setException(precompiledContractException); + privateMethod.invoke(runtime, programResult); + + Program.StackTooSmallException stackTooSmallException + = new Program.StackTooSmallException("Expected stack size %d but actual %d;", 100, 10); + programResult.setException(stackTooSmallException); + privateMethod.invoke(runtime, programResult); + + Program.JVMStackOverFlowException jvmStackOverFlowException + = new Program.JVMStackOverFlowException(); + programResult.setException(jvmStackOverFlowException); + privateMethod.invoke(runtime, programResult); + + Assert.assertTrue(true); + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/WalletMockTest.java b/framework/src/test/java/org/tron/core/WalletMockTest.java new file mode 100644 index 00000000000..9dc0323f8fc --- /dev/null +++ b/framework/src/test/java/org/tron/core/WalletMockTest.java @@ -0,0 +1,1330 @@ +package org.tron.core; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.protobuf.Any; +import com.google.protobuf.ByteString; +import com.google.protobuf.LazyStringArrayList; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.google.protobuf.ProtocolStringList; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.MockedConstruction; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.tron.api.GrpcAPI; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.Sha256Hash; +import org.tron.common.utils.client.WalletClient; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.capsule.ContractStateCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.core.db.TransactionStore; +import org.tron.core.exception.AccountResourceInsufficientException; +import org.tron.core.exception.BadItemException; +import org.tron.core.exception.ContractExeException; +import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.DupTransactionException; +import org.tron.core.exception.HeaderNotFound; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.TaposException; +import org.tron.core.exception.TooBigTransactionException; +import org.tron.core.exception.TronException; +import org.tron.core.exception.VMIllegalException; +import org.tron.core.exception.ValidateSignatureException; +import org.tron.core.exception.ZksnarkException; +import org.tron.core.net.TronNetDelegate; +import org.tron.core.net.message.adv.TransactionMessage; +import org.tron.core.net.peer.PeerConnection; +import org.tron.core.store.AbiStore; +import org.tron.core.store.AccountStore; +import org.tron.core.store.CodeStore; +import org.tron.core.store.ContractStateStore; +import org.tron.core.store.ContractStore; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.core.store.TransactionHistoryStore; +import org.tron.core.store.TransactionRetStore; +import org.tron.core.zen.ShieldedTRC20ParametersBuilder; +import org.tron.core.zen.address.DiversifierT; +import org.tron.core.zen.address.ExpandedSpendingKey; +import org.tron.core.zen.address.KeyIo; +import org.tron.core.zen.address.PaymentAddress; +import org.tron.protos.Protocol; +import org.tron.protos.contract.BalanceContract; +import org.tron.protos.contract.ShieldContract; +import org.tron.protos.contract.SmartContractOuterClass; + + +public class WalletMockTest { + + @Before + public void init() { + CommonParameter.PARAMETER.setMinEffectiveConnection(0); + } + + @After + public void clearMocks() { + Mockito.clearAllCaches(); + } + + @Test + public void testSetTransactionNullException() throws Exception { + Wallet wallet = new Wallet(); + TransactionCapsule transactionCapsuleMock + = mock(TransactionCapsule.class); + + Method privateMethod = Wallet.class.getDeclaredMethod( + "setTransaction", TransactionCapsule.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, transactionCapsuleMock); + + assertTrue(true); + } + + @Test + public void testCreateTransactionCapsuleWithoutValidateWithTimeoutNullException() + throws Exception { + Wallet wallet = new Wallet(); + com.google.protobuf.Message message = + mock(com.google.protobuf.Message.class); + Protocol.Transaction.Contract.ContractType contractType = + mock(Protocol.Transaction.Contract.ContractType.class); + long timeout = 100L; + + try (MockedConstruction mocked = mockConstruction(TransactionCapsule.class, + (mock, context) -> { + when(mock.getInstance()).thenReturn(Protocol.Transaction.newBuilder().build()); + })) { + Method privateMethod = Wallet.class.getDeclaredMethod( + "createTransactionCapsuleWithoutValidateWithTimeout", + com.google.protobuf.Message.class, + Protocol.Transaction.Contract.ContractType.class, + long.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, message, contractType, timeout); + assertTrue(true); + } + } + + @Test + public void testCreateTransactionCapsuleWithoutValidateWithTimeout() + throws Exception { + Wallet wallet = new Wallet(); + com.google.protobuf.Message message = + mock(com.google.protobuf.Message.class); + Protocol.Transaction.Contract.ContractType contractType = + mock(Protocol.Transaction.Contract.ContractType.class); + long timeout = 100L; + BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(); + + try (MockedConstruction mocked = mockConstruction(TransactionCapsule.class, + (mock, context) -> { + when(mock.getInstance()).thenReturn(Protocol.Transaction.newBuilder().build()); + })) { + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + when(chainBaseManagerMock.getHeadBlockId()).thenReturn(blockId); + + Method privateMethod = Wallet.class.getDeclaredMethod( + "createTransactionCapsuleWithoutValidateWithTimeout", + com.google.protobuf.Message.class, + Protocol.Transaction.Contract.ContractType.class, + long.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, message, contractType, timeout); + + assertTrue(true); + } + } + + + @Test + public void testBroadcastTransactionBlockUnsolidified() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(true); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.BLOCK_UNSOLIDIFIED, ret.getCode()); + } + + @Test + public void testBroadcastTransactionNoConnection() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + List peerConnections = new ArrayList<>(); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("minEffectiveConnection"); + field2.setAccessible(true); + field2.set(wallet, 10); + + when(tronNetDelegateMock.getActivePeer()).thenReturn(peerConnections); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.NO_CONNECTION, ret.getCode()); + } + + @Test + public void testBroadcastTransactionConnectionNotEnough() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + List peerConnections = new ArrayList<>(); + PeerConnection p1 = new PeerConnection(); + PeerConnection p2 = new PeerConnection(); + peerConnections.add(p1); + peerConnections.add(p2); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("minEffectiveConnection"); + field2.setAccessible(true); + field2.set(wallet, 10); + when(tronNetDelegateMock.getActivePeer()).thenReturn(peerConnections); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION, + ret.getCode()); + } + + @Test + public void testBroadcastTransactionTooManyPending() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + Manager managerMock = mock(Manager.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + when(managerMock.isTooManyPending()).thenReturn(true); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("dbManager"); + field2.setAccessible(true); + field2.set(wallet, managerMock); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.SERVER_BUSY, ret.getCode()); + } + + @Test + public void testBroadcastTransactionAlreadyExists() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + TransactionCapsule trx = new TransactionCapsule(transaction); + trx.setTime(System.currentTimeMillis()); + Sha256Hash txID = trx.getTransactionId(); + + Cache transactionIdCache = CacheBuilder + .newBuilder().maximumSize(10) + .expireAfterWrite(1, TimeUnit.HOURS).recordStats().build(); + transactionIdCache.put(txID, true); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + Manager managerMock = mock(Manager.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + when(managerMock.isTooManyPending()).thenReturn(false); + when(managerMock.getTransactionIdCache()).thenReturn(transactionIdCache); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("dbManager"); + field2.setAccessible(true); + field2.set(wallet, managerMock); + + Field field3 = wallet.getClass().getDeclaredField("trxCacheEnable"); + field3.setAccessible(true); + field3.set(wallet, true); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.DUP_TRANSACTION_ERROR, + ret.getCode()); + } + + + @Test + public void testBroadcastTransactionNoContract() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + Manager managerMock = mock(Manager.class); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock + = mock(DynamicPropertiesStore.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + when(managerMock.isTooManyPending()).thenReturn(false); + when(chainBaseManagerMock.getDynamicPropertiesStore()) + .thenReturn(dynamicPropertiesStoreMock); + when(dynamicPropertiesStoreMock.supportVM()).thenReturn(false); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("dbManager"); + field2.setAccessible(true); + field2.set(wallet, managerMock); + + Field field4 = wallet.getClass().getDeclaredField("chainBaseManager"); + field4.setAccessible(true); + field4.set(wallet, chainBaseManagerMock); + + Field field3 = wallet.getClass().getDeclaredField("trxCacheEnable"); + field3.setAccessible(true); + field3.set(wallet, false); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.CONTRACT_VALIDATE_ERROR, + ret.getCode()); + } + + @Test + public void testBroadcastTransactionOtherException() throws Exception { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + Manager managerMock = mock(Manager.class); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock + = mock(DynamicPropertiesStore.class); + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + when(managerMock.isTooManyPending()).thenReturn(false); + when(chainBaseManagerMock.getDynamicPropertiesStore()) + .thenReturn(dynamicPropertiesStoreMock); + when(dynamicPropertiesStoreMock.supportVM()).thenReturn(false); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("dbManager"); + field2.setAccessible(true); + field2.set(wallet, managerMock); + + Field field4 = wallet.getClass().getDeclaredField("chainBaseManager"); + field4.setAccessible(true); + field4.set(wallet, chainBaseManagerMock); + + Field field3 = wallet.getClass().getDeclaredField("trxCacheEnable"); + field3.setAccessible(true); + field3.set(wallet, false); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + + assertEquals(GrpcAPI.Return.response_code.OTHER_ERROR, ret.getCode()); + } + + private Protocol.Transaction getExampleTrans() { + BalanceContract.TransferContract transferContract = + BalanceContract.TransferContract.newBuilder() + .setAmount(10) + .setOwnerAddress(ByteString.copyFromUtf8("aaa")) + .setToAddress(ByteString.copyFromUtf8("bbb")) + .build(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6666; i++) { + sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + } + return Protocol.Transaction.newBuilder().setRawData( + Protocol.Transaction.raw.newBuilder() + .setData(ByteString.copyFrom(sb.toString().getBytes(StandardCharsets.UTF_8))) + .addContract( + Protocol.Transaction.Contract.newBuilder() + .setParameter(Any.pack(transferContract)) + .setType(Protocol.Transaction.Contract.ContractType.TransferContract))) + .build(); + } + + private void mockEnv(Wallet wallet, TronException tronException) throws Exception { + TronNetDelegate tronNetDelegateMock = mock(TronNetDelegate.class); + Manager managerMock = mock(Manager.class); + ChainBaseManager chainBaseManagerMock + = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock + = mock(DynamicPropertiesStore.class); + + when(tronNetDelegateMock.isBlockUnsolidified()).thenReturn(false); + when(managerMock.isTooManyPending()).thenReturn(false); + when(chainBaseManagerMock.getDynamicPropertiesStore()) + .thenReturn(dynamicPropertiesStoreMock); + when(dynamicPropertiesStoreMock.supportVM()).thenReturn(false); + + doThrow(tronException).when(managerMock).pushTransaction(any()); + + Field field = wallet.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(wallet, tronNetDelegateMock); + + Field field2 = wallet.getClass().getDeclaredField("dbManager"); + field2.setAccessible(true); + field2.set(wallet, managerMock); + + Field field4 = wallet.getClass().getDeclaredField("chainBaseManager"); + field4.setAccessible(true); + field4.set(wallet, chainBaseManagerMock); + + Field field3 = wallet.getClass().getDeclaredField("trxCacheEnable"); + field3.setAccessible(true); + field3.set(wallet, false); + } + + @Test + public void testBroadcastTransactionValidateSignatureException() throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new ValidateSignatureException()); + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.SIGERROR, ret.getCode()); + } + + } + + @Test + public void testBroadcastTransactionValidateContractExeException() throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new ContractExeException()); + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.CONTRACT_EXE_ERROR, ret.getCode()); + } + + } + + @Test + public void testBroadcastTransactionValidateAccountResourceInsufficientException() + throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new AccountResourceInsufficientException("")); + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.BANDWITH_ERROR, ret.getCode()); + } + + } + + @Test + public void testBroadcastTransactionValidateDupTransactionException() + throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new DupTransactionException("")); + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.DUP_TRANSACTION_ERROR, ret.getCode()); + } + + } + + @Test + public void testBroadcastTransactionValidateTaposException() throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new TaposException("")); + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.TAPOS_ERROR, ret.getCode()); + } + + } + + @Test + public void testBroadcastTransactionValidateTooBigTransactionException() + throws Exception { + try (MockedConstruction mocked = mockConstruction(TransactionMessage.class, + (mock, context) -> { + + })) { + Wallet wallet = new Wallet(); + Protocol.Transaction transaction = getExampleTrans(); + mockEnv(wallet, new TooBigTransactionException("")); + + GrpcAPI.Return ret = wallet.broadcastTransaction(transaction); + assertEquals(GrpcAPI.Return.response_code.TOO_BIG_TRANSACTION_ERROR, ret.getCode()); + } + + } + + @Test + public void testGetBlockByNum() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + doThrow(new ItemNotFoundException()).when(chainBaseManagerMock).getBlockByNum(anyLong()); + + Protocol.Block block = wallet.getBlockByNum(0L); + assertNull(block); + } + + @Test + public void testGetBlockCapsuleByNum() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + doThrow(new ItemNotFoundException()).when(chainBaseManagerMock).getBlockByNum(anyLong()); + + BlockCapsule blockCapsule = wallet.getBlockCapsuleByNum(0L); + assertNull(blockCapsule); + } + + @Test + public void testGetTransactionCountByBlockNum() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + doThrow(new ItemNotFoundException()).when(chainBaseManagerMock).getBlockByNum(anyLong()); + + long count = wallet.getTransactionCountByBlockNum(0L); + assertEquals(count, 0L); + } + + @Test + public void testGetTransactionById() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = null; + Protocol.Transaction transaction = wallet.getTransactionById(transactionId); + assertNull(transaction); + } + + @Test + public void testGetTransactionById2() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + doThrow(new BadItemException()).when(transactionStoreMock).get(any()); + + Protocol.Transaction transaction = wallet.getTransactionById(transactionId); + assertNull(transaction); + } + + @Test + public void testGetTransactionById3() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + TransactionCapsule transactionCapsuleMock = mock(TransactionCapsule.class); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + when(transactionStoreMock.get(any())).thenReturn(transactionCapsuleMock); + when(transactionCapsuleMock.getInstance()).thenReturn(transaction); + + Protocol.Transaction transactionRet = wallet.getTransactionById(transactionId); + assertEquals(transaction, transactionRet); + } + + @Test + public void testGetTransactionCapsuleById() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = null; + TransactionCapsule transactionCapsule = wallet.getTransactionCapsuleById(transactionId); + assertNull(transactionCapsule); + } + + @Test + public void testGetTransactionCapsuleById1() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + doThrow(new BadItemException()).when(transactionStoreMock).get(any()); + + TransactionCapsule transactionCapsule = wallet.getTransactionCapsuleById(transactionId); + assertNull(transactionCapsule); + } + + @Test + public void testGetTransactionInfoById() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = null; + Protocol.TransactionInfo transactionInfo = wallet.getTransactionInfoById(transactionId); + assertNull(transactionInfo); + } + + @Test + public void testGetTransactionInfoById1() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionRetStore transactionRetStoreMock = mock(TransactionRetStore.class); + + when(chainBaseManagerMock.getTransactionRetStore()).thenReturn(transactionRetStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + doThrow(new BadItemException()).when(transactionRetStoreMock).getTransactionInfo(any()); + + Protocol.TransactionInfo transactionInfo = wallet.getTransactionInfoById(transactionId); + assertNull(transactionInfo); + } + + @Test + public void testGetTransactionInfoById2() throws Exception { + Wallet wallet = new Wallet(); + ByteString transactionId = ByteString.empty(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + TransactionRetStore transactionRetStoreMock = mock(TransactionRetStore.class); + TransactionHistoryStore transactionHistoryStoreMock = + mock(TransactionHistoryStore.class); + + when(chainBaseManagerMock.getTransactionRetStore()) + .thenReturn(transactionRetStoreMock); + when(chainBaseManagerMock.getTransactionHistoryStore()) + .thenReturn(transactionHistoryStoreMock); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + when(transactionRetStoreMock.getTransactionInfo(any())).thenReturn(null); + doThrow(new BadItemException()).when(transactionHistoryStoreMock).get(any()); + + Protocol.TransactionInfo transactionInfo = wallet.getTransactionInfoById(transactionId); + assertNull(transactionInfo); + } + + @Test + public void testGetProposalById() throws Exception { + Wallet wallet = new Wallet(); + ByteString proposalId = null; + Protocol.Proposal proposal = wallet.getProposalById(proposalId); + assertNull(proposal); + } + + @Test + public void testGetMemoFeePrices() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock = + mock(DynamicPropertiesStore.class); + + when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStoreMock); + doThrow(new IllegalArgumentException("not found MEMO_FEE_HISTORY")) + .when(dynamicPropertiesStoreMock).getMemoFeeHistory(); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + GrpcAPI.PricesResponseMessage responseMessage = wallet.getMemoFeePrices(); + assertNull(responseMessage); + } + + @Test + public void testGetEnergyFeeByTime() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock = + mock(DynamicPropertiesStore.class); + long now = System.currentTimeMillis(); + + when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStoreMock); + doThrow(new IllegalArgumentException("not found ENERGY_PRICE_HISTORY")) + .when(dynamicPropertiesStoreMock).getEnergyPriceHistory(); + when(dynamicPropertiesStoreMock.getEnergyFee()).thenReturn(10L); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + long energyFee = wallet.getEnergyFee(now); + assertEquals(energyFee, 10L); + } + + @Test + public void testGetEnergyPrices() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock = + mock(DynamicPropertiesStore.class); + + when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStoreMock); + doThrow(new IllegalArgumentException("not found ENERGY_PRICE_HISTORY")) + .when(dynamicPropertiesStoreMock).getEnergyPriceHistory(); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + GrpcAPI.PricesResponseMessage pricesResponseMessage = wallet.getEnergyPrices(); + assertNull(pricesResponseMessage); + } + + @Test + public void testGetBandwidthPrices() throws Exception { + Wallet wallet = new Wallet(); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + DynamicPropertiesStore dynamicPropertiesStoreMock = + mock(DynamicPropertiesStore.class); + + when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStoreMock); + doThrow(new IllegalArgumentException("not found BANDWIDTH_PRICE_HISTORY")) + .when(dynamicPropertiesStoreMock).getBandwidthPriceHistory(); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + + GrpcAPI.PricesResponseMessage pricesResponseMessage = wallet.getBandwidthPrices(); + assertNull(pricesResponseMessage); + } + + @Test + public void testCheckBlockIdentifier() { + Wallet wallet = new Wallet(); + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier = + BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() + .build(); + blockIdentifier = blockIdentifier.getDefaultInstanceForType(); + + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier1 = + blockIdentifier; + + assertThrows(IllegalArgumentException.class, () -> { + wallet.checkBlockIdentifier(blockIdentifier1); + }); + + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier2 = + BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() + .setNumber(-1L) + .build(); + + assertThrows(IllegalArgumentException.class, () -> { + wallet.checkBlockIdentifier(blockIdentifier2); + }); + + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier3 = + BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() + .setHash(ByteString.copyFrom("".getBytes(StandardCharsets.UTF_8))) + .build(); + + assertThrows(IllegalArgumentException.class, () -> { + wallet.checkBlockIdentifier(blockIdentifier3); + }); + } + + @Test + public void testCheckAccountIdentifier() { + Wallet wallet = new Wallet(); + BalanceContract.AccountIdentifier accountIdentifier = + BalanceContract.AccountIdentifier.newBuilder().build(); + accountIdentifier = accountIdentifier.getDefaultInstanceForType(); + + BalanceContract.AccountIdentifier accountIdentifier2 = accountIdentifier; + + assertThrows(IllegalArgumentException.class, () -> { + wallet.checkAccountIdentifier(accountIdentifier2); + }); + + BalanceContract.AccountIdentifier accountIdentifier1 + = BalanceContract.AccountIdentifier.newBuilder().build(); + + assertThrows(IllegalArgumentException.class, () -> { + wallet.checkAccountIdentifier(accountIdentifier1); + }); + } + + @Test + public void testGetTriggerInputForShieldedTRC20Contract() { + Wallet wallet = new Wallet(); + GrpcAPI.ShieldedTRC20TriggerContractParameters.Builder triggerParam = + GrpcAPI.ShieldedTRC20TriggerContractParameters + .newBuilder(); + GrpcAPI.ShieldedTRC20Parameters shieldedTRC20Parameters = + GrpcAPI.ShieldedTRC20Parameters.newBuilder().build(); + GrpcAPI.BytesMessage bytesMessage = + GrpcAPI.BytesMessage.newBuilder().build(); + + triggerParam.setShieldedTRC20Parameters(shieldedTRC20Parameters); + triggerParam.addSpendAuthoritySignature(bytesMessage); + + CommonParameter commonParameterMock = mock(Args.class); + try (MockedStatic mockedStatic = mockStatic(CommonParameter.class)) { + when(CommonParameter.getInstance()).thenReturn(commonParameterMock); + when(commonParameterMock.isFullNodeAllowShieldedTransactionArgs()).thenReturn(true); + + assertThrows(ZksnarkException.class, () -> { + wallet.getTriggerInputForShieldedTRC20Contract(triggerParam.build()); + }); + } + } + + @Test + public void testGetTriggerInputForShieldedTRC20Contract1() + throws ZksnarkException, ContractValidateException { + Wallet wallet = new Wallet(); + ShieldContract.SpendDescription spendDescription = + ShieldContract.SpendDescription.newBuilder().build(); + GrpcAPI.ShieldedTRC20TriggerContractParameters.Builder triggerParam = + GrpcAPI.ShieldedTRC20TriggerContractParameters + .newBuilder(); + GrpcAPI.ShieldedTRC20Parameters shieldedTRC20Parameters = + GrpcAPI.ShieldedTRC20Parameters.newBuilder() + .addSpendDescription(spendDescription) + .setParameterType("transfer") + .build(); + GrpcAPI.BytesMessage bytesMessage = + GrpcAPI.BytesMessage.newBuilder().build(); + + triggerParam.setShieldedTRC20Parameters(shieldedTRC20Parameters); + triggerParam.addSpendAuthoritySignature(bytesMessage); + + CommonParameter commonParameterMock = mock(Args.class); + try (MockedStatic mockedStatic = mockStatic(CommonParameter.class)) { + when(CommonParameter.getInstance()).thenReturn(commonParameterMock); + when(commonParameterMock.isFullNodeAllowShieldedTransactionArgs()).thenReturn(true); + + GrpcAPI.BytesMessage reponse = + wallet.getTriggerInputForShieldedTRC20Contract(triggerParam.build()); + assertNotNull(reponse); + } + + } + + @Test + public void testGetShieldedContractScalingFactorException() throws Exception { + Wallet walletMock = mock(Wallet.class); + byte[] contractAddress = "".getBytes(StandardCharsets.UTF_8); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + when(walletMock.createTransactionCapsule(any(), any())) + .thenReturn(new TransactionCapsule(transaction)); + + try { + when(walletMock.getShieldedContractScalingFactor(contractAddress)).thenCallRealMethod(); + } catch (Exception e) { + assertNotNull(e); + } + } + + @Test + public void testGetShieldedContractScalingFactorRuntimeException() + throws VMIllegalException, HeaderNotFound, ContractValidateException, ContractExeException { + Wallet walletMock = mock(Wallet.class); + byte[] contractAddress = "".getBytes(StandardCharsets.UTF_8); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + when(walletMock.triggerConstantContract(any(),any(),any(),any())).thenReturn(transaction); + when(walletMock.getShieldedContractScalingFactor(any())).thenCallRealMethod(); + + assertThrows(ContractExeException.class, () -> { + walletMock.getShieldedContractScalingFactor(contractAddress); + }); + } + + @Test + public void testGetShieldedContractScalingFactorSuccess() + throws Exception { + Wallet walletMock = mock(Wallet.class); + byte[] contractAddress = "".getBytes(StandardCharsets.UTF_8); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + when(walletMock.triggerConstantContract(any(),any(),any(),any())) + .thenReturn(transaction); + when(walletMock.createTransactionCapsule(any(), any())) + .thenReturn(new TransactionCapsule(transaction)); + when(walletMock.getShieldedContractScalingFactor(any())).thenCallRealMethod(); + try { + byte[] listBytes = walletMock.getShieldedContractScalingFactor(contractAddress); + assertNotNull(listBytes); + } catch (Exception e) { + assertNull(e); + } + } + + @Test + public void testGetShieldedContractScalingFactorContractExeException() + throws Exception { + Wallet walletMock = mock(Wallet.class); + byte[] contractAddress = "".getBytes(StandardCharsets.UTF_8); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + doThrow(new ContractExeException("")) + .when(walletMock).triggerConstantContract(any(),any(),any(),any()); + when(walletMock.createTransactionCapsule(any(), any())) + .thenReturn(new TransactionCapsule(transaction)); + when(walletMock.getShieldedContractScalingFactor(any())).thenCallRealMethod(); + + assertThrows(ContractExeException.class, () -> { + walletMock.getShieldedContractScalingFactor(contractAddress); + }); + } + + @Test + public void testCheckBigIntegerRange() { + Wallet wallet = new Wallet(); + + assertThrows( + Exception.class, + () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "checkBigIntegerRange", BigInteger.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, new BigInteger("-1")); + } + ); + } + + @Test + public void testCheckPublicAmount() throws ContractExeException { + Wallet walletMock = mock(Wallet.class); + + byte[] address = "".getBytes(StandardCharsets.UTF_8); + BigInteger fromAmount = new BigInteger("10"); + BigInteger toAmount = new BigInteger("10"); + doThrow(new ContractExeException("")).when(walletMock).getShieldedContractScalingFactor(any()); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "checkPublicAmount", + byte[].class, BigInteger.class, BigInteger.class); + privateMethod.setAccessible(true); + privateMethod.invoke(walletMock, address, fromAmount, toAmount); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ContractExeException); + } + + @Test + public void testCheckPublicAmount1() throws ContractExeException { + Wallet walletMock = mock(Wallet.class); + + byte[] address = "".getBytes(StandardCharsets.UTF_8); + BigInteger fromAmount = new BigInteger("300"); + BigInteger toAmount = new BigInteger("255"); + + byte[] scalingFactorBytes = ByteUtil.bigIntegerToBytes(new BigInteger("-1")); + + when(walletMock.getShieldedContractScalingFactor(any())).thenReturn(scalingFactorBytes); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "checkPublicAmount", + byte[].class, BigInteger.class, BigInteger.class); + privateMethod.setAccessible(true); + privateMethod.invoke(walletMock, address, fromAmount, toAmount); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ContractValidateException); + } + + @Test + public void testCheckPublicAmount2() throws ContractExeException { + Wallet walletMock = mock(Wallet.class); + + byte[] address = "".getBytes(StandardCharsets.UTF_8); + BigInteger fromAmount = new BigInteger("300"); + BigInteger toAmount = new BigInteger("255"); + + byte[] scalingFactorBytes = ByteUtil.bigIntegerToBytes(new BigInteger("-1")); + try (MockedStatic mockedStatic = mockStatic(ByteUtil.class)) { + when(ByteUtil.bytesToBigInteger(any())).thenReturn(new BigInteger("-1")); + when(walletMock.getShieldedContractScalingFactor(any())).thenReturn(scalingFactorBytes); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "checkPublicAmount", + byte[].class, BigInteger.class, BigInteger.class); + privateMethod.setAccessible(true); + privateMethod.invoke(walletMock, address, fromAmount, toAmount); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ContractValidateException); + } + + } + + @Test + public void testGetShieldedTRC20Nullifier() { + Wallet wallet = new Wallet(); + GrpcAPI.Note note = GrpcAPI.Note.newBuilder() + .setValue(100) + .setPaymentAddress("address") + .setRcm(ByteString.copyFrom("rcm".getBytes(StandardCharsets.UTF_8))) + .setMemo(ByteString.copyFrom("memo".getBytes(StandardCharsets.UTF_8))) + .build(); + long pos = 100L; + byte[] ak = "ak".getBytes(StandardCharsets.UTF_8); + byte[] nk = "nk".getBytes(StandardCharsets.UTF_8); + try (MockedStatic keyIoMockedStatic = mockStatic(KeyIo.class)) { + when(KeyIo.decodePaymentAddress(any())).thenReturn(null); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "getShieldedTRC20Nullifier", + GrpcAPI.Note.class, long.class, byte[].class, + byte[].class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + note, pos, ak, nk); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ZksnarkException); + } + } + + @Test + public void testGetShieldedTRC20LogType() { + Wallet wallet = new Wallet(); + Protocol.TransactionInfo.Log log = Protocol.TransactionInfo.Log.newBuilder().build(); + byte[] contractAddress = "contractAddress".getBytes(StandardCharsets.UTF_8); + LazyStringArrayList topicsList = new LazyStringArrayList(); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "getShieldedTRC20LogType", + Protocol.TransactionInfo.Log.class, + byte[].class, + ProtocolStringList.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + log, + contractAddress, + topicsList); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ZksnarkException); + } + + @Test + public void testGetShieldedTRC20LogType1() { + Wallet wallet = new Wallet(); + final String SHIELDED_CONTRACT_ADDRESS_STR = "TGAmX5AqVUoXCf8MoHxbuhQPmhGfWTnEgA"; + byte[] contractAddress = WalletClient.decodeFromBase58Check(SHIELDED_CONTRACT_ADDRESS_STR); + + byte[] addressWithoutPrefix = new byte[20]; + System.arraycopy(contractAddress, 1, addressWithoutPrefix, 0, 20); + Protocol.TransactionInfo.Log log = Protocol.TransactionInfo.Log.newBuilder() + .setAddress(ByteString.copyFrom(addressWithoutPrefix)) + .build(); + + LazyStringArrayList topicsList = new LazyStringArrayList(); + try { + Method privateMethod = Wallet.class.getDeclaredMethod( + "getShieldedTRC20LogType", + Protocol.TransactionInfo.Log.class, + byte[].class, + ProtocolStringList.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + log, + contractAddress, + topicsList); + } catch (Exception e) { + assertTrue(false); + } + assertTrue(true); + } + + + @Test + public void testGetShieldedTRC20LogType2() { + Wallet wallet = new Wallet(); + final String SHIELDED_CONTRACT_ADDRESS_STR = "TGAmX5AqVUoXCf8MoHxbuhQPmhGfWTnEgA"; + byte[] contractAddress = WalletClient.decodeFromBase58Check(SHIELDED_CONTRACT_ADDRESS_STR); + + byte[] addressWithoutPrefix = new byte[20]; + System.arraycopy(contractAddress, 1, addressWithoutPrefix, 0, 20); + Protocol.TransactionInfo.Log log = Protocol.TransactionInfo.Log.newBuilder() + .setAddress(ByteString.copyFrom(addressWithoutPrefix)) + .addTopics(ByteString.copyFrom("topic".getBytes())) + .build(); + + LazyStringArrayList topicsList = new LazyStringArrayList(); + topicsList.add("topic"); + try { + Method privateMethod = Wallet.class.getDeclaredMethod( + "getShieldedTRC20LogType", + Protocol.TransactionInfo.Log.class, + byte[].class, + ProtocolStringList.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + log, + contractAddress, + topicsList); + } catch (Exception e) { + assertTrue(false); + } + assertTrue(true); + } + + @Test + public void testBuildShieldedTRC20InputWithAK() throws ZksnarkException { + Wallet wallet = new Wallet(); + ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder("transfer"); + GrpcAPI.Note note = GrpcAPI.Note.newBuilder() + .setValue(100) + .setPaymentAddress("address") + .setRcm(ByteString.copyFrom("rcm".getBytes(StandardCharsets.UTF_8))) + .setMemo(ByteString.copyFrom("memo".getBytes(StandardCharsets.UTF_8))) + .build(); + GrpcAPI.SpendNoteTRC20 spendNote = GrpcAPI.SpendNoteTRC20.newBuilder() + .setNote(note) + .setAlpha(ByteString.copyFrom("alpha".getBytes())) + .setRoot(ByteString.copyFrom("root".getBytes())) + .setPath(ByteString.copyFrom("path".getBytes())) + .setPos(0L) + .build(); + byte[] ak = "ak".getBytes(StandardCharsets.UTF_8); + byte[] nk = "nk".getBytes(StandardCharsets.UTF_8); + + try (MockedStatic keyIoMockedStatic = mockStatic(KeyIo.class)) { + when(KeyIo.decodePaymentAddress(any())).thenReturn(null); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Wallet.class.getDeclaredMethod( + "buildShieldedTRC20InputWithAK", + ShieldedTRC20ParametersBuilder.class, + GrpcAPI.SpendNoteTRC20.class, + byte[].class, byte[].class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + builder, + spendNote, + ak, nk); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ZksnarkException); + } + + } + + @Test + public void testBuildShieldedTRC20InputWithAK1() throws Exception { + Wallet wallet = new Wallet(); + ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder("transfer"); + GrpcAPI.Note note = GrpcAPI.Note.newBuilder() + .setValue(100) + .setPaymentAddress("address") + .setRcm(ByteString.copyFrom("rcm".getBytes(StandardCharsets.UTF_8))) + .setMemo(ByteString.copyFrom("memo".getBytes(StandardCharsets.UTF_8))) + .build(); + GrpcAPI.SpendNoteTRC20 spendNote = GrpcAPI.SpendNoteTRC20.newBuilder() + .setNote(note) + .setAlpha(ByteString.copyFrom("alpha".getBytes())) + .setRoot(ByteString.copyFrom("root".getBytes())) + .setPath(ByteString.copyFrom("path".getBytes())) + .setPos(0L) + .build(); + byte[] ak = "ak".getBytes(StandardCharsets.UTF_8); + byte[] nk = "nk".getBytes(StandardCharsets.UTF_8); + PaymentAddress paymentAddress = mock(PaymentAddress.class); + DiversifierT diversifierT = mock(DiversifierT.class); + + try (MockedStatic keyIoMockedStatic = mockStatic(KeyIo.class)) { + when(KeyIo.decodePaymentAddress(any())).thenReturn(paymentAddress); + when(paymentAddress.getD()).thenReturn(diversifierT); + when(paymentAddress.getPkD()).thenReturn("pkd".getBytes()); + + Method privateMethod = Wallet.class.getDeclaredMethod( + "buildShieldedTRC20InputWithAK", + ShieldedTRC20ParametersBuilder.class, + GrpcAPI.SpendNoteTRC20.class, + byte[].class, byte[].class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + builder, + spendNote, + ak, nk); + assertTrue(true); + } + + } + + @Test + public void testBuildShieldedTRC20Input() throws Exception { + Wallet wallet = new Wallet(); + ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder("transfer"); + GrpcAPI.Note note = GrpcAPI.Note.newBuilder() + .setValue(100) + .setPaymentAddress("address") + .setRcm(ByteString.copyFrom("rcm".getBytes(StandardCharsets.UTF_8))) + .setMemo(ByteString.copyFrom("memo".getBytes(StandardCharsets.UTF_8))) + .build(); + GrpcAPI.SpendNoteTRC20 spendNote = GrpcAPI.SpendNoteTRC20.newBuilder() + .setNote(note) + .setAlpha(ByteString.copyFrom("alpha".getBytes())) + .setRoot(ByteString.copyFrom("root".getBytes())) + .setPath(ByteString.copyFrom("path".getBytes())) + .setPos(0L) + .build(); + ExpandedSpendingKey expandedSpendingKey = mock(ExpandedSpendingKey.class); + PaymentAddress paymentAddress = mock(PaymentAddress.class); + DiversifierT diversifierT = mock(DiversifierT.class); + + try (MockedStatic keyIoMockedStatic = mockStatic(KeyIo.class)) { + when(KeyIo.decodePaymentAddress(any())).thenReturn(paymentAddress); + when(paymentAddress.getD()).thenReturn(diversifierT); + when(paymentAddress.getPkD()).thenReturn("pkd".getBytes()); + Method privateMethod = Wallet.class.getDeclaredMethod( + "buildShieldedTRC20Input", + ShieldedTRC20ParametersBuilder.class, + GrpcAPI.SpendNoteTRC20.class, + ExpandedSpendingKey.class); + privateMethod.setAccessible(true); + privateMethod.invoke(wallet, + builder, + spendNote, + expandedSpendingKey); + } + } + + @Test + public void testGetContractInfo() throws Exception { + Wallet wallet = new Wallet(); + GrpcAPI.BytesMessage bytesMessage = GrpcAPI.BytesMessage.newBuilder() + .setValue(ByteString.copyFrom("test".getBytes())) + .build(); + + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + AccountStore accountStore = mock(AccountStore.class); + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + when(chainBaseManagerMock.getAccountStore()).thenReturn(accountStore); + when(accountStore.get(any())).thenReturn(null); + + SmartContractOuterClass.SmartContractDataWrapper smartContractDataWrapper = + wallet.getContractInfo(bytesMessage); + assertNull(smartContractDataWrapper); + } + + @Test + public void testGetContractInfo1() throws Exception { + Wallet wallet = new Wallet(); + GrpcAPI.BytesMessage bytesMessage = GrpcAPI.BytesMessage.newBuilder() + .setValue(ByteString.copyFrom("test".getBytes())) + .build(); + + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + AccountStore accountStore = mock(AccountStore.class); + ContractStore contractStore = mock(ContractStore.class); + AbiStore abiStore = mock(AbiStore.class); + CodeStore codeStore = mock(CodeStore.class); + ContractStateStore contractStateStore = mock(ContractStateStore.class); + DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class); + + AccountCapsule accountCapsule = mock(AccountCapsule.class); + ContractCapsule contractCapsule = mock(ContractCapsule.class); + ContractStateCapsule contractStateCapsule = new ContractStateCapsule(10L); + + Field field = wallet.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(wallet, chainBaseManagerMock); + when(chainBaseManagerMock.getAccountStore()).thenReturn(accountStore); + when(chainBaseManagerMock.getContractStore()).thenReturn(contractStore); + when(chainBaseManagerMock.getAbiStore()).thenReturn(abiStore); + when(chainBaseManagerMock.getCodeStore()).thenReturn(codeStore); + when(chainBaseManagerMock.getContractStateStore()).thenReturn(contractStateStore); + when(chainBaseManagerMock.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore); + + when(accountStore.get(any())).thenReturn(accountCapsule); + when(contractStore.get(any())).thenReturn(contractCapsule); + when(contractCapsule.generateWrapper()) + .thenReturn(SmartContractOuterClass.SmartContractDataWrapper.newBuilder().build()); + when(abiStore.get(any())).thenReturn(null); + when(codeStore.get(any())).thenReturn(null); + when(contractStateStore.get(any())).thenReturn(contractStateCapsule); + when(dynamicPropertiesStore.getCurrentCycleNumber()).thenReturn(100L); + + SmartContractOuterClass.SmartContractDataWrapper smartContractDataWrapper = + wallet.getContractInfo(bytesMessage); + assertNotNull(smartContractDataWrapper); + } +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java new file mode 100644 index 00000000000..ff6e0dce3d8 --- /dev/null +++ b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java @@ -0,0 +1,447 @@ +package org.tron.core.db; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import com.google.protobuf.Any; +import com.google.protobuf.ByteString; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Test; +import org.mockito.MockedConstruction; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import org.quartz.CronExpression; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.runtime.ProgramResult; +import org.tron.common.runtime.RuntimeImpl; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.capsule.TransactionInfoCapsule; +import org.tron.core.capsule.utils.TransactionUtil; +import org.tron.core.config.args.Args; +import org.tron.core.exception.ContractSizeNotEqualToOneException; +import org.tron.core.exception.DupTransactionException; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.ReceiptCheckErrException; +import org.tron.core.exception.TaposException; +import org.tron.core.exception.TooBigTransactionException; +import org.tron.core.exception.TooBigTransactionResultException; +import org.tron.core.exception.TransactionExpirationException; +import org.tron.core.exception.ValidateSignatureException; +import org.tron.core.store.AccountStore; +import org.tron.core.store.BalanceTraceStore; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.protos.Protocol; +import org.tron.protos.contract.BalanceContract; + +@Slf4j +public class ManagerMockTest { + @After + public void clearMocks() { + Mockito.framework().clearInlineMocks(); + } + + @Test + public void processTransactionCostTimeMoreThan100() throws Exception { + TransactionTrace traceMock = mock(TransactionTrace.class); + BandwidthProcessor bandwidthProcessorMock = mock(BandwidthProcessor.class); + try (MockedConstruction mockedConstruction2 = mockConstruction(TransactionTrace.class,(mock, context) -> { + when(mock).thenReturn(traceMock); + }); + MockedConstruction mockedConstruction3 = mockConstruction(BandwidthProcessor.class,(mock, context) -> { + when(mock).thenReturn(bandwidthProcessorMock); + }); + MockedStatic mockedStatic = mockStatic(TransactionUtil.class)) { + Manager dbManager = mock(Manager.class); + BalanceContract.TransferContract transferContract = + BalanceContract.TransferContract.newBuilder() + .setAmount(10) + .setOwnerAddress(ByteString.copyFromUtf8("aaa")) + .setToAddress(ByteString.copyFromUtf8("bbb")) + .build(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6666; i++) { + sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + } + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().setRawData( + Protocol.Transaction.raw.newBuilder() + .setData(ByteString.copyFrom(sb.toString().getBytes(StandardCharsets.UTF_8))) + .addContract( + Protocol.Transaction.Contract.newBuilder() + .setParameter(Any.pack(transferContract)) + .setType(Protocol.Transaction.Contract.ContractType.TransferContract))) + .build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + ProgramResult result = new ProgramResult(); + result.setResultCode(Protocol.Transaction.Result.contractResult.SUCCESS); + + Sha256Hash transactionId = trxCap.getTransactionId(); + TransactionCapsule trxCapMock = mock(TransactionCapsule.class); + + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + BalanceTraceStore balanceTraceStoreMock = mock(BalanceTraceStore.class); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + TransactionInfoCapsule transactionInfoCapsuleMock = mock(TransactionInfoCapsule.class); + Protocol.TransactionInfo transactionInfo = Protocol.TransactionInfo.newBuilder().build(); + + Field field = dbManager.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(dbManager, chainBaseManagerMock); + + BlockCapsule blockCapMock = Mockito.mock(BlockCapsule.class); + + when(TransactionUtil + .buildTransactionInfoInstance(trxCapMock, blockCapMock, traceMock)) + .thenReturn(transactionInfoCapsuleMock); + + // this make cost > 100 cond is true + when(blockCapMock.isMerkleRootEmpty()).thenAnswer(new Answer() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + Thread.sleep(100); + return true; + } + }); + + when(chainBaseManagerMock.getBalanceTraceStore()).thenReturn(balanceTraceStoreMock); + when(chainBaseManagerMock.getAccountStore()).thenReturn(mock(AccountStore.class)); + when(chainBaseManagerMock.getDynamicPropertiesStore()) + .thenReturn(mock(DynamicPropertiesStore.class)); + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + when(trxCapMock.getTransactionId()).thenReturn(transactionId); + when(traceMock.getRuntimeResult()).thenReturn(result); + when(transactionInfoCapsuleMock.getId()).thenReturn(transactionId.getBytes()); + when(transactionInfoCapsuleMock.getInstance()).thenReturn(transactionInfo); + when(trxCapMock.getInstance()).thenReturn(trxCap.getInstance()); + when(trxCapMock.validatePubSignature( + Mockito.any(AccountStore.class), + Mockito.any(DynamicPropertiesStore.class))).thenReturn(true); + when(trxCapMock.validateSignature( + Mockito.any(AccountStore.class), + Mockito.any(DynamicPropertiesStore.class))).thenReturn(true); + + doNothing().when(dbManager).validateTapos(trxCapMock); + doNothing().when(dbManager).validateCommon(trxCapMock); + doNothing().when(dbManager).validateDup(trxCapMock); + + + doNothing().when(transactionStoreMock).put(transactionId.getBytes(), trxCapMock); + doNothing().when(bandwidthProcessorMock).consume(trxCapMock, traceMock); + doNothing().when(dbManager).consumeBandwidth(trxCapMock, traceMock); + doNothing().when(balanceTraceStoreMock).initCurrentTransactionBalanceTrace(trxCapMock); + doNothing().when(balanceTraceStoreMock).updateCurrentTransactionStatus(anyString()); + doNothing().when(balanceTraceStoreMock).resetCurrentTransactionTrace(); + + + assertNotNull( + when(dbManager.processTransaction(trxCapMock, blockCapMock)).thenCallRealMethod() + ); + } + } + + private void initMockEnv(Manager dbManager, long headNum, long headTime, + long exitHeight, long exitCount, String blockTime) + throws Exception { + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + Args argsMock = mock(Args.class); + + when(Args.getInstance()).thenReturn(argsMock); + + when(chainBaseManagerMock.getHeadBlockNum()).thenReturn(headNum); + when(chainBaseManagerMock.getHeadBlockTimeStamp()).thenReturn(headTime); + + when(argsMock.getShutdownBlockHeight()).thenReturn(exitHeight); + when(argsMock.getShutdownBlockCount()).thenReturn(exitCount); + when(argsMock.isP2pDisable()).thenReturn(false); + when(argsMock.getShutdownBlockTime()) + .thenReturn(new CronExpression(blockTime)); //"0 0 12 * * ?" + + Field field = dbManager.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(dbManager, chainBaseManagerMock); + } + + @Test + public void testInitAutoStop() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager, 100L, 12345L, + 10L, 0L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockHeight 10 is less than headNum 100", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + + } + + @Test + public void testInitAutoStop1() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager,10L, 12345L, + 100L, 0L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockCount 0 is less than 1", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + } + + @Test + public void testInitAutoStop2() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager,10L, 99726143865000L, + 100L, 1L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockTime 0 0 12 * * ? is illegal", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + + } + + @Test + public void testInitAutoStop3() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager,10L, 12345L, + 100L, 1L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockHeight 100 and shutDownBlockCount 1 set both", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + + } + + @Test + public void testInitAutoStop4() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager, 10L, 12345L, + 100L, -1L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockHeight 100 and shutDownBlockTime 0 0 12 * * ? set both", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + + } + + @Test + public void testInitAutoStop5() throws Exception { + Manager dbManager = spy(new Manager()); + try (MockedStatic methodTestMockedStatic + = mockStatic(CommonParameter.class)) { + initMockEnv(dbManager,10L, 12345L, + 0L, 1L, "0 0 12 * * ?"); + + assertThrows( + "shutDownBlockCount 1 and shutDownBlockTime 0 0 12 * * ? set both", + Exception.class, + () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "initAutoStop"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + } + ); + } + + } + + @Test + public void testProcessTransaction() throws Exception { + Manager dbManager = spy(new Manager()); + TransactionCapsule transactionCapsuleMock = null; + BlockCapsule blockCapsuleMock = mock(BlockCapsule.class); + + Method privateMethod = Manager.class.getDeclaredMethod( + "processTransaction", + TransactionCapsule.class, BlockCapsule.class); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager, transactionCapsuleMock, blockCapsuleMock); + + assertTrue(true); + } + + @Test + public void testProcessTransaction1() { + Manager dbManager = spy(new Manager()); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().setRawData( + Protocol.Transaction.raw.newBuilder() + .setData(ByteString.copyFrom("sb.toString()".getBytes(StandardCharsets.UTF_8)))) + .build(); + TransactionCapsule trxCap = new TransactionCapsule(transaction); + + BlockCapsule blockCapsuleMock = mock(BlockCapsule.class); + + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + Method privateMethod = Manager.class.getDeclaredMethod( + "processTransaction", + TransactionCapsule.class, BlockCapsule.class); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager, trxCap, blockCapsuleMock); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof ContractSizeNotEqualToOneException); + } + + @SneakyThrows + @Test + public void testRePush() { + Manager dbManager = spy(new Manager()); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + TransactionCapsule trx = new TransactionCapsule(transaction); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + Field field = dbManager.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(dbManager, chainBaseManagerMock); + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + when(transactionStoreMock.has(any())).thenReturn(true); + + dbManager.rePush(trx); + assertTrue(true); + } + + @SneakyThrows + @Test + public void testRePush1() { + Manager dbManager = spy(new Manager()); + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().build(); + TransactionCapsule trx = new TransactionCapsule(transaction); + TransactionStore transactionStoreMock = mock(TransactionStore.class); + + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + + Field field = dbManager.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(dbManager, chainBaseManagerMock); + + when(chainBaseManagerMock.getTransactionStore()).thenReturn(transactionStoreMock); + when(transactionStoreMock.has(any())).thenReturn(false); + + doThrow(new ValidateSignatureException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new DupTransactionException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new TaposException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new TooBigTransactionException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new TransactionExpirationException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new ReceiptCheckErrException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + + doThrow(new TooBigTransactionResultException()).when(dbManager).pushTransaction(any()); + dbManager.rePush(trx); + assertTrue(true); + } + + @Test + public void testPostSolidityFilter() throws Exception { + Manager dbManager = spy(new Manager()); + + Method privateMethod = Manager.class.getDeclaredMethod( + "postSolidityFilter", long.class, long.class); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager, 100L, 10L); + assertTrue(true); + } + + @Test + public void testReOrgLogsFilter() throws Exception { + Manager dbManager = spy(new Manager()); + CommonParameter commonParameterMock = mock(Args.class); + mockStatic(CommonParameter.class); + ChainBaseManager chainBaseManagerMock = mock(ChainBaseManager.class); + + when(CommonParameter.getInstance()).thenReturn(commonParameterMock); + when(commonParameterMock.isJsonRpcHttpFullNodeEnable()).thenReturn(true); + when(chainBaseManagerMock.getDynamicPropertiesStore()) + .thenReturn(mock(DynamicPropertiesStore.class)); + Field field = dbManager.getClass().getDeclaredField("chainBaseManager"); + field.setAccessible(true); + field.set(dbManager, chainBaseManagerMock); + doThrow(new ItemNotFoundException()).when(chainBaseManagerMock).getBlockById(any()); + + Method privateMethod = Manager.class.getDeclaredMethod("reOrgLogsFilter"); + privateMethod.setAccessible(true); + privateMethod.invoke(dbManager); + assertTrue(true); + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java new file mode 100644 index 00000000000..5e8c69fdd6a --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java @@ -0,0 +1,28 @@ +package org.tron.core.net.peer; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.spy; + +import org.junit.After; +import org.junit.Test; +import org.mockito.Mockito; + +public class PeerStatusCheckMockTest { + @After + public void clearMocks() { + Mockito.framework().clearInlineMocks(); + } + + @Test + public void testInitException() throws InterruptedException { + PeerStatusCheck peerStatusCheck = spy(new PeerStatusCheck()); + doThrow(new RuntimeException("test exception")).when(peerStatusCheck).statusCheck(); + peerStatusCheck.init(); + + // the initialDelay of scheduleWithFixedDelay is 5s + Thread.sleep(5000L); + assertTrue(true); + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java b/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java new file mode 100644 index 00000000000..a8525b0f526 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/JsonFormatTest.java @@ -0,0 +1,255 @@ +package org.tron.core.services.http; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import com.google.protobuf.ByteString; +import com.google.protobuf.UnknownFieldSet; + +import java.io.CharArrayReader; +import java.io.IOException; +import java.io.StringWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.junit.After; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.protos.Protocol; + +public class JsonFormatTest { + @After + public void clearMocks() { + Mockito.framework().clearInlineMocks(); + } + + @Test + public void testPrintErrorMsg() { + Exception ex = new Exception("test"); + String out = JsonFormat.printErrorMsg(ex); + assertEquals("{\"Error\":\"test\"}", out); + } + + @Test + public void testPrintWithHelloMessage() throws IOException { + Protocol.HelloMessage message = Protocol.HelloMessage.newBuilder() + .setAddress(ByteString.copyFrom("address".getBytes())) + .build(); + StringWriter output = new StringWriter(); + + JsonFormat.print(message, output, true); + assertNotNull(output.toString()); + } + + private UnknownFieldSet createValidUnknownFieldSet() { + UnknownFieldSet unknownFieldSet2 = UnknownFieldSet.newBuilder().build(); + UnknownFieldSet.Field unknownField1 = UnknownFieldSet.Field.newBuilder() + .addFixed32(123) + .addFixed64(12345L) + .addGroup(unknownFieldSet2) + .addLengthDelimited(ByteString.copyFrom("length".getBytes())) + .addVarint(12345678L) + .build(); + + return UnknownFieldSet.newBuilder() + .addField(1, unknownField1) + .build(); + } + + @Test + public void testPrintWithFields() throws IOException { + UnknownFieldSet unknownFieldSet = createValidUnknownFieldSet(); + StringWriter output = new StringWriter(); + JsonFormat.print(unknownFieldSet, output, true); + assertNotNull(output.toString()); + } + + @Test + public void testPrintToString() { + UnknownFieldSet unknownFieldSet = createValidUnknownFieldSet(); + String output = JsonFormat.printToString(unknownFieldSet, true); + assertNotNull(output); + } + + @Test + public void testUnsignedToString() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("unsignedToString", int.class); + privateMethod.setAccessible(true); + String out3 = (String)privateMethod.invoke(null, 100); + assertEquals("100", out3); + String out4 = (String)privateMethod.invoke(null, -100); + assertNotNull(out4); + } + + @Test + public void testToStringBuilderWithNonReadableInput() throws Exception { + String inputString = "Hello, World!"; + Readable input = new CharArrayReader(inputString.toCharArray()); + + Method privateMethod = JsonFormat.class.getDeclaredMethod("toStringBuilder", Readable.class); + privateMethod.setAccessible(true); + + StringBuilder out = (StringBuilder)privateMethod.invoke(null, input); + assertEquals(inputString, out.toString()); + } + + + @Test + public void testUnicodeEscaped() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("unicodeEscaped", char.class); + privateMethod.setAccessible(true); + + + char input1 = 0x09; + String out = (String)privateMethod.invoke(null, input1); + assertNotNull(out); + + char input2 = 0x99; + String out2 = (String)privateMethod.invoke(null, input2); + assertNotNull(out2); + + char input3 = 0x999; + String out3 = (String)privateMethod.invoke(null, input3); + assertNotNull(out3); + + char input4 = 0x1001; + String out4 = (String)privateMethod.invoke(null, input4); + assertNotNull(out4); + } + + @Test + public void testEscapeText() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("escapeText", String.class); + privateMethod.setAccessible(true); + + String input1 = "\b\f\n\r\t\\\"\\b\\f\\n\\r\\t\\\\\"test123"; + String out = (String)privateMethod.invoke(null, input1); + assertNotNull(out); + } + + @Test + public void testAppendEscapedUnicode() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("appendEscapedUnicode", + StringBuilder.class, char.class); + privateMethod.setAccessible(true); + + char input1 = 0x09; + StringBuilder out1 = new StringBuilder(); + + privateMethod.invoke(null, out1, input1); + assertNotNull(out1); + + char input2 = 0x99; + StringBuilder out2 = new StringBuilder(); + privateMethod.invoke(null, out2, input2); + assertNotNull(out2); + + char input3 = 0x999; + StringBuilder out3 = new StringBuilder(); + privateMethod.invoke(null, out3, input3); + assertNotNull(out3); + + char input4 = 0x1001; + StringBuilder out4 = new StringBuilder(); + privateMethod.invoke(null, out4, input4); + assertNotNull(out4); + } + + @Test + public void testUnescapeText() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("unescapeText", String.class); + privateMethod.setAccessible(true); + + String input = "\\u1234\\b\\f\\n\\r\\t\\\\\"test123";; + String out = (String)privateMethod.invoke(null, input); + assertNotNull(out); + } + + @Test + public void testDigitValue() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("digitValue", char.class); + privateMethod.setAccessible(true); + + char input = '1'; + int out = (int)privateMethod.invoke(null, input); + assertEquals(1, out); + + char input1 = 'b'; + int out1 = (int)privateMethod.invoke(null, input1); + assertEquals(11, out1); + + char input2 = 'B'; + int out2 = (int)privateMethod.invoke(null, input2); + assertEquals(11, out2); + } + + @Test + public void testParseUInt64() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("parseUInt64", String.class); + privateMethod.setAccessible(true); + + String input = "12312312312"; + long out = (long)privateMethod.invoke(null, input); + assertEquals(12312312312L, out); + + String input1 = "0x10"; + long out1 = (long)privateMethod.invoke(null, input1); + assertEquals(16L, out1); + + String input2 = "010"; + long out2 = (long)privateMethod.invoke(null, input2); + assertEquals(8L, out2); + + String input3 = "-12312312312"; + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null, input3); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + } + + @Test + public void testParseInteger() throws Exception { + Method privateMethod = JsonFormat.class.getDeclaredMethod("parseInteger", + String.class, boolean.class, boolean.class); + privateMethod.setAccessible(true); + + String input1 = "92233720368547758070"; + Throwable thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null,input1, true, true); + }); + Throwable cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + + String input5 = "92233720368547758070"; + thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null,input5, false, true); + }); + cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + + String input2 = "-92233720368547758"; + thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null,input2, false, true); + }); + cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + + String input3 = "92233720368547758070"; + thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null,input3, false, false); + }); + cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + + String input4 = "-92233720368547758070"; + thrown = assertThrows(InvocationTargetException.class, () -> { + privateMethod.invoke(null,input4, true, false); + }); + cause = thrown.getCause(); + assertTrue(cause instanceof NumberFormatException); + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java b/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java new file mode 100644 index 00000000000..221c5a7a165 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/UtilMockTest.java @@ -0,0 +1,243 @@ +package org.tron.core.services.http; + +import com.alibaba.fastjson.JSONObject; +import com.google.protobuf.ByteString; + +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.api.GrpcAPI; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.p2p.utils.ByteArray; +import org.tron.protos.Protocol; +import org.tron.protos.contract.BalanceContract; +import org.tron.protos.contract.SmartContractOuterClass; + +public class UtilMockTest { + @After + public void clearMocks() { + Mockito.framework().clearInlineMocks(); + } + + + @Test + public void testPrintTransactionFee() { + Protocol.ResourceReceipt resourceReceipt = Protocol.ResourceReceipt.newBuilder() + .build(); + Protocol.TransactionInfo result = Protocol.TransactionInfo.newBuilder() + .setReceipt(resourceReceipt) + .build(); + String transactionFee = JsonFormat.printToString(result, true); + String out = Util.printTransactionFee(transactionFee); + Assert.assertNotNull(out); + } + + @Test + public void testPrintBlockList() { + BlockCapsule blockCapsule1 = new BlockCapsule(1, Sha256Hash.ZERO_HASH, + System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString()); + BlockCapsule blockCapsule2 = new BlockCapsule(1, Sha256Hash.ZERO_HASH, + System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString()); + GrpcAPI.BlockList list = GrpcAPI.BlockList.newBuilder() + .addBlock(blockCapsule1.getInstance()) + .addBlock(blockCapsule2.getInstance()) + .build(); + String out = Util.printBlockList(list, true); + Assert.assertNotNull(out); + } + + @Test + public void testPrintTransactionList() { + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + GrpcAPI.TransactionList list = GrpcAPI.TransactionList.newBuilder() + .addTransaction(transactionCapsule.getInstance()) + .build(); + String out = Util.printTransactionList(list, true); + Assert.assertNotNull(out); + } + + private TransactionCapsule getTransactionCapsuleExample() { + final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; + final String RECEIVER_ADDRESS = "41abd4b9367799eaa3197fecb144eb71de1e049150"; + BalanceContract.TransferContract.Builder builder2 = + BalanceContract.TransferContract.newBuilder() + .setOwnerAddress( + ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))) + .setToAddress( + ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + return new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.TransferContract); + } + + @Test + public void testPrintTransactionSignWeight() { + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + GrpcAPI.TransactionExtention transactionExtention = + GrpcAPI.TransactionExtention.newBuilder() + .setTransaction(transactionCapsule.getInstance()) + .build(); + GrpcAPI.TransactionSignWeight txSignWeight = + GrpcAPI.TransactionSignWeight.newBuilder() + .setTransaction(transactionExtention) + .build(); + + String out = Util.printTransactionSignWeight(txSignWeight, true); + Assert.assertNotNull(out); + } + + @Test + public void testPrintTransactionApprovedList() { + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + GrpcAPI.TransactionExtention transactionExtention = + GrpcAPI.TransactionExtention.newBuilder() + .setTransaction(transactionCapsule.getInstance()) + .build(); + GrpcAPI.TransactionApprovedList transactionApprovedList = + GrpcAPI.TransactionApprovedList.newBuilder() + .setTransaction(transactionExtention) + .build(); + String out = Util.printTransactionApprovedList( + transactionApprovedList, true); + Assert.assertNotNull(out); + } + + @Test + public void testGenerateContractAddress() { + final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + byte[] out = Util.generateContractAddress( + transactionCapsule.getInstance(), OWNER_ADDRESS.getBytes()); + Assert.assertNotNull(out); + } + + @Test + public void testPrintTransactionToJSON() { + final String OWNER_ADDRESS = "41548794500882809695a8a687866e76d4271a1abc"; + SmartContractOuterClass.CreateSmartContract.Builder builder2 = + SmartContractOuterClass.CreateSmartContract.newBuilder() + .setOwnerAddress( + ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))); + TransactionCapsule transactionCapsule = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.CreateSmartContract); + + JSONObject out = Util.printTransactionToJSON( + transactionCapsule.getInstance(), true); + Assert.assertNotNull(out); + } + + @Test + public void testGetContractType() { + String out = Util.getContractType("{\"contractType\":\"123\"}\n"); + Assert.assertEquals("123", out); + } + + @Test + public void testGetHexAddress() { + String out = Util.getHexAddress("TBxSocpujP6UGKV5ydXNVTDQz7fAgdmoaB"); + Assert.assertNotNull(out); + + Assert.assertNull(Util.getHexAddress(null)); + } + + @Test + public void testSetTransactionPermissionId() { + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + Protocol.Transaction out = Util.setTransactionPermissionId( + 123, transactionCapsule.getInstance()); + Assert.assertNotNull(out); + } + + @Test + public void testSetTransactionExtraData() { + TransactionCapsule transactionCapsule = getTransactionCapsuleExample(); + JSONObject jsonObject = JSONObject.parseObject("{\"extra_data\":\"test\"}"); + Protocol.Transaction out = Util.setTransactionExtraData(jsonObject, + transactionCapsule.getInstance(), true); + Assert.assertNotNull(out); + } + + @Test + public void testConvertOutput() { + Protocol.Account account = Protocol.Account.newBuilder().build(); + String out = Util.convertOutput(account); + Assert.assertNotNull(out); + + account = Protocol.Account.newBuilder() + .setAssetIssuedID(ByteString.copyFrom("asset_issued_ID".getBytes())) + .build(); + out = Util.convertOutput(account); + Assert.assertNotNull(out); + } + + @Test + public void testConvertLogAddressToTronAddress() { + List logs = new ArrayList<>(); + logs.add(Protocol.TransactionInfo.Log.newBuilder() + .setAddress(ByteString.copyFrom("address".getBytes())) + .setData(ByteString.copyFrom("data".getBytes())) + .addTopics(ByteString.copyFrom("topic".getBytes())) + .build()); + + Protocol.TransactionInfo.Builder builder = Protocol.TransactionInfo.newBuilder() + .addAllLog(logs); + List logList = + Util.convertLogAddressToTronAddress(builder.build()); + Assert.assertNotNull(logList.size() > 0); + } + + @Test + public void testValidateParameter() { + String contract = "{\"address\":\"owner_address\"}"; + Assert.assertThrows( + InvalidParameterException.class, + () -> { + Util.validateParameter(contract); + } + ); + String contract1 = + "{\"owner_address\":\"owner_address\"," + + " \"contract_address1\":\"contract_address\", \"data1\":\"data\"}"; + Assert.assertThrows( + InvalidParameterException.class, + () -> { + Util.validateParameter(contract1); + } + ); + String contract2 = + "{\"owner_address\":\"owner_address\", " + + "\"function_selector\":\"function_selector\", \"data\":\"data\"}"; + Assert.assertThrows( + InvalidParameterException.class, + () -> { + Util.validateParameter(contract2); + } + ); + } + + @Test + public void testGetJsonString() { + String str = ""; + String ret = Util.getJsonString(str); + Assert.assertTrue(StringUtils.isEmpty(ret)); + + String str1 = "{\"owner_address\":\"owner_address\"}"; + String ret1 = Util.getJsonString(str1); + Assert.assertTrue(str1.equals(ret1)); + + String str2 = "owner_address=owner_address&contract_address=contract_address"; + String ret2 = Util.getJsonString(str2); + String expect = + "{\"owner_address\":\"owner_address\"," + + "\"contract_address\":\"contract_address\"}"; + Assert.assertEquals(expect, ret2); + } + +} \ No newline at end of file From e08511b68f47e0a6c53b166b44670ac17d327f02 Mon Sep 17 00:00:00 2001 From: chaozhu Date: Thu, 12 Dec 2024 23:51:34 +0800 Subject: [PATCH 017/107] fix check style error --- .../TransactionLogTriggerCapsuleMockTest.java | 7 ++++--- .../tron/common/runtime/RuntimeImplMockTest.java | 4 +++- .../src/test/java/org/tron/core/WalletMockTest.java | 2 +- .../test/java/org/tron/core/db/ManagerMockTest.java | 13 +++++++------ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java index 65c485b22d9..975d41a9051 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleMockTest.java @@ -1,5 +1,8 @@ package org.tron.common.logsfilter; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import com.google.protobuf.ByteString; @@ -26,9 +29,7 @@ import org.tron.protos.Protocol; import org.tron.protos.contract.BalanceContract; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; + public class TransactionLogTriggerCapsuleMockTest { diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java index b9381df8460..ee126049ad0 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java @@ -1,12 +1,14 @@ package org.tron.common.runtime; +import java.lang.reflect.Method; + import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; import org.junit.Test; import org.tron.core.vm.program.Program; -import java.lang.reflect.Method; + @Slf4j public class RuntimeImplMockTest { diff --git a/framework/src/test/java/org/tron/core/WalletMockTest.java b/framework/src/test/java/org/tron/core/WalletMockTest.java index 9dc0323f8fc..a52da0a95c9 100644 --- a/framework/src/test/java/org/tron/core/WalletMockTest.java +++ b/framework/src/test/java/org/tron/core/WalletMockTest.java @@ -18,6 +18,7 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import com.google.protobuf.LazyStringArrayList; +import com.google.protobuf.ProtocolStringList; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -28,7 +29,6 @@ import java.util.List; import java.util.concurrent.TimeUnit; -import com.google.protobuf.ProtocolStringList; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java index ff6e0dce3d8..f0e850faf7f 100644 --- a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java @@ -68,12 +68,13 @@ public void clearMocks() { public void processTransactionCostTimeMoreThan100() throws Exception { TransactionTrace traceMock = mock(TransactionTrace.class); BandwidthProcessor bandwidthProcessorMock = mock(BandwidthProcessor.class); - try (MockedConstruction mockedConstruction2 = mockConstruction(TransactionTrace.class,(mock, context) -> { - when(mock).thenReturn(traceMock); - }); - MockedConstruction mockedConstruction3 = mockConstruction(BandwidthProcessor.class,(mock, context) -> { - when(mock).thenReturn(bandwidthProcessorMock); - }); + try (MockedConstruction mockedConstruction2 + = mockConstruction(TransactionTrace.class,(mock, context) -> { + when(mock).thenReturn(traceMock); }); + MockedConstruction mockedConstruction3 + = mockConstruction(BandwidthProcessor.class,(mock, context) -> { + when(mock).thenReturn(bandwidthProcessorMock); + }); MockedStatic mockedStatic = mockStatic(TransactionUtil.class)) { Manager dbManager = mock(Manager.class); BalanceContract.TransferContract transferContract = From b70078c9c6301c4571e87e4ccdaf00ef68cdd2e9 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Tue, 24 Dec 2024 14:46:57 +0800 Subject: [PATCH 018/107] feat(net): reduce the interval between batch request blocks to 100ms --- framework/src/main/java/org/tron/core/config/args/Args.java | 2 +- .../main/java/org/tron/core/net/service/sync/SyncService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 8853971a5f8..a04e144d2be 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -953,7 +953,7 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.fastForwardNodes = getInetSocketAddress(config, Constant.NODE_FAST_FORWARD, true); PARAMETER.maxFastForwardNum = config.hasPath(Constant.NODE_MAX_FAST_FORWARD_NUM) ? config - .getInt(Constant.NODE_MAX_FAST_FORWARD_NUM) : 3; + .getInt(Constant.NODE_MAX_FAST_FORWARD_NUM) : 4; if (PARAMETER.maxFastForwardNum > MAX_ACTIVE_WITNESS_NUM) { PARAMETER.maxFastForwardNum = MAX_ACTIVE_WITNESS_NUM; } diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 8c673977962..0bce4b8baa5 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -90,7 +90,7 @@ public void init() { } catch (Exception e) { logger.error("Handle sync block error", e); } - }, 10, 1, TimeUnit.SECONDS); + }, 10000, 100, TimeUnit.MILLISECONDS); } public void close() { From c36118fc66e0ec3165c4d3d336224d4e395477ea Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Tue, 24 Dec 2024 15:38:01 +0800 Subject: [PATCH 019/107] fix(net): add check for the number of contracts in the transaction --- .../TransactionsMsgHandler.java | 4 ++++ .../TransactionsMsgHandlerTest.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java index 0c58fe08cd6..6ccd12016b1 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java @@ -98,6 +98,10 @@ private void check(PeerConnection peer, TransactionsMessage msg) throws P2pExcep "trx: " + msg.getMessageId() + " without request."); } peer.getAdvInvRequest().remove(item); + if (trx.getRawData().getContractCount() < 1) { + throw new P2pException(TypeEnum.BAD_TRX, + "tx " + item.getHash() + " contract size should be greater than 0"); + } } } diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java index e1865543443..54e5f78d85a 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java @@ -102,6 +102,29 @@ public void testProcessMessage() { transactionList1.add(trx1); transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList1)); Assert.assertNull(advInvRequest.get(item1)); + + // test 0 contract + Protocol.Transaction trx2 = Protocol.Transaction.newBuilder().setRawData( + Protocol.Transaction.raw.newBuilder().setTimestamp(transactionTimestamp) + .setRefBlockNum(1).build()) + .build(); + List transactionList2 = new ArrayList<>(); + transactionList2.add(trx2); + try { + transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList2)); + } catch (Exception ep) { + Assert.assertTrue(true); + } + Map advInvRequest2 = new ConcurrentHashMap<>(); + Item item2 = new Item(new TransactionMessage(trx2).getMessageId(), + Protocol.Inventory.InventoryType.TRX); + advInvRequest2.put(item2, 0L); + Mockito.when(peer.getAdvInvRequest()).thenReturn(advInvRequest2); + try { + transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList2)); + } catch (Exception ep) { + Assert.assertTrue(true); + } } catch (Exception e) { Assert.fail(); } finally { From 42e79c279b7932344c48a60fdfdcda2cb1f4ba2c Mon Sep 17 00:00:00 2001 From: chaozhu Date: Thu, 26 Dec 2024 15:47:42 +0800 Subject: [PATCH 020/107] jacoco.toolVersion optimize --- build.gradle | 3 +++ chainbase/build.gradle | 5 ----- framework/build.gradle | 3 --- plugins/build.gradle | 3 --- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index c74a31a3c8e..aefae7956ec 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,9 @@ subprojects { targetCompatibility = JavaVersion.VERSION_1_8 [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' + jacoco { + toolVersion = "0.8.12" // see https://www.jacoco.org/jacoco/trunk/doc/changes.html + } buildscript { repositories { diff --git a/chainbase/build.gradle b/chainbase/build.gradle index 79a246014d7..0fb98629856 100644 --- a/chainbase/build.gradle +++ b/chainbase/build.gradle @@ -2,7 +2,6 @@ description = "chainbase – a decentralized database for blockchain." // Dependency versions // --------------------------------------- -def jacocoVersion = "0.8.0" def jansiVersion = "1.16" // -------------------------------------- @@ -41,10 +40,6 @@ test { } } -jacoco { - toolVersion = jacocoVersion // See http://www.eclemma.org/jacoco/. -} - jacocoTestReport { reports { xml.enabled = true diff --git a/framework/build.gradle b/framework/build.gradle index ec113c93cb1..10477fb71b3 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -15,9 +15,6 @@ def versions = [ checkstyle: '8.7', ] -jacoco { - toolVersion = "0.8.1" -} configurations { diff --git a/plugins/build.gradle b/plugins/build.gradle index 7028686f3d0..03ac6d84150 100644 --- a/plugins/build.gradle +++ b/plugins/build.gradle @@ -5,9 +5,6 @@ plugins { apply plugin: 'application' apply plugin: 'checkstyle' -jacoco { - toolVersion = "0.8.8" -} def versions = [ checkstyle: '8.7', ] From 7f0b1848d152852029eca6cc4817b7193687beec Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 7 Jan 2025 11:32:49 +0800 Subject: [PATCH 021/107] impr(test): revert changes and optimize those tests in a safer way --- .../vm/BatchValidateSignContractTest.java | 4 ++-- .../tron/common/runtime/vm/Create2Test.java | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index 3fa52aa70c0..fc60d8c0648 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -79,7 +79,6 @@ public void staticCallTest() { @Test public void correctionTest() { - contract.setConstantCall(true); List signatures = new ArrayList<>(); List addresses = new ArrayList<>(); byte[] hash = Hash.sha3(longData); @@ -128,7 +127,8 @@ Pair validateMultiSign(byte[] hash, List signatures, List parameters = Arrays.asList("0x" + Hex.toHexString(hash), signatures, addresses); byte[] input = Hex.decode(AbiUtil.parseParameters(METHOD_SIGN, parameters)); contract.getEnergyForData(input); - contract.setVmShouldEndInUs(System.nanoTime() / 1000 + 500 * 1000); + long maxExecutionTime = 2000; // ms + contract.setVmShouldEndInUs(System.nanoTime() / 1000 + maxExecutionTime * 1000); Pair ret = contract.execute(input); logger.info("BytesArray:{},HexString:{}", Arrays.toString(ret.getValue()), Hex.toHexString(ret.getValue())); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java index a63abd97930..b1ed4f7af70 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java @@ -161,15 +161,15 @@ public void testCreate2() long salt = 100L; String hexInput = AbiUtil.parseMethod(methodSign, Arrays.asList(testCode, salt)); - TVMTestResult result = null; - for (int i = 1; i < 3; i++) { - result = TvmTestUtils - .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - factoryAddress, Hex.decode(hexInput), 0, fee, manager, null); - if (result.getRuntime().getRuntimeError() == null) { - break; - } - } + long preTime = manager.getDynamicPropertiesStore().getMaxCpuTimeOfOneTx(); + // set max cpu time to 500 + manager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(500L); + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, fee, manager, null); + // restore max cpu time + manager.getDynamicPropertiesStore().saveMaxCpuTimeOfOneTx(preTime); + Assert.assertNull(result.getRuntime().getRuntimeError()); byte[] returnValue = result.getRuntime().getResult().getHReturn(); From 659db96b6e5d3d2b019a44d831ae857b3b3f1ab4 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 8 Jan 2025 16:46:59 +0800 Subject: [PATCH 022/107] move DesensitizedConverter to package common --- .../org/tron/common/log/layout}/DesensitizedConverter.java | 6 +++--- .../java/org/tron/core/net/service/relay/RelayService.java | 2 +- framework/src/main/resources/logback.xml | 2 +- .../tron/common/logsfilter/DesensitizedConverterTest.java | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) rename {framework/src/main/java/org/tron/common/logsfilter => common/src/main/java/org/tron/common/log/layout}/DesensitizedConverter.java (88%) diff --git a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java b/common/src/main/java/org/tron/common/log/layout/DesensitizedConverter.java similarity index 88% rename from framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java rename to common/src/main/java/org/tron/common/log/layout/DesensitizedConverter.java index 1cbe5101f40..2777d6ba283 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/DesensitizedConverter.java +++ b/common/src/main/java/org/tron/common/log/layout/DesensitizedConverter.java @@ -1,4 +1,4 @@ -package org.tron.common.logsfilter; +package org.tron.common.log.layout; import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi.ILoggingEvent; @@ -7,7 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.extern.slf4j.Slf4j; -import org.tron.core.config.args.Args; +import org.tron.common.parameter.CommonParameter; @Slf4j(topic = "Parser") public class DesensitizedConverter extends ClassicConverter { @@ -44,6 +44,6 @@ private String desensitization(String content) { @Override public String convert(ILoggingEvent iLoggingEvent) { String source = iLoggingEvent.getFormattedMessage(); - return Args.getInstance().isFastForward() ? desensitization(source) : source; + return CommonParameter.getInstance().isFastForward() ? desensitization(source) : source; } } diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index 90463f8ab46..d4f60b13e1c 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -18,7 +18,7 @@ import org.tron.common.crypto.SignInterface; import org.tron.common.crypto.SignUtils; import org.tron.common.es.ExecutorServiceManager; -import org.tron.common.logsfilter.DesensitizedConverter; +import org.tron.common.log.layout.DesensitizedConverter; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml index 7d761bda931..03d870e92e0 100644 --- a/framework/src/main/resources/logback.xml +++ b/framework/src/main/resources/logback.xml @@ -5,7 +5,7 @@ + converterClass="org.tron.common.log.layout.DesensitizedConverter"/> diff --git a/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java index c584d5adf06..abdc0eccdfd 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/DesensitizedConverterTest.java @@ -4,6 +4,7 @@ import java.lang.reflect.Method; import org.junit.Assert; import org.junit.Test; +import org.tron.common.log.layout.DesensitizedConverter; public class DesensitizedConverterTest { From 021a5c1c2f4dd17542c434ca6e849d5c16dbf026 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Thu, 18 Jul 2024 15:58:44 +0800 Subject: [PATCH 023/107] feat(consensus): add consensus logic optimization proposal --- .../org/tron/core/utils/ProposalUtil.java | 20 ++++++++-- .../core/store/DynamicPropertiesStore.java | 15 +++++++ .../common/parameter/CommonParameter.java | 4 ++ .../src/main/java/org/tron/core/Constant.java | 3 ++ .../java/org/tron/core/config/Parameter.java | 5 ++- .../org/tron/consensus/dpos/DposService.java | 5 +-- .../src/main/java/org/tron/core/Wallet.java | 5 +++ .../java/org/tron/core/config/args/Args.java | 5 +++ .../tron/core/consensus/ProposalService.java | 5 +++ .../core/actuator/utils/ProposalUtilTest.java | 39 +++++++++++++++++++ .../org/tron/core/config/args/ArgsTest.java | 1 + .../core/services/ProposalServiceTest.java | 18 +++++++++ 12 files changed, 116 insertions(+), 9 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index fb4d6f76228..fc60316eb40 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -782,15 +782,26 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, case ALLOW_STRICT_MATH: { if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_7_7)) { throw new ContractValidateException( - "Bad chain parameter id [ALLOW_STRICT_MATH]"); + "Bad chain parameter id [ALLOW_STRICT_MATH]"); } if (dynamicPropertiesStore.allowStrictMath()) { throw new ContractValidateException( - "[ALLOW_STRICT_MATH] has been valid, no need to propose again"); + "[ALLOW_STRICT_MATH] has been valid, no need to propose again"); } if (value != 1) { throw new ContractValidateException( - "This value[ALLOW_STRICT_MATH] is only allowed to be 1"); + "This value[ALLOW_STRICT_MATH] is only allowed to be 1"); + } + break; + } + case CONSENSUS_LOGIC_OPTIMIZATION: { + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_0)) { + throw new ContractValidateException( + "Bad chain parameter id [CONSENSUS_LOGIC_OPTIMIZATION]"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[CONSENSUS_LOGIC_OPTIMIZATION] is only allowed to be 1"); } break; } @@ -873,7 +884,8 @@ public enum ProposalType { // current value, value range ALLOW_OLD_REWARD_OPT(79), // 0, 1 ALLOW_ENERGY_ADJUSTMENT(81), // 0, 1 MAX_CREATE_ACCOUNT_TX_SIZE(82), // [500, 10000] - ALLOW_STRICT_MATH(87); // 0, 1 + ALLOW_STRICT_MATH(87), // 0, 1 + CONSENSUS_LOGIC_OPTIMIZATION(88); // 0, 1 private long code; diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 4af338f09bb..261b4462f55 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -224,6 +224,9 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] MAX_CREATE_ACCOUNT_TX_SIZE = "MAX_CREATE_ACCOUNT_TX_SIZE".getBytes(); private static final byte[] ALLOW_STRICT_MATH = "ALLOW_STRICT_MATH".getBytes(); + private static final byte[] CONSENSUS_LOGIC_OPTIMIZATION + = "CONSENSUS_LOGIC_OPTIMIZATION".getBytes(); + @Autowired private DynamicPropertiesStore(@Value("properties") String dbName) { super(dbName); @@ -2891,6 +2894,18 @@ public boolean allowStrictMath() { return getAllowStrictMath() == 1L; } + public void saveConsensusLogicOptimization(long value) { + this.put(CONSENSUS_LOGIC_OPTIMIZATION, + new BytesCapsule(ByteArray.fromLong(value))); + } + + public long getConsensusLogicOptimization() { + return Optional.ofNullable(getUnchecked(CONSENSUS_LOGIC_OPTIMIZATION)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElse(CommonParameter.getInstance().getConsensusLogicOptimization()); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 1aa3befe8aa..d4a7b064cbb 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -681,6 +681,10 @@ public class CommonParameter { @Setter public long allowStrictMath; + @Getter + @Setter + public long consensusLogicOptimization; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 96ff41b91da..3bdbf2113af 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -387,4 +387,7 @@ public class Constant { public static final String COMMITTEE_ALLOW_ENERGY_ADJUSTMENT = "committee.allowEnergyAdjustment"; public static final String COMMITTEE_ALLOW_STRICT_MATH = "committee.allowStrictMath"; + + public static final String COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION + = "committee.consensusLogicOptimization"; } diff --git a/common/src/main/java/org/tron/core/config/Parameter.java b/common/src/main/java/org/tron/core/config/Parameter.java index 247c5dd4fe2..a71dc58e8bd 100644 --- a/common/src/main/java/org/tron/core/config/Parameter.java +++ b/common/src/main/java/org/tron/core/config/Parameter.java @@ -25,7 +25,8 @@ public enum ForkBlockVersionEnum { VERSION_4_7_2(28, 1596780000000L, 80), VERSION_4_7_4(29, 1596780000000L, 80), VERSION_4_7_5(30, 1596780000000L, 80), - VERSION_4_7_7(31, 1596780000000L, 80); + VERSION_4_7_7(31, 1596780000000L, 80), + VERSION_4_8_0(32, 1596780000000L, 80); // if add a version, modify BLOCK_VERSION simultaneously @Getter @@ -74,7 +75,7 @@ public class ChainConstant { public static final int SINGLE_REPEAT = 1; public static final int BLOCK_FILLED_SLOTS_NUMBER = 128; public static final int MAX_FROZEN_NUMBER = 1; - public static final int BLOCK_VERSION = 31; + public static final int BLOCK_VERSION = 32; public static final long FROZEN_PERIOD = 86_400_000L; public static final long DELEGATE_PERIOD = 3 * 86_400_000L; public static final long TRX_PRECISION = 1000_000L; diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java index 5ec6c7c554b..bc46345da08 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java @@ -1,8 +1,5 @@ package org.tron.consensus.dpos; -import static org.tron.core.config.Parameter.ChainConstant.MAX_ACTIVE_WITNESS_NUM; -import static org.tron.core.config.Parameter.ChainConstant.SOLIDIFIED_THRESHOLD; - import com.google.protobuf.ByteString; import java.util.ArrayList; import java.util.Comparator; @@ -27,6 +24,8 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.WitnessCapsule; +import static org.tron.core.config.Parameter.ChainConstant.*; + @Slf4j(topic = "consensus") @Component public class DposService implements ConsensusInterface { diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 0943723f2f4..e2eea8700d1 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -1348,6 +1348,11 @@ public Protocol.ChainParameters getChainParameters() { .setValue(dbManager.getDynamicPropertiesStore().getAllowStrictMath()) .build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() + .setKey("getConsensusLogicOptimization") + .setValue(dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization()) + .build()); + return builder.build(); } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 8853971a5f8..7397b69cde3 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -235,6 +235,7 @@ public static void clearParam() { PARAMETER.allowOldRewardOpt = 0; PARAMETER.allowEnergyAdjustment = 0; PARAMETER.allowStrictMath = 0; + PARAMETER.consensusLogicOptimization = 0; } /** @@ -1222,6 +1223,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.COMMITTEE_ALLOW_STRICT_MATH) ? config .getInt(Constant.COMMITTEE_ALLOW_STRICT_MATH) : 0; + PARAMETER.consensusLogicOptimization = + config.hasPath(Constant.COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION) ? config + .getInt(Constant.COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION) : 0; + logConfig(); } diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalService.java b/framework/src/main/java/org/tron/core/consensus/ProposalService.java index 29eef1c3cb3..120394de1be 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalService.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalService.java @@ -371,6 +371,11 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule) manager.getDynamicPropertiesStore().saveAllowStrictMath(entry.getValue()); break; } + case CONSENSUS_LOGIC_OPTIMIZATION: { + manager.getDynamicPropertiesStore() + .saveConsensusLogicOptimization(entry.getValue()); + break; + } default: find = false; break; diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index 52f8cdacc00..cc82ed88cc8 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -433,6 +433,8 @@ public void validateCheck() { testEnergyAdjustmentProposal(); + testConsensusLogicOptimizationProposal(); + forkUtils.getManager().getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionEnum.ENERGY_LIMIT.getValue(), stats); forkUtils.reset(); @@ -500,6 +502,43 @@ private void testEnergyAdjustmentProposal() { } } + private void testConsensusLogicOptimizationProposal() { + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.CONSENSUS_LOGIC_OPTIMIZATION.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "Bad chain parameter id [CONSENSUS_LOGIC_OPTIMIZATION]", + e.getMessage()); + } + + long maintenanceTimeInterval = forkUtils.getManager().getDynamicPropertiesStore() + .getMaintenanceTimeInterval(); + + long hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_8_0.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + + byte[] stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0.getValue(), stats); + + // Should fail because the proposal value is invalid + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.CONSENSUS_LOGIC_OPTIMIZATION.getCode(), 2); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "This value[CONSENSUS_LOGIC_OPTIMIZATION] is only allowed to be 1", + e.getMessage()); + } + } + @Test public void blockVersionCheck() { for (ForkBlockVersionEnum forkVersion : ForkBlockVersionEnum.values()) { diff --git a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java index 5bbf08fd96e..61f34b647c5 100644 --- a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java @@ -115,6 +115,7 @@ public void get() { Assert.assertEquals(GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE, parameter.getMaxMessageSize()); Assert.assertEquals(GrpcUtil.DEFAULT_MAX_HEADER_LIST_SIZE, parameter.getMaxHeaderListSize()); Assert.assertEquals(1L, parameter.getAllowCreationOfContracts()); + Assert.assertEquals(0, parameter.getConsensusLogicOptimization()); Assert.assertEquals(privateKey, Args.getLocalWitnesses().getPrivateKey()); diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 0ba32b27f2e..5975c83b88f 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -1,5 +1,6 @@ package org.tron.core.services; +import static org.tron.core.utils.ProposalUtil.ProposalType.CONSENSUS_LOGIC_OPTIMIZATION; import static org.tron.core.utils.ProposalUtil.ProposalType.ENERGY_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.TRANSACTION_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK; @@ -106,4 +107,21 @@ public void testUpdateTransactionFee() { Assert.assertEquals(expResult, currentHistory); } + @Test + public void testUpdateConsensusLogicOptimization() { + long v = dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization(); + Assert.assertEquals(v, 0); + + long value = 1; + Proposal proposal = + Proposal.newBuilder().putParameters(CONSENSUS_LOGIC_OPTIMIZATION.getCode(), value).build(); + ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); + proposalCapsule.setExpirationTime(1627279200000L); + boolean result = ProposalService.process(dbManager, proposalCapsule); + Assert.assertTrue(result); + + v = dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization(); + Assert.assertEquals(v, value); + } + } \ No newline at end of file From 6a32bb12334ba79b72911c2f21d38862efa709e1 Mon Sep 17 00:00:00 2001 From: waynercheung Date: Fri, 10 Jan 2025 00:31:43 +0800 Subject: [PATCH 024/107] typo --- framework/src/main/java/org/tron/core/Wallet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index e7c239511d9..14663d45998 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -696,7 +696,7 @@ public Block getSolidBlock() { } public long getSolidBlockNum() { - return chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + return chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); } public BlockCapsule getBlockCapsuleByNum(long blockNum) { From 81a04e52737ccba2a41cc7b4df61b8ea85e23ed7 Mon Sep 17 00:00:00 2001 From: chaozhu Date: Fri, 10 Jan 2025 11:02:02 +0800 Subject: [PATCH 025/107] remove assertTrue(true) --- .../java/org/tron/common/runtime/RuntimeImplMockTest.java | 3 --- framework/src/test/java/org/tron/core/WalletMockTest.java | 8 -------- .../src/test/java/org/tron/core/db/ManagerMockTest.java | 7 ------- .../org/tron/core/net/peer/PeerStatusCheckMockTest.java | 2 -- 4 files changed, 20 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java index ee126049ad0..e694f1c194f 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplMockTest.java @@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j; import org.junit.After; -import org.junit.Assert; import org.junit.Test; import org.tron.core.vm.program.Program; @@ -49,8 +48,6 @@ public void testSetResultCode1() throws Exception { = new Program.JVMStackOverFlowException(); programResult.setException(jvmStackOverFlowException); privateMethod.invoke(runtime, programResult); - - Assert.assertTrue(true); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/WalletMockTest.java b/framework/src/test/java/org/tron/core/WalletMockTest.java index a52da0a95c9..098ba9aee61 100644 --- a/framework/src/test/java/org/tron/core/WalletMockTest.java +++ b/framework/src/test/java/org/tron/core/WalletMockTest.java @@ -105,8 +105,6 @@ public void testSetTransactionNullException() throws Exception { "setTransaction", TransactionCapsule.class); privateMethod.setAccessible(true); privateMethod.invoke(wallet, transactionCapsuleMock); - - assertTrue(true); } @Test @@ -130,7 +128,6 @@ public void testCreateTransactionCapsuleWithoutValidateWithTimeoutNullException( long.class); privateMethod.setAccessible(true); privateMethod.invoke(wallet, message, contractType, timeout); - assertTrue(true); } } @@ -164,8 +161,6 @@ public void testCreateTransactionCapsuleWithoutValidateWithTimeout() long.class); privateMethod.setAccessible(true); privateMethod.invoke(wallet, message, contractType, timeout); - - assertTrue(true); } } @@ -1108,7 +1103,6 @@ public void testGetShieldedTRC20LogType1() { } catch (Exception e) { assertTrue(false); } - assertTrue(true); } @@ -1141,7 +1135,6 @@ public void testGetShieldedTRC20LogType2() { } catch (Exception e) { assertTrue(false); } - assertTrue(true); } @Test @@ -1222,7 +1215,6 @@ public void testBuildShieldedTRC20InputWithAK1() throws Exception { builder, spendNote, ak, nk); - assertTrue(true); } } diff --git a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java index f0e850faf7f..65726857809 100644 --- a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java @@ -34,7 +34,6 @@ import org.quartz.CronExpression; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.ProgramResult; -import org.tron.common.runtime.RuntimeImpl; import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.BlockCapsule; @@ -327,8 +326,6 @@ public void testProcessTransaction() throws Exception { TransactionCapsule.class, BlockCapsule.class); privateMethod.setAccessible(true); privateMethod.invoke(dbManager, transactionCapsuleMock, blockCapsuleMock); - - assertTrue(true); } @Test @@ -369,7 +366,6 @@ public void testRePush() { when(transactionStoreMock.has(any())).thenReturn(true); dbManager.rePush(trx); - assertTrue(true); } @SneakyThrows @@ -409,7 +405,6 @@ public void testRePush1() { doThrow(new TooBigTransactionResultException()).when(dbManager).pushTransaction(any()); dbManager.rePush(trx); - assertTrue(true); } @Test @@ -420,7 +415,6 @@ public void testPostSolidityFilter() throws Exception { "postSolidityFilter", long.class, long.class); privateMethod.setAccessible(true); privateMethod.invoke(dbManager, 100L, 10L); - assertTrue(true); } @Test @@ -442,7 +436,6 @@ public void testReOrgLogsFilter() throws Exception { Method privateMethod = Manager.class.getDeclaredMethod("reOrgLogsFilter"); privateMethod.setAccessible(true); privateMethod.invoke(dbManager); - assertTrue(true); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java index 5e8c69fdd6a..80b1abdc35d 100644 --- a/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java +++ b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckMockTest.java @@ -1,6 +1,5 @@ package org.tron.core.net.peer; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.spy; @@ -22,7 +21,6 @@ public void testInitException() throws InterruptedException { // the initialDelay of scheduleWithFixedDelay is 5s Thread.sleep(5000L); - assertTrue(true); } } \ No newline at end of file From eb8e59a1dce7cb8f148d28534faaa98dc477706f Mon Sep 17 00:00:00 2001 From: waynercheung Date: Tue, 14 Jan 2025 01:47:47 +0800 Subject: [PATCH 026/107] feat(jsonrpc): add test cases for jsonrpc finalized --- .../test/java/org/tron/core/WalletTest.java | 23 +- .../org/tron/core/jsonrpc/JsonRpcTest.java | 104 +--- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 448 +++++++++++++++--- 3 files changed, 406 insertions(+), 169 deletions(-) diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index 357a2d2ca08..6b984ff2fa8 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -139,7 +139,7 @@ public class WalletTest extends BaseTest { private static boolean init; static { - Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); + Args.setParam(new String[] {"-d", dbPath()}, Constant.TEST_CONF); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; } @@ -152,7 +152,8 @@ public void before() { } initTransaction(); initBlock(); - chainBaseManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(5); + chainBaseManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(BLOCK_NUM_FIVE); + chainBaseManager.getDynamicPropertiesStore().saveLatestSolidifiedBlockNum(BLOCK_NUM_TWO); chainBaseManager.getDelegatedResourceStore().reset(); init = true; } @@ -166,6 +167,7 @@ private void initTransaction() { TRANSACTION_TIMESTAMP_ONE, BLOCK_NUM_ONE); addTransactionToStore(transaction1); + // solidified transaction2 = getBuildTransaction( getBuildTransferContract(ACCOUNT_ADDRESS_TWO, ACCOUNT_ADDRESS_THREE), TRANSACTION_TIMESTAMP_TWO, BLOCK_NUM_TWO); @@ -284,6 +286,7 @@ private void initBlock() { private void addBlockToStore(Block block) { BlockCapsule blockCapsule = new BlockCapsule(block); + chainBaseManager.getBlockIndexStore().put(blockCapsule.getBlockId()); chainBaseManager.getBlockStore().put(blockCapsule.getBlockId().getBytes(), blockCapsule); } @@ -1169,19 +1172,19 @@ public void testListNodes() { * delegate_balance = 1000_000L; => 277 * delegate_balance = 1000_000_000L; => 279 * delegate_balance = 1000_000_000_000L => 280 - * + *

* We initialize account information as follows * account balance = 1000_000_000_000L * account frozen_balance = 1000_000_000L - * + *

* then estimateConsumeBandWidthSize cost 279 - * + *

* so we have following result: * TransactionUtil.estimateConsumeBandWidthSize( * dynamicStore,ownerCapsule.getBalance()) ===> false * TransactionUtil.estimateConsumeBandWidthSize( * dynamicStore,ownerCapsule.getFrozenV2BalanceForBandwidth()) ===> true - * + *

* This test case is used to verify the above conclusions */ @Test @@ -1206,5 +1209,13 @@ public void testGetCanDelegatedMaxSizeBandWidth123() { chainBaseManager.getDynamicPropertiesStore().saveMaxDelegateLockPeriod(DELEGATE_PERIOD / 3000); } + @Test + public void testGetSolidBlock() { + long blkNum = wallet.getSolidBlockNum(); + Assert.assertEquals(BLOCK_NUM_TWO, blkNum); + + Block block = wallet.getSolidBlock(); + assertEquals(block2, block); + } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index f221d0c95ac..0e1e09219cc 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -190,6 +190,7 @@ public void testLogFilter() { } catch (JsonRpcInvalidParamsException e) { Assert.fail(); } + try { new LogFilter(new FilterRequest(null, null, null, new String[] {"0x0"}, null)); } catch (JsonRpcInvalidParamsException e) { @@ -240,109 +241,6 @@ public void testLogFilter() { } } - /** - * test fromBlock and toBlock parameters - */ - @Test - public void testLogFilterWrapper() { - - // fromBlock and toBlock are both empty - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, null, null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); - Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - - // fromBlock is not empty and smaller than currentMaxBlockNum, toBlock is empty - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x14", null, null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); - Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - - // fromBlock is not empty and bigger than currentMaxBlockNum, toBlock is empty - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x78", null, null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 120); - Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - - // fromBlock is empty, toBlock is not empty and smaller than currentMaxBlockNum - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, "0x14", null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); - Assert.assertEquals(logFilterWrapper.getToBlock(), 20); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - - // fromBlock is empty, toBlock is not empty and bigger than currentMaxBlockNum - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest(null, "0x78", null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); - Assert.assertEquals(logFilterWrapper.getToBlock(), 120); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - - // fromBlock is not empty, toBlock is not empty - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x14", "0x78", null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); - Assert.assertEquals(logFilterWrapper.getToBlock(), 120); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); - } - - //fromBlock or toBlock is not hex num - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("earliest", null, null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 0); - Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("latest", null, null, null, null), 100, null); - Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); - Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); - } catch (JsonRpcInvalidParamsException e) { - Assert.fail(); - } - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("pending", null, null, null, null), 100, null); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("TAG pending not supported", e.getMessage()); - } - try { - LogFilterWrapper logFilterWrapper = - new LogFilterWrapper(new FilterRequest("test", null, null, null, null), 100, null); - } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("Incorrect hex syntax", e.getMessage()); - } - } - private int[] getBloomIndex(String s) { Bloom bloom = Bloom.create(Hash.sha3(ByteArray.fromHexString(s))); BitSet bs = BitSet.valueOf(bloom.getData()); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index b3ed26b591f..3a54f5a1a8e 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -1,5 +1,7 @@ package org.tron.core.jsonrpc; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getByJsonBlockId; + import com.alibaba.fastjson.JSON; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -27,12 +29,16 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.capsule.utils.BlockUtil; import org.tron.core.config.args.Args; +import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcServiceOnSolidity; import org.tron.core.services.jsonrpc.FullNodeJsonRpcHttpService; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.core.services.jsonrpc.TronJsonRpcImpl; +import org.tron.core.services.jsonrpc.filters.LogFilterWrapper; import org.tron.core.services.jsonrpc.types.BlockResult; import org.tron.core.services.jsonrpc.types.TransactionResult; import org.tron.protos.Protocol; @@ -42,14 +48,19 @@ @Slf4j public class JsonrpcServiceTest extends BaseTest { + private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; + private static final long LATEST_BLOCK_NUM = 10L; + private static final long LATEST_SOLIDIFIED_BLOCK_NUM = 4L; private static TronJsonRpcImpl tronJsonRpc; @Resource private NodeInfoService nodeInfoService; - private static BlockCapsule blockCapsule; + private static BlockCapsule blockCapsule0; + private static BlockCapsule blockCapsule1; + private static BlockCapsule blockCapsule2; private static TransactionCapsule transactionCapsule1; @Resource private Wallet wallet; @@ -64,65 +75,77 @@ public class JsonrpcServiceTest extends BaseTest { private JsonRpcServiceOnSolidity jsonRpcServiceOnSolidity; static { - Args.setParam(new String[]{"--output-directory", dbPath()}, Constant.TEST_CONF); + Args.setParam(new String[] {"--output-directory", dbPath()}, Constant.TEST_CONF); CommonParameter.getInstance().setJsonRpcHttpFullNodeEnable(true); CommonParameter.getInstance().setJsonRpcHttpPBFTNodeEnable(true); CommonParameter.getInstance().setJsonRpcHttpSolidityNodeEnable(true); CommonParameter.getInstance().setMetricsPrometheusEnable(true); Metrics.init(); - OWNER_ADDRESS = - Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } @Before public void init() { AccountCapsule accountCapsule = - new AccountCapsule( - ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), + new AccountCapsule(ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), - Protocol.AccountType.Normal, - 10000_000_000L); + Protocol.AccountType.Normal, 10000_000_000L); dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); - blockCapsule = new BlockCapsule( - 1, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), - 1, + blockCapsule0 = BlockUtil.newGenesisBlockCapsule(); + blockCapsule1 = new BlockCapsule(LATEST_BLOCK_NUM, Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), 1, + ByteString.copyFromUtf8("testAddress")); + blockCapsule2 = new BlockCapsule(LATEST_SOLIDIFIED_BLOCK_NUM, Sha256Hash.wrap( + ByteString.copyFrom(ByteArray.fromHexString( + "9938a342238077182498b464ac029222ae169360e540d1fd6aee7c2ae9575a06"))), 1, ByteString.copyFromUtf8("testAddress")); - TransferContract transferContract1 = TransferContract.newBuilder() - .setAmount(1L) - .setOwnerAddress(ByteString.copyFrom("0x0000000000000000000".getBytes())) - .setToAddress(ByteString.copyFrom(ByteArray.fromHexString( - (Wallet.getAddressPreFixString() + "A389132D6639FBDA4FBC8B659264E6B7C90DB086")))) - .build(); - TransferContract transferContract2 = TransferContract.newBuilder() - .setAmount(2L) - .setOwnerAddress(ByteString.copyFrom("0x0000000000000000000".getBytes())) - .setToAddress(ByteString.copyFrom(ByteArray.fromHexString( - (Wallet.getAddressPreFixString() + "ED738B3A0FE390EAA71B768B6D02CDBD18FB207B")))) + TransferContract transferContract1 = TransferContract.newBuilder().setAmount(1L) + .setOwnerAddress(ByteString.copyFrom("0x0000000000000000000".getBytes())).setToAddress( + ByteString.copyFrom(ByteArray.fromHexString( + (Wallet.getAddressPreFixString() + "A389132D6639FBDA4FBC8B659264E6B7C90DB086")))) + .build(); + TransferContract transferContract2 = TransferContract.newBuilder().setAmount(2L) + .setOwnerAddress(ByteString.copyFrom("0x0000000000000000000".getBytes())).setToAddress( + ByteString.copyFrom(ByteArray.fromHexString( + (Wallet.getAddressPreFixString() + "ED738B3A0FE390EAA71B768B6D02CDBD18FB207B")))) + .build(); + TransferContract transferContract3 = TransferContract.newBuilder().setAmount(3L) + .setOwnerAddress(ByteString.copyFrom("0x0000000000000000000".getBytes())).setToAddress( + ByteString.copyFrom(ByteArray.fromHexString( + (Wallet.getAddressPreFixString() + "ED738B3A0FE390EAA71B768B6D02CDBD18FB207B")))) .build(); - transactionCapsule1 = - new TransactionCapsule(transferContract1, ContractType.TransferContract); - transactionCapsule1.setBlockNum(blockCapsule.getNum()); + transactionCapsule1 = new TransactionCapsule(transferContract1, ContractType.TransferContract); + transactionCapsule1.setBlockNum(blockCapsule1.getNum()); TransactionCapsule transactionCapsule2 = new TransactionCapsule(transferContract2, ContractType.TransferContract); - transactionCapsule2.setBlockNum(2L); + transactionCapsule2.setBlockNum(blockCapsule1.getNum()); + TransactionCapsule transactionCapsule3 = new TransactionCapsule(transferContract3, + ContractType.TransferContract); + transactionCapsule3.setBlockNum(blockCapsule2.getNum()); + + blockCapsule1.addTransaction(transactionCapsule1); + blockCapsule1.addTransaction(transactionCapsule2); + blockCapsule2.addTransaction(transactionCapsule3); + + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(LATEST_BLOCK_NUM); + dbManager.getBlockIndexStore().put(blockCapsule1.getBlockId()); + dbManager.getBlockStore().put(blockCapsule1.getBlockId().getBytes(), blockCapsule1); - blockCapsule.addTransaction(transactionCapsule1); - blockCapsule.addTransaction(transactionCapsule2); - dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(1L); - dbManager.getBlockIndexStore().put(blockCapsule.getBlockId()); - dbManager.getBlockStore().put(blockCapsule.getBlockId().getBytes(), blockCapsule); + dbManager.getDynamicPropertiesStore().saveLatestSolidifiedBlockNum(LATEST_SOLIDIFIED_BLOCK_NUM); + dbManager.getBlockIndexStore().put(blockCapsule2.getBlockId()); + dbManager.getBlockStore().put(blockCapsule2.getBlockId().getBytes(), blockCapsule2); dbManager.getTransactionStore() .put(transactionCapsule1.getTransactionId().getBytes(), transactionCapsule1); dbManager.getTransactionStore() .put(transactionCapsule2.getTransactionId().getBytes(), transactionCapsule2); + dbManager.getTransactionStore() + .put(transactionCapsule3.getTransactionId().getBytes(), transactionCapsule3); tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); } @@ -165,11 +188,11 @@ public void testGetBlockTransactionCountByHash() { try { result = tronJsonRpc.ethGetBlockTransactionCountByHash( - Hex.toHexString((blockCapsule.getBlockId().getBytes()))); + Hex.toHexString((blockCapsule1.getBlockId().getBytes()))); } catch (Exception e) { Assert.fail(); } - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getTransactions().size()), result); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getTransactions().size()), result); } @@ -199,15 +222,15 @@ public void testGetBlockTransactionCountByNumber() { } catch (Exception e) { Assert.fail(); } - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getTransactions().size()), result); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getTransactions().size()), result); try { - result = tronJsonRpc - .ethGetBlockTransactionCountByNumber(ByteArray.toJsonHex(blockCapsule.getNum())); + result = tronJsonRpc.ethGetBlockTransactionCountByNumber( + ByteArray.toJsonHex(blockCapsule1.getNum())); } catch (Exception e) { Assert.fail(); } - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getTransactions().size()), result); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getTransactions().size()), result); } @@ -215,32 +238,74 @@ public void testGetBlockTransactionCountByNumber() { public void testGetBlockByHash() { BlockResult blockResult = null; try { - blockResult = tronJsonRpc - .ethGetBlockByHash(Hex.toHexString((blockCapsule.getBlockId().getBytes())), false); + blockResult = + tronJsonRpc.ethGetBlockByHash(Hex.toHexString((blockCapsule1.getBlockId().getBytes())), + false); } catch (Exception e) { Assert.fail(); } - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getNum()), blockResult.getNumber()); - Assert - .assertEquals(blockCapsule.getTransactions().size(), blockResult.getTransactions().length); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getNum()), blockResult.getNumber()); + Assert.assertEquals(blockCapsule1.getTransactions().size(), + blockResult.getTransactions().length); } @Test public void testGetBlockByNumber() { BlockResult blockResult = null; + + // by number try { - blockResult = tronJsonRpc - .ethGetBlockByNumber(ByteArray.toJsonHex(blockCapsule.getNum()), false); + blockResult = + tronJsonRpc.ethGetBlockByNumber(ByteArray.toJsonHex(blockCapsule1.getNum()), false); } catch (Exception e) { Assert.fail(); } - - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getNum()), blockResult.getNumber()); - Assert - .assertEquals(blockCapsule.getTransactions().size(), blockResult.getTransactions().length); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getNum()), blockResult.getNumber()); + Assert.assertEquals(blockCapsule1.getTransactions().size(), + blockResult.getTransactions().length); Assert.assertEquals("0x0000000000000000", blockResult.getNonce()); - } + // earliest + try { + blockResult = tronJsonRpc.ethGetBlockByNumber("earliest", false); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(ByteArray.toJsonHex(0L), blockResult.getNumber()); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule0.getNum()), blockResult.getNumber()); + + // latest + try { + blockResult = tronJsonRpc.ethGetBlockByNumber("latest", false); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(ByteArray.toJsonHex(LATEST_BLOCK_NUM), blockResult.getNumber()); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getNum()), blockResult.getNumber()); + + // finalized + try { + blockResult = tronJsonRpc.ethGetBlockByNumber("finalized", false); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(ByteArray.toJsonHex(LATEST_SOLIDIFIED_BLOCK_NUM), blockResult.getNumber()); + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule2.getNum()), blockResult.getNumber()); + + // pending + try { + tronJsonRpc.ethGetBlockByNumber("pending", false); + } catch (Exception e) { + Assert.assertEquals("TAG pending not supported", e.getMessage()); + } + + // invalid + try { + tronJsonRpc.ethGetBlockByNumber("0x", false); + } catch (Exception e) { + Assert.assertEquals("invalid block number", e.getMessage()); + } + } @Test public void testGetTransactionByHash() { @@ -268,7 +333,7 @@ public void testGetBlockByNumber2() { fullNodeJsonRpcHttpService.init(Args.getInstance()); fullNodeJsonRpcHttpService.start(); JsonArray params = new JsonArray(); - params.add(ByteArray.toJsonHex(blockCapsule.getNum())); + params.add(ByteArray.toJsonHex(blockCapsule1.getNum())); params.add(false); JsonObject requestBody = new JsonObject(); requestBody.addProperty("jsonrpc", "2.0"); @@ -283,16 +348,14 @@ public void testGetBlockByNumber2() { response = httpClient.execute(httpPost); String resp = EntityUtils.toString(response.getEntity()); BlockResult blockResult = JSON.parseObject(resp).getObject("result", BlockResult.class); - Assert.assertEquals(ByteArray.toJsonHex(blockCapsule.getNum()), - blockResult.getNumber()); - Assert.assertEquals(blockCapsule.getTransactions().size(), + Assert.assertEquals(ByteArray.toJsonHex(blockCapsule1.getNum()), blockResult.getNumber()); + Assert.assertEquals(blockCapsule1.getTransactions().size(), blockResult.getTransactions().length); - Assert.assertEquals("0x0000000000000000", - blockResult.getNonce()); + Assert.assertEquals("0x0000000000000000", blockResult.getNonce()); response.close(); Assert.assertEquals(1, CollectorRegistry.defaultRegistry.getSampleValue( - "tron:jsonrpc_service_latency_seconds_count", - new String[] {"method"}, new String[] {"eth_getBlockByNumber"}).intValue()); + "tron:jsonrpc_service_latency_seconds_count", new String[] {"method"}, + new String[] {"eth_getBlockByNumber"}).intValue()); } catch (Exception e) { Assert.fail(e.getMessage()); } finally { @@ -313,4 +376,269 @@ public void testServicesInit() { } } + @Test + public void testGetByJsonBlockId() { + long blkNum = 0; + + try { + getByJsonBlockId("pending", wallet); + } catch (Exception e) { + Assert.assertEquals("TAG pending not supported", e.getMessage()); + } + + try { + blkNum = getByJsonBlockId(null, wallet); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(-1, blkNum); + + try { + blkNum = getByJsonBlockId("latest", wallet); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(-1, blkNum); + + try { + blkNum = getByJsonBlockId("finalized", wallet); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(LATEST_SOLIDIFIED_BLOCK_NUM, blkNum); + + try { + blkNum = getByJsonBlockId("0xa", wallet); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals(10L, blkNum); + + try { + getByJsonBlockId("abc", wallet); + } catch (Exception e) { + Assert.assertEquals("Incorrect hex syntax", e.getMessage()); + } + + try { + getByJsonBlockId("0xxabc", wallet); + } catch (Exception e) { + Assert.assertEquals("For input string: \"xabc\"", e.getMessage()); + } + } + + @Test + public void testGetTrxBalance() { + String balance = ""; + + try { + tronJsonRpc.getTrxBalance("", "earliest"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getTrxBalance("", "pending"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getTrxBalance("", "finalized"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + balance = tronJsonRpc.getTrxBalance("0xabd4b9367799eaa3197fecb144eb71de1e049abc", + "latest"); + } catch (Exception e) { + Assert.fail(); + } + Assert.assertEquals("0x2540be400", balance); + } + + @Test + public void testGetStorageAt() { + try { + tronJsonRpc.getStorageAt("", "", "earliest"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getStorageAt("", "", "pending"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getStorageAt("", "", "finalized"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + } + + @Test + public void testGetABIOfSmartContract() { + try { + tronJsonRpc.getABIOfSmartContract("", "earliest"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getABIOfSmartContract("", "pending"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getABIOfSmartContract("", "finalized"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + } + + @Test + public void testGetCall() { + try { + tronJsonRpc.getCall(null, "earliest"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getCall(null, "pending"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + + try { + tronJsonRpc.getCall(null, "finalized"); + } catch (Exception e) { + Assert.assertEquals("TAG [earliest | pending | finalized] not supported", + e.getMessage()); + } + } + + /** + * test fromBlock and toBlock parameters + */ + @Test + public void testLogFilterWrapper() { + + // fromBlock and toBlock are both empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, null, null, null, null), 100, null); + Assert.assertEquals(100, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty and smaller than currentMaxBlockNum, toBlock is empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x14", null, null, null, null), 100, null); + Assert.assertEquals(20, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty and bigger than currentMaxBlockNum, toBlock is empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x78", null, null, null, null), 100, null); + Assert.assertEquals(120, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is empty, toBlock is not empty and smaller than currentMaxBlockNum + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, "0x14", null, null, null), 100, null); + Assert.assertEquals(20, logFilterWrapper.getFromBlock()); + Assert.assertEquals(20, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is empty, toBlock is not empty and bigger than currentMaxBlockNum + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, "0x78", null, null, null), 100, null); + Assert.assertEquals(100, logFilterWrapper.getFromBlock()); + Assert.assertEquals(120, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty, toBlock is not empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x14", "0x78", null, null, null), 100, null); + Assert.assertEquals(20, logFilterWrapper.getFromBlock()); + Assert.assertEquals(120, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); + } + + //fromBlock or toBlock is not hex num + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("earliest", null, null, null, null), 100, null); + Assert.assertEquals(0, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("latest", null, null, null, null), 100, null); + Assert.assertEquals(100, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilterWrapper(new FilterRequest("pending", null, null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("TAG pending not supported", e.getMessage()); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("finalized", null, null, null, null), 100, wallet); + Assert.assertEquals(LATEST_SOLIDIFIED_BLOCK_NUM, logFilterWrapper.getFromBlock()); + Assert.assertEquals(Long.MAX_VALUE, logFilterWrapper.getToBlock()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilterWrapper(new FilterRequest("test", null, null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("Incorrect hex syntax", e.getMessage()); + } + } } From 46826a70a97bef3dcc3c5bfaebdb367775d8b75e Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 14 Jan 2025 21:19:53 +0800 Subject: [PATCH 027/107] feat(consensus): modify the review comments --- .../java/org/tron/core/utils/ProposalUtil.java | 14 +++++++++----- .../tron/core/store/DynamicPropertiesStore.java | 4 ++++ .../java/org/tron/consensus/dpos/DposService.java | 5 +++-- .../tron/core/actuator/utils/ProposalUtilTest.java | 12 ++++++++++++ .../tron/core/services/ProposalServiceTest.java | 3 +++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index fc60316eb40..081b91dfd6c 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -782,26 +782,30 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, case ALLOW_STRICT_MATH: { if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_7_7)) { throw new ContractValidateException( - "Bad chain parameter id [ALLOW_STRICT_MATH]"); + "Bad chain parameter id [ALLOW_STRICT_MATH]"); } if (dynamicPropertiesStore.allowStrictMath()) { throw new ContractValidateException( - "[ALLOW_STRICT_MATH] has been valid, no need to propose again"); + "[ALLOW_STRICT_MATH] has been valid, no need to propose again"); } if (value != 1) { throw new ContractValidateException( - "This value[ALLOW_STRICT_MATH] is only allowed to be 1"); + "This value[ALLOW_STRICT_MATH] is only allowed to be 1"); } break; } case CONSENSUS_LOGIC_OPTIMIZATION: { if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_0)) { throw new ContractValidateException( - "Bad chain parameter id [CONSENSUS_LOGIC_OPTIMIZATION]"); + "Bad chain parameter id [CONSENSUS_LOGIC_OPTIMIZATION]"); + } + if (dynamicPropertiesStore.getConsensusLogicOptimization() == 1) { + throw new ContractValidateException( + "[CONSENSUS_LOGIC_OPTIMIZATION] has been valid, no need to propose again"); } if (value != 1) { throw new ContractValidateException( - "This value[CONSENSUS_LOGIC_OPTIMIZATION] is only allowed to be 1"); + "This value[CONSENSUS_LOGIC_OPTIMIZATION] is only allowed to be 1"); } break; } diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 261b4462f55..85f958ada8b 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2906,6 +2906,10 @@ public long getConsensusLogicOptimization() { .orElse(CommonParameter.getInstance().getConsensusLogicOptimization()); } + public boolean allowConsensusLogicOptimization() { + return getConsensusLogicOptimization() == 1L; + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java index bc46345da08..5ec6c7c554b 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java @@ -1,5 +1,8 @@ package org.tron.consensus.dpos; +import static org.tron.core.config.Parameter.ChainConstant.MAX_ACTIVE_WITNESS_NUM; +import static org.tron.core.config.Parameter.ChainConstant.SOLIDIFIED_THRESHOLD; + import com.google.protobuf.ByteString; import java.util.ArrayList; import java.util.Comparator; @@ -24,8 +27,6 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.WitnessCapsule; -import static org.tron.core.config.Parameter.ChainConstant.*; - @Slf4j(topic = "consensus") @Component public class DposService implements ConsensusInterface { diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index cc82ed88cc8..1cfc4d1887f 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -537,6 +537,18 @@ private void testConsensusLogicOptimizationProposal() { "This value[CONSENSUS_LOGIC_OPTIMIZATION] is only allowed to be 1", e.getMessage()); } + + dynamicPropertiesStore.saveConsensusLogicOptimization(1); + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.CONSENSUS_LOGIC_OPTIMIZATION.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "[CONSENSUS_LOGIC_OPTIMIZATION] has been valid, no need to propose again", + e.getMessage()); + } + } @Test diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 5975c83b88f..cda9bfe4186 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -111,6 +111,7 @@ public void testUpdateTransactionFee() { public void testUpdateConsensusLogicOptimization() { long v = dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization(); Assert.assertEquals(v, 0); + Assert.assertTrue(!dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); long value = 1; Proposal proposal = @@ -122,6 +123,8 @@ public void testUpdateConsensusLogicOptimization() { v = dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization(); Assert.assertEquals(v, value); + + Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); } } \ No newline at end of file From 4e4881f08b2004cf6e9a5b5e8ee5ffa4c04484d8 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Wed, 22 Jan 2025 16:48:47 +0800 Subject: [PATCH 028/107] feat(witness): sort witness from address hashcode to address --- .../tron/core/service/MortgageService.java | 14 ++-------- .../core/store/DynamicPropertiesStore.java | 4 +++ .../org/tron/core/store/WitnessStore.java | 22 ++++++++++++--- .../org/tron/consensus/ConsensusDelegate.java | 4 +++ .../org/tron/consensus/dpos/DposService.java | 6 +---- .../actuator/VoteWitnessActuatorTest.java | 1 + .../java/org/tron/core/db/ManagerTest.java | 6 +++-- .../org/tron/core/db/WitnessStoreTest.java | 27 ++++++++++++++++++- .../core/services/DelegationServiceTest.java | 1 + .../core/services/ProposalServiceTest.java | 2 ++ 10 files changed, 63 insertions(+), 24 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/service/MortgageService.java b/chainbase/src/main/java/org/tron/core/service/MortgageService.java index 805245d53f2..29ea32208eb 100644 --- a/chainbase/src/main/java/org/tron/core/service/MortgageService.java +++ b/chainbase/src/main/java/org/tron/core/service/MortgageService.java @@ -1,8 +1,6 @@ package org.tron.core.service; -import com.google.protobuf.ByteString; import java.math.BigInteger; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import lombok.Getter; @@ -51,7 +49,8 @@ public void initStore(WitnessStore witnessStore, DelegationStore delegationStore } public void payStandbyWitness() { - List witnessStandbys = witnessStore.getWitnessStandby(); + List witnessStandbys = witnessStore.getWitnessStandby( + dynamicPropertiesStore.allowWitnessSortOptimization()); long voteSum = witnessStandbys.stream().mapToLong(WitnessCapsule::getVoteCount).sum(); if (voteSum < 1) { return; @@ -227,10 +226,6 @@ private long computeReward(long beginCycle, long endCycle, AccountCapsule accoun return reward; } - public WitnessCapsule getWitnessByAddress(ByteString address) { - return witnessStore.get(address.toByteArray()); - } - public void adjustAllowance(byte[] address, long amount) { try { if (amount <= 0) { @@ -259,11 +254,6 @@ public void adjustAllowance(AccountStore accountStore, byte[] accountAddress, lo accountStore.put(account.createDbKey(), account); } - private void sortWitness(List list) { - list.sort(Comparator.comparingLong((ByteString b) -> getWitnessByAddress(b).getVoteCount()) - .reversed().thenComparing(Comparator.comparingInt(ByteString::hashCode).reversed())); - } - private long getOldReward(long begin, long end, List> votes) { if (dynamicPropertiesStore.allowOldRewardOpt()) { return rewardViCalService.getNewRewardAlgorithmReward(begin, end, votes); diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 85f958ada8b..6fe29a7a136 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2910,6 +2910,10 @@ public boolean allowConsensusLogicOptimization() { return getConsensusLogicOptimization() == 1L; } + public boolean allowWitnessSortOptimization() { + return this.allowConsensusLogicOptimization(); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/chainbase/src/main/java/org/tron/core/store/WitnessStore.java b/chainbase/src/main/java/org/tron/core/store/WitnessStore.java index d23a73f92f9..9f444d3333d 100644 --- a/chainbase/src/main/java/org/tron/core/store/WitnessStore.java +++ b/chainbase/src/main/java/org/tron/core/store/WitnessStore.java @@ -1,6 +1,7 @@ package org.tron.core.store; import com.google.common.collect.Streams; +import com.google.protobuf.ByteString; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -11,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.tron.common.utils.ByteArray; import org.tron.core.capsule.WitnessCapsule; import org.tron.core.config.Parameter; import org.tron.core.db.TronStoreWithRevoking; @@ -39,12 +41,10 @@ public WitnessCapsule get(byte[] key) { return ArrayUtils.isEmpty(value) ? null : new WitnessCapsule(value); } - public List getWitnessStandby() { + public List getWitnessStandby(boolean isSortOpt) { List ret; List all = getAllWitnesses(); - all.sort(Comparator.comparingLong(WitnessCapsule::getVoteCount) - .reversed().thenComparing(Comparator.comparingInt( - (WitnessCapsule w) -> w.getAddress().hashCode()).reversed())); + sortWitnesses(all, isSortOpt); if (all.size() > Parameter.ChainConstant.WITNESS_STANDBY_LENGTH) { ret = new ArrayList<>(all.subList(0, Parameter.ChainConstant.WITNESS_STANDBY_LENGTH)); } else { @@ -55,4 +55,18 @@ public List getWitnessStandby() { return ret; } + public void sortWitnesses(List witnesses, boolean isSortOpt) { + witnesses.sort(Comparator.comparingLong(WitnessCapsule::getVoteCount).reversed() + .thenComparing(isSortOpt + ? Comparator.comparing(WitnessCapsule::createReadableString).reversed() + : Comparator.comparingInt((WitnessCapsule w) -> w.getAddress().hashCode()).reversed())); + } + + public void sortWitness(List list, boolean isSortOpt) { + list.sort(Comparator.comparingLong((ByteString b) -> get(b.toByteArray()).getVoteCount()) + .reversed().thenComparing(isSortOpt + ? Comparator.comparing( + (ByteString b) -> ByteArray.toHexString(b.toByteArray())).reversed() + : Comparator.comparingInt(ByteString::hashCode).reversed())); + } } diff --git a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java index 767463a6a5b..ef3a35d1ec7 100644 --- a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java +++ b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java @@ -135,4 +135,8 @@ public void applyBlock(boolean flag) { public boolean allowChangeDelegation() { return dynamicPropertiesStore.allowChangeDelegation(); } + + public void sortWitness(List list) { + witnessStore.sortWitness(list, dynamicPropertiesStore.allowWitnessSortOptimization()); + } } \ No newline at end of file diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java index 5ec6c7c554b..292294b2c2d 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java @@ -163,11 +163,7 @@ private void updateSolidBlock() { } public void updateWitness(List list) { - list.sort(Comparator.comparingLong((ByteString b) -> - consensusDelegate.getWitness(b.toByteArray()).getVoteCount()) - .reversed() - .thenComparing(Comparator.comparingInt(ByteString::hashCode).reversed())); - + consensusDelegate.sortWitness(list); if (list.size() > MAX_ACTIVE_WITNESS_NUM) { consensusDelegate .saveActiveWitnesses(list.subList(0, MAX_ACTIVE_WITNESS_NUM)); diff --git a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java index 1a152555931..d7fef2ab2f5 100644 --- a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java @@ -52,6 +52,7 @@ public class VoteWitnessActuatorTest extends BaseTest { static { Args.setParam(new String[]{"--output-directory", dbPath()}, Constant.TEST_CONF); + Args.getInstance().setConsensusLogicOptimization(1); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; WITNESS_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; WITNESS_ADDRESS_NOACCOUNT = diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 07440435f41..70aba258594 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -618,7 +618,8 @@ public void pushSwitchFork() WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address)); chainManager.getWitnessScheduleStore().saveActiveWitnesses(new ArrayList<>()); chainManager.addWitness(ByteString.copyFrom(address)); - List witnessStandby1 = chainManager.getWitnessStore().getWitnessStandby(); + List witnessStandby1 = chainManager.getWitnessStore().getWitnessStandby( + chainManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); Block block = getSignedBlock(witnessCapsule.getAddress(), 1533529947843L, privateKey); dbManager.pushBlock(new BlockCapsule(block)); @@ -656,7 +657,8 @@ public void pushSwitchFork() Assert.assertTrue(e instanceof Exception); } chainManager.getWitnessStore().put(address, sr2); - List witnessStandby2 = chainManager.getWitnessStore().getWitnessStandby(); + List witnessStandby2 = chainManager.getWitnessStore().getWitnessStandby( + chainManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); Assert.assertNotEquals(witnessStandby1, witnessStandby2); } diff --git a/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java b/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java index 3190e226689..d141a5fd790 100755 --- a/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java @@ -1,6 +1,9 @@ package org.tron.core.db; import com.google.protobuf.ByteString; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; @@ -46,5 +49,27 @@ public void putAndGetWitness() { Assert.assertEquals(100L, witnessSource.getVoteCount()); } - + @Test + public void testSortWitness() { + this.witnessStore.reset(); + WitnessCapsule s1 = new WitnessCapsule( + ByteString.copyFrom(new byte[]{1, 2, 3}), 100L, "URL-1"); + this.witnessStore.put(s1.getAddress().toByteArray(), s1); + WitnessCapsule s2 = new WitnessCapsule( + ByteString.copyFrom(new byte[]{1, 1, 34}), 100L, "URL-2"); + this.witnessStore.put(s2.getAddress().toByteArray(), s2); + List allWitnesses = this.witnessStore.getAllWitnesses(); + List witnessAddress = allWitnesses.stream().map(WitnessCapsule::getAddress) + .collect(Collectors.toList()); + this.witnessStore.sortWitness(witnessAddress, false); + this.witnessStore.sortWitnesses(allWitnesses, false); + Assert.assertEquals(witnessAddress, allWitnesses.stream().map(WitnessCapsule::getAddress) + .collect(Collectors.toList())); + List pre = new ArrayList<>(witnessAddress); + this.witnessStore.sortWitness(witnessAddress, true); + this.witnessStore.sortWitnesses(allWitnesses, true); + Assert.assertEquals(witnessAddress, allWitnesses.stream().map(WitnessCapsule::getAddress) + .collect(Collectors.toList())); + Assert.assertNotEquals(pre, witnessAddress); + } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/DelegationServiceTest.java b/framework/src/test/java/org/tron/core/services/DelegationServiceTest.java index e2ea87a1d0f..5c898eb42d6 100644 --- a/framework/src/test/java/org/tron/core/services/DelegationServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/DelegationServiceTest.java @@ -107,6 +107,7 @@ private void testWithdraw() { public void test() { manager.getDynamicPropertiesStore().saveChangeDelegation(1); + manager.getDynamicPropertiesStore().saveConsensusLogicOptimization(1); byte[] sr27 = decodeFromBase58Check("TLTDZBcPoJ8tZ6TTEeEqEvwYFk2wgotSfD"); manager.getDelegationStore().setBrokerage(0, sr27, 10); manager.getDelegationStore().setBrokerage(1, sr27, 20); diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index cda9bfe4186..211e7228289 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -112,6 +112,7 @@ public void testUpdateConsensusLogicOptimization() { long v = dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization(); Assert.assertEquals(v, 0); Assert.assertTrue(!dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); + Assert.assertFalse(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); long value = 1; Proposal proposal = @@ -125,6 +126,7 @@ public void testUpdateConsensusLogicOptimization() { Assert.assertEquals(v, value); Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); + Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); } } \ No newline at end of file From c3686aae2de1af2c3475afbb3d63a15c269fb489 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Wed, 1 Jan 2025 18:30:39 +0800 Subject: [PATCH 029/107] feat(*): optimize sensitive information --- .../tron/common/crypto/BouncyCastleTest.java | 25 +- .../org/tron/common/crypto/ECKeyTest.java | 14 +- .../org/tron/common/crypto/SM2KeyTest.java | 16 +- .../common/utils/client/utils/AbiUtil.java | 10 + .../core/capsule/TransactionCapsuleTest.java | 1015 ----------------- .../tron/core/config/ConfigurationTest.java | 15 +- .../core/zksnark/ShieldedReceiveTest.java | 13 +- framework/src/test/resources/config-test.conf | 2 +- framework/src/test/resources/testng.conf | 46 +- .../java/org/tron/plugins/DbLiteTest.java | 4 +- 10 files changed, 63 insertions(+), 1097 deletions(-) diff --git a/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java b/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java index 880a6623a38..ab6b2832c12 100644 --- a/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java +++ b/framework/src/test/java/org/tron/common/crypto/BouncyCastleTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.tron.common.utils.client.utils.AbiUtil.generateOccupationConstantPrivateKey; import java.math.BigInteger; import java.security.SignatureException; @@ -20,12 +21,13 @@ */ public class BouncyCastleTest { - private String privString = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"; - private BigInteger privateKey = new BigInteger(privString, 16); + // For safety reasons, test with a placeholder private key + private final String privString = generateOccupationConstantPrivateKey(); + private final BigInteger privateKey = new BigInteger(privString, 16); @Test public void testHex() { - String spongyAddress = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; + String spongyAddress = "2e988a386a799f506693793c6a5af6b54dfaabfb"; ECKey key = ECKey.fromPrivate(privateKey); byte[] address = key.getAddress(); assertEquals(spongyAddress, @@ -55,10 +57,9 @@ public void testSha3Hash() { @Test public void testECKeyAddress() { - String spongyPubkey = - "040947751e3022ecf3016be03ec77ab0ce3c2662b4843898cb068d74f698ccc8ad75" - + "aa17564ae80a20bb044ee7a6d903e8e8df624b089c95d66a0570f051e5a05b"; - String spongyAddress = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; + String spongyPubkey = "04e90c7d3640a1568839c31b70a893ab6714ef8415b9de90cedfc1c8f353a6983e625529" + + "392df7fa514bdd65a2003f6619567d79bee89830e63e932dbd42362d34"; + String spongyAddress = "2e988a386a799f506693793c6a5af6b54dfaabfb"; ECKey key = ECKey.fromPrivate(privateKey); byte[] pubkey = key.getPubKey(); assertEquals(spongyPubkey, Hex.toHexString(pubkey)); @@ -71,7 +72,7 @@ public void testECKeyAddress() { public void testECKeySignature() throws SignatureException { SignInterface sign = SignUtils.fromPrivate(Hex.decode(privString), true); String msg = "transaction raw data"; - String spongyAddress = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; + String spongyAddress = "2e988a386a799f506693793c6a5af6b54dfaabfb"; byte[] hash = Sha256Hash.hash(true, msg.getBytes()); String sig = sign.signHash(hash); byte[] address = SignUtils.signatureToAddress(hash, sig, true); @@ -102,9 +103,9 @@ public void testSM3Hash() { @Test public void testSM2Address() { - String spongyPublickey = "04f9539070c135be6183cbff4539f8298755df5981022769cd16cfdcb917fa7e32" - + "4e83b50f0bdbb34acd6ccbb78d45a8a383403f26bbd03805a178c43407dfdeae"; - String spongyAddress = "7dc44d739a5226c0d3037bb7919f653eb2f938b9"; + String spongyPublickey = "04dc3547dbbc4c90a9cde599848e26cb145e805b3d11daaf9daae0680d9c6824058ac" + + "35ddecb12f3a8bbc3104a2b91a2b7d04851d773d9b4ab8d5e0359243c8628"; + String spongyAddress = "6cb22f88564bdd61eb4cdb36215add53bc702ff1"; SM2 key = SM2.fromPrivate(privateKey); assertEquals(spongyPublickey, Hex.toHexString(key.getPubKey())); byte[] address = key.getAddress(); @@ -115,7 +116,7 @@ public void testSM2Address() { public void testSM2Signature() throws SignatureException { SignInterface sign = SignUtils.fromPrivate(Hex.decode(privString), false); String msg = "transaction raw data"; - String spongyAddress = "7dc44d739a5226c0d3037bb7919f653eb2f938b9"; + String spongyAddress = "6cb22f88564bdd61eb4cdb36215add53bc702ff1"; byte[] hash = Sha256Hash.hash(false, msg.getBytes()); String sig = sign.signHash(hash); byte[] address = SignUtils.signatureToAddress(hash, sig, false); diff --git a/framework/src/test/java/org/tron/common/crypto/ECKeyTest.java b/framework/src/test/java/org/tron/common/crypto/ECKeyTest.java index bf268f14320..4e7d45ee8d7 100644 --- a/framework/src/test/java/org/tron/common/crypto/ECKeyTest.java +++ b/framework/src/test/java/org/tron/common/crypto/ECKeyTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.tron.common.utils.client.utils.AbiUtil.generateOccupationConstantPrivateKey; import java.math.BigInteger; import java.security.KeyPairGenerator; @@ -27,16 +28,17 @@ @Slf4j public class ECKeyTest { - private String privString = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"; + // For safety reasons, test with a placeholder private key + private String privString = generateOccupationConstantPrivateKey(); private BigInteger privateKey = new BigInteger(privString, 16); - private String pubString = "040947751e3022ecf3016be03ec77ab0ce3c2662b4843898cb068d74f698ccc" - + "8ad75aa17564ae80a20bb044ee7a6d903e8e8df624b089c95d66a0570f051e5a05b"; + private String pubString = "04e90c7d3640a1568839c31b70a893ab6714ef8415b9de90cedfc1c8f353a6983e62" + + "5529392df7fa514bdd65a2003f6619567d79bee89830e63e932dbd42362d34"; private String compressedPubString = - "030947751e3022ecf3016be03ec77ab0ce3c2662b4843898cb068d74f6" + "98ccc8ad"; + "02e90c7d3640a1568839c31b70a893ab6714ef8415b9de90cedfc1c8f353a6983e"; private byte[] pubKey = Hex.decode(pubString); private byte[] compressedPubKey = Hex.decode(compressedPubString); - private String address = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; + private String address = "2e988a386a799f506693793c6a5af6b54dfaabfb"; String eventSign = "eventBytesL(address,bytes,bytes32,uint256,string)"; @Test @@ -46,7 +48,7 @@ public void testSha3() { @Test public void testHashCode() { - assertEquals(-351262686, ECKey.fromPrivate(privateKey).hashCode()); + assertEquals(-827927068, ECKey.fromPrivate(privateKey).hashCode()); } @Test diff --git a/framework/src/test/java/org/tron/common/crypto/SM2KeyTest.java b/framework/src/test/java/org/tron/common/crypto/SM2KeyTest.java index 62e800679c1..b84026d2085 100644 --- a/framework/src/test/java/org/tron/common/crypto/SM2KeyTest.java +++ b/framework/src/test/java/org/tron/common/crypto/SM2KeyTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.tron.common.utils.client.utils.AbiUtil.generateOccupationConstantPrivateKey; import java.math.BigInteger; import java.security.KeyPairGenerator; @@ -30,19 +31,20 @@ public class SM2KeyTest { //private String IDa = "ALICE123@YAHOO.COM"; private static BigInteger SM2_N = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6" + "B21C6052B53BBF40939D54123", 16); - private String privString = "128B2FA8BD433C6C068C8D803DFF79792A519A55171B1B650C23661D15897263"; + // For safety reasons, test with a placeholder private key + private String privString = generateOccupationConstantPrivateKey(); private BigInteger privateKey = new BigInteger(privString, 16); - private String pubString = "04d5548c7825cbb56150a3506cd57464af8a1ae0519dfaf3c58221dc810caf28d" - + "d921073768fe3d59ce54e79a49445cf73fed23086537027264d168946d479533e"; + private String pubString = "04dc3547dbbc4c90a9cde599848e26cb145e805b3d11daaf9daae0680d9c6824058ac" + + "35ddecb12f3a8bbc3104a2b91a2b7d04851d773d9b4ab8d5e0359243c8628"; private String compressedPubString = - "02d5548c7825cbb56150a3506cd57464af8a1ae0519dfaf3c58221dc810caf28dd"; + "02dc3547dbbc4c90a9cde599848e26cb145e805b3d11daaf9daae0680d9c682405"; private byte[] pubKey = Hex.decode(pubString); private byte[] compressedPubKey = Hex.decode(compressedPubString); - private String address = "62e49e4c2f4e3c0653a02f8859c1e6991b759e87"; + private String address = "6cb22f88564bdd61eb4cdb36215add53bc702ff1"; @Test public void testHashCode() { - assertEquals(1126288006, SM2.fromPrivate(privateKey).hashCode()); + assertEquals(578690511, SM2.fromPrivate(privateKey).hashCode()); } @Test @@ -114,7 +116,7 @@ public void testSM3Hash() { SM2Signer signer = key.getSM2SignerForHash(); String message = "message digest"; byte[] hash = signer.generateSM3Hash(message.getBytes()); - assertEquals("299C7DDB0D8DD2A85381BACBB92F738F390210A493A144C78E18C67B430DA882", + assertEquals("2A723761EAE35429DF643648FD69FB7787E7FC32F321BFAF7E294390F529BAF4", Hex.toHexString(hash).toUpperCase()); } diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java b/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java index 976490b8c80..7f00431ed0a 100644 --- a/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java +++ b/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java @@ -238,6 +238,16 @@ public static byte[] encodeInput(String methodSign, String input) { return pack(coders, items); } + public static String generateOccupationConstantPrivateKey() { + StringBuilder privateKey = new StringBuilder(); + String baseKey = "1234567890"; + for (int i = 0; i < 6; i++) { + privateKey.append(baseKey); + } + privateKey.append("1234"); + return privateKey.toString(); + } + public static void main(String[] args) { String method = "test(string,int2,string)"; String params = "asdf,3123,adf"; diff --git a/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java index 17e9d3ac887..7065608f188 100644 --- a/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java @@ -26,48 +26,11 @@ public class TransactionCapsuleTest extends BaseTest { private static String OWNER_ADDRESS; - /*private static String OWNER_KEY = - "bfa67cb3dc6609b3a0c98e717d66f38ed1a159b5b3421678dfab85961c40de2f"; - private static String TO_ADDRESS; - private static String OWNER_ACCOUNT_NOT_Exist; - private static String KEY_11 = "1111111111111111111111111111111111111111111111111111111111111111"; - private static String KEY_12 = "1212121212121212121212121212121212121212121212121212121212121212"; - private static String KEY_13 = "1313131313131313131313131313131313131313131313131313131313131313"; - private static String KEY_21 = "2121212121212121212121212121212121212121212121212121212121212121"; - private static String KEY_22 = "2222222222222222222222222222222222222222222222222222222222222222"; - private static String KEY_23 = "2323232323232323232323232323232323232323232323232323232323232323"; - private static String KEY_31 = "3131313131313131313131313131313131313131313131313131313131313131"; - private static String KEY_32 = "3232323232323232323232323232323232323232323232323232323232323232"; - private static String KEY_33 = "3333333333333333333333333333333333333333333333333333333333333333"; - - private static String KEY_ADDRESS_11; - private static String KEY_ADDRESS_12; - private static String KEY_ADDRESS_13; - private static String KEY_ADDRESS_21; - private static String KEY_ADDRESS_22; - private static String KEY_ADDRESS_23; - private static String KEY_ADDRESS_31; - private static String KEY_ADDRESS_32; - private static String KEY_ADDRESS_33;*/ @BeforeClass public static void init() { Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "03702350064AD5C1A8AA6B4D74B051199CFF8EA7"; - /*TO_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - OWNER_ACCOUNT_NOT_Exist = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; - KEY_ADDRESS_11 = Wallet.getAddressPreFixString() + "19E7E376E7C213B7E7E7E46CC70A5DD086DAFF2A"; - KEY_ADDRESS_12 = Wallet.getAddressPreFixString() + "1C5A77D9FA7EF466951B2F01F724BCA3A5820B63"; - KEY_ADDRESS_13 = Wallet.getAddressPreFixString() + "03A1BBA60B5AA37094CF16123ADD674C01589488"; - - KEY_ADDRESS_21 = Wallet.getAddressPreFixString() + "2BD0C9FE079C8FCA0E3352EB3D02839C371E5C41"; - KEY_ADDRESS_22 = Wallet.getAddressPreFixString() + "1563915E194D8CFBA1943570603F7606A3115508"; - KEY_ADDRESS_23 = Wallet.getAddressPreFixString() + "D3E442496EB66A4748912EC4A3B7A111D0B855D6"; - - KEY_ADDRESS_31 = Wallet.getAddressPreFixString() + "77952CE83CA3CAD9F7ADCFABEDA85BD2F1F52008"; - KEY_ADDRESS_32 = Wallet.getAddressPreFixString() + "94622CC2A5B64A58C25A129D48A2BEEC4B65B779"; - KEY_ADDRESS_33 = Wallet.getAddressPreFixString() + "5CBDD86A2FA8DC4BDDD8A8F69DBA48572EEC07FB";*/ } /** @@ -80,984 +43,6 @@ public void createAccountCapsule() { dbManager.getAccountStore().put(ownerCapsule.createDbKey(), ownerCapsule); } - /*@Test - public void getDefaultPermission() { - String[] names = {"active", "owner", "other"}; - ByteString address = ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)); - for (String name : names) { - Permission permission = TransactionCapsule - .getDefaultPermission(address, name); - Assert.assertEquals(permission.getName(), name); - Assert.assertEquals(permission.getThreshold(), 1); - if ("owner".equalsIgnoreCase(name)) { - Assert.assertEquals(permission.getParent(), ""); - } else { - Assert.assertEquals(permission.getParent(), "owner"); - } - Assert.assertEquals(permission.getKeysCount(), 1); - Key key = permission.getKeys(0); - Assert.assertEquals(key.getAddress(), address); - Assert.assertEquals(key.getWeight(), 1); - } - } - - public TransferContract createTransferContract(byte[] to, byte[] owner, long amount) { - TransferContract.Builder builder = TransferContract.newBuilder(); - ByteString bsTo = ByteString.copyFrom(to); - ByteString bsOwner = ByteString.copyFrom(owner); - builder.setToAddress(bsTo); - builder.setOwnerAddress(bsOwner); - builder.setAmount(amount); - - return builder.build(); - } - - public PermissionAddKeyContract createPermissionAddKeyContract(byte[] owner, String name, - byte[] address, int weight) { - PermissionAddKeyContract.Builder contractBuilder = PermissionAddKeyContract.newBuilder(); - contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); - contractBuilder.setPermissionName(name); - Key.Builder keyBuilder = Key.newBuilder(); - keyBuilder.setAddress(ByteString.copyFrom(address)); - keyBuilder.setWeight(weight); - contractBuilder.setKey(keyBuilder.build()); - return contractBuilder.build(); - } - - public void updatePermission(List permissions, byte[] address) { - Account account = dbManager.getAccountStore().get(address).getInstance(); - Account.Builder builder = account.toBuilder(); - for (Permission permission : permissions) { - builder.addPermissions(permission); - } - dbManager.getAccountStore().put(address, new AccountCapsule(builder.build())); - } - - public List buildPermissions() { - Permission.Builder builder1 = Permission.newBuilder(); - Key.Builder key11 = Key.newBuilder(); - Key.Builder key12 = Key.newBuilder(); - Key.Builder key13 = Key.newBuilder(); - key11.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_11))).setWeight(1); - key12.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_12))).setWeight(1); - key13.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_13))).setWeight(1); - builder1.setName("owner").setThreshold(2).setParent("").addKeys(key11).addKeys(key12) - .addKeys(key13); - Permission.Builder builder2 = Permission.newBuilder(); - Key.Builder key21 = Key.newBuilder(); - Key.Builder key22 = Key.newBuilder(); - Key.Builder key23 = Key.newBuilder(); - key21.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_21))).setWeight(1); - key22.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_22))).setWeight(1); - key23.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_23))).setWeight(1); - builder2.setName("active").setThreshold(2).setParent("").addKeys(key21).addKeys(key22) - .addKeys(key23); - Permission.Builder builder3 = Permission.newBuilder(); - Key.Builder key31 = Key.newBuilder(); - Key.Builder key32 = Key.newBuilder(); - Key.Builder key33 = Key.newBuilder(); - key31.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_31))).setWeight(1); - key32.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_32))).setWeight(1); - key33.setAddress(ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_33))).setWeight(1); - builder3.setName("other").setThreshold(2).setParent("").addKeys(key31).addKeys(key32) - .addKeys(key33); - List list = new ArrayList<>(); - list.add(builder1.build()); - list.add(builder2.build()); - list.add(builder3.build()); - return list; - } - - @Test - public void getPermission() { - //Default "active" permission - byte[] owner = ByteArray.fromHexString(OWNER_ADDRESS); - Account account = dbManager.getAccountStore().get(owner).getInstance(); - try { - Permission permission = TransactionCapsule.getPermission(account, "active"); - Permission permission1 = TransactionCapsule - .getDefaultPermission(ByteString.copyFrom(owner), "active"); - Assert.assertEquals(permission, permission1); - } catch (PermissionException e) { - Assert.assertFalse(true); - } - //Default "owner" permission - try { - Permission permission = TransactionCapsule.getPermission(account, "owner"); - Permission permission1 = TransactionCapsule - .getDefaultPermission(ByteString.copyFrom(owner), "owner"); - Assert.assertEquals(permission, permission1); - } catch (PermissionException e) { - Assert.assertFalse(true); - } - //Add 3 permission : owner active other - List permissions = buildPermissions(); - updatePermission(permissions, owner); - Permission permission1 = permissions.get(0); - Permission permission2 = permissions.get(1); - account = dbManager.getAccountStore().get(owner).getInstance(); - try { - Permission permission = TransactionCapsule.getPermission(account, "owner"); - Assert.assertEquals(permission, permission1); - } catch (PermissionException e) { - Assert.assertFalse(true); - } - - try { - Permission permission = TransactionCapsule.getPermission(account, "active"); - Assert.assertEquals(permission, permission2); - } catch (PermissionException e) { - Assert.assertFalse(true); - } - } - - @Test - public void getWeight() { - List permissions = buildPermissions(); - Permission permission1 = permissions.get(0); - Permission permission2 = permissions.get(1); - Permission permission3 = permissions.get(2); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_11))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_12))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_13))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_21))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_22))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_23))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_31))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_32))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission1, ByteArray.fromHexString(KEY_ADDRESS_33))); - - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_11))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_12))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_13))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_21))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_22))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_23))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_31))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_32))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission2, ByteArray.fromHexString(KEY_ADDRESS_33))); - - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_11))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_12))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_13))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_21))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_22))); - Assert.assertEquals(0, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_23))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_31))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_32))); - Assert.assertEquals(1, - TransactionCapsule.getWeight(permission3, ByteArray.fromHexString(KEY_ADDRESS_33))); - } - - public ArrayList sign(List priKeys, byte[] hash) { - ArrayList list = new ArrayList<>(); - for (byte[] priKey : priKeys) { - ECKey ecKey = ECKey.fromPrivate(priKey); - ECDSASignature signature = ecKey.sign(hash); - ByteString result = ByteString.copyFrom(signature.toByteArray()); - list.add(result); - } - return list; - } - - @Test - public void checkWeight() { - List permissions = buildPermissions(); - Permission permission = permissions.get(0); - byte[] hash = Sha256Hash.hash("test".getBytes()); - - //SignatureFormatException - ArrayList list = new ArrayList<>(); - ByteString test = ByteString.copyFromUtf8("test"); - list.add(test); - try { - TransactionCapsule.checkWeight(permission, list, hash, null); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertEquals(e.getMessage(), "Signature size is " + test.size()); - } - //SignatureException: Header byte out of range: - //Ignore more exception case. - byte[] rand = new byte[65]; - new Random().nextBytes(rand); - rand[64] = 8; // v = 8 < 27 v += 35 > 35 - try { - ArrayList list1 = new ArrayList<>(); - list1.add(ByteString.copyFrom(rand)); - TransactionCapsule.checkWeight(permission, list1, hash, null); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertEquals(e.getMessage(), "Header byte out of range: 35"); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Permission does not contain KEY - List prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_11)); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign11_21 = sign(prikeys, hash); - try { - TransactionCapsule.checkWeight(permission, sign11_21, hash, null); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - ByteString sign21 = sign11_21.get(1); - Assert.assertEquals(e.getMessage(), - ByteArray.toHexString(sign21.toByteArray()) + " is signed by " + Wallet - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_21)) - + " but it is not contained of permission."); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Too many signature - prikeys.add(ByteArray.fromHexString(KEY_12)); - prikeys.add(ByteArray.fromHexString(KEY_13)); - ArrayList sign11_21_12_13 = sign(prikeys, hash); - try { - TransactionCapsule.checkWeight(permission, sign11_21_12_13, hash, null); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - "Signature count is " + prikeys.size() + " more than key counts of permission : " - + permission.getKeysCount()); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - //Sign twice by same key - prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_11)); - prikeys.add(ByteArray.fromHexString(KEY_12)); - prikeys.add(ByteArray.fromHexString(KEY_11)); - ArrayList sign11_12_11 = sign(prikeys, hash); - try { - TransactionCapsule.checkWeight(permission, sign11_12_11, hash, null); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - WalletUtil.encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) + " has signed twice!"); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - // - prikeys = new ArrayList<>(); - List approveList = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_11)); - ArrayList sign11 = sign(prikeys, hash); - try { - long weight = TransactionCapsule.checkWeight(permission, sign11, hash, approveList); - Assert.assertEquals(weight, 1); - Assert.assertEquals(approveList.size(), 1); - Assert.assertEquals(approveList.get(0), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_11))); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - approveList = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_12)); - ArrayList sign11_12 = sign(prikeys, hash); - try { - long weight = TransactionCapsule.checkWeight(permission, sign11_12, hash, approveList); - Assert.assertEquals(weight, 2); - Assert.assertEquals(approveList.size(), 2); - Assert.assertEquals(approveList.get(0), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_11))); - Assert.assertEquals(approveList.get(1), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_12))); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - approveList = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_13)); - ArrayList sign11_12_13 = sign(prikeys, hash); - try { - long weight = TransactionCapsule.checkWeight(permission, sign11_12_13, hash, approveList); - Assert.assertEquals(weight, 3); - Assert.assertEquals(approveList.size(), 3); - Assert.assertEquals(approveList.get(0), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_11))); - Assert.assertEquals(approveList.get(1), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_12))); - Assert.assertEquals(approveList.get(2), - ByteString.copyFrom(ByteArray.fromHexString(KEY_ADDRESS_13))); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - } - - @Test - public void addSign() { - - byte[] to = ByteArray.fromHexString(TO_ADDRESS); - byte[] owner_not_exist = ByteArray.fromHexString(OWNER_ACCOUNT_NOT_Exist); - TransferContract transferContract = createTransferContract(to, owner_not_exist, 1); - Transaction.Builder trxBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = Transaction.raw.newBuilder(); - Contract.Builder contractBuilder = Contract.newBuilder(); - contractBuilder.setType(ContractType.TransferContract).setParameter(Any.pack(transferContract)) - .build(); - rawBuilder.addContract(contractBuilder); - trxBuilder.setRawData(rawBuilder); - AccountStore accountStore = dbManager.getAccountStore(); - TransactionCapsule transactionCapsule = new TransactionCapsule(trxBuilder.build()); - //Accout not exist - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_11), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), "Account is not exist!"); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - byte[] owner = ByteArray.fromHexString(OWNER_ADDRESS); - transferContract = createTransferContract(to, owner, 1); - transactionCapsule = new TransactionCapsule(transferContract, accountStore); - //Defalut permission - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_11), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - KEY_11 + "'s address is " + WalletUtil - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) - + " but it is not contained of permission."); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - try { - transactionCapsule.addSign(ByteArray.fromHexString(OWNER_KEY), accountStore); - Assert.assertEquals(transactionCapsule.getInstance().getSignatureCount(), 1); - ByteString signature = transactionCapsule.getInstance().getSignature(0); - Assert.assertEquals(signature.size(), 65); - byte[] sign = signature.toByteArray(); - byte[] r = ByteArray.subArray(sign, 0, 32); - byte[] s = ByteArray.subArray(sign, 32, 64); - byte v = sign[64]; - ECDSASignature ecdsaSignature = ECDSASignature.fromComponents(r, s, (byte) (v + 27)); - byte[] address = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature); - Assert.assertTrue(Arrays.equals(address, ByteArray.fromHexString(OWNER_ADDRESS))); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - // Sign twice - try { - transactionCapsule.addSign(ByteArray.fromHexString(OWNER_KEY), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - WalletUtil.encode58Check(ByteArray.fromHexString(OWNER_ADDRESS)) + " had signed!"); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Update permission, can signed by key21 key22 key23 - List permissions = buildPermissions(); - Account account = accountStore.get(ByteArray.fromHexString(OWNER_ADDRESS)).getInstance(); - Account.Builder builder = account.toBuilder(); - builder.addPermissions(permissions.get(0)); - builder.addPermissions(permissions.get(1)); - builder.addPermissions(permissions.get(2)); - accountStore.put(ByteArray.fromHexString(OWNER_ADDRESS), new AccountCapsule(builder.build())); - - transactionCapsule = new TransactionCapsule(transferContract, accountStore); - try { - transactionCapsule.addSign(ByteArray.fromHexString(OWNER_KEY), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - OWNER_KEY + "'s address is " + Wallet - .encode58Check(ByteArray.fromHexString(OWNER_ADDRESS)) - + " but it is not contained of permission."); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Sign KEY_21 - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_21), accountStore); - Assert.assertEquals(transactionCapsule.getInstance().getSignatureCount(), 1); - ByteString signature = transactionCapsule.getInstance().getSignature(0); - Assert.assertEquals(signature.size(), 65); - byte[] sign = signature.toByteArray(); - byte[] r = ByteArray.subArray(sign, 0, 32); - byte[] s = ByteArray.subArray(sign, 32, 64); - byte v = sign[64]; - ECDSASignature ecdsaSignature = ECDSASignature.fromComponents(r, s, (byte) (v + 27)); - byte[] address = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature); - Assert.assertTrue(Arrays.equals(address, ByteArray.fromHexString(KEY_ADDRESS_21))); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Sign KEY_12 - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_22), accountStore); - Assert.assertEquals(transactionCapsule.getInstance().getSignatureCount(), 2); - ByteString signature = transactionCapsule.getInstance().getSignature(0); - Assert.assertEquals(signature.size(), 65); - byte[] sign = signature.toByteArray(); - byte[] r21 = ByteArray.subArray(sign, 0, 32); - byte[] s21 = ByteArray.subArray(sign, 32, 64); - byte v21 = sign[64]; - ECDSASignature ecdsaSignature11 = ECDSASignature.fromComponents(r21, s21, (byte) (v21 + 27)); - byte[] address21 = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature11); - Assert.assertTrue(Arrays.equals(address21, ByteArray.fromHexString(KEY_ADDRESS_21))); - - ByteString signature1 = transactionCapsule.getInstance().getSignature(1); - - byte[] r22 = ByteArray.subArray(signature1.toByteArray(), 0, 32); - byte[] s22 = ByteArray.subArray(signature1.toByteArray(), 32, 64); - byte v22 = signature1.toByteArray()[64]; - ECDSASignature ecdsaSignature12 = ECDSASignature.fromComponents(r22, s22, (byte) (v22 + 27)); - byte[] address22 = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature12); - Assert.assertTrue(Arrays.equals(address22, ByteArray.fromHexString(KEY_ADDRESS_22))); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Sign KEY_23 - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_23), accountStore); - Assert.assertEquals(transactionCapsule.getInstance().getSignatureCount(), 3); - ByteString signature = transactionCapsule.getInstance().getSignature(0); - Assert.assertEquals(signature.size(), 65); - byte[] sign = signature.toByteArray(); - byte[] r21 = ByteArray.subArray(sign, 0, 32); - byte[] s21 = ByteArray.subArray(sign, 32, 64); - byte v21 = sign[64]; - ECDSASignature ecdsaSignature21 = ECDSASignature.fromComponents(r21, s21, (byte) (v21 + 27)); - byte[] address21 = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature21); - Assert.assertTrue(Arrays.equals(address21, ByteArray.fromHexString(KEY_ADDRESS_21))); - - ByteString signature1 = transactionCapsule.getInstance().getSignature(1); - Assert.assertEquals(signature1.size(), 65); - byte[] sign1 = signature1.toByteArray(); - byte[] r22 = ByteArray.subArray(sign1, 0, 32); - byte[] s22 = ByteArray.subArray(sign1, 32, 64); - byte v22 = sign1[64]; - ECDSASignature ecdsaSignature22 = ECDSASignature.fromComponents(r22, s22, (byte) (v22 + 27)); - byte[] address22 = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature22); - Assert.assertTrue(Arrays.equals(address22, ByteArray.fromHexString(KEY_ADDRESS_22))); - - ByteString signature2 = transactionCapsule.getInstance().getSignature(2); - Assert.assertEquals(signature2.size(), 65); - byte[] sign2 = signature2.toByteArray(); - byte[] r23 = ByteArray.subArray(sign2, 0, 32); - byte[] s23 = ByteArray.subArray(sign2, 32, 64); - byte v23 = sign2[64]; - ECDSASignature ecdsaSignature23 = ECDSASignature.fromComponents(r23, s23, (byte) (v23 + 27)); - byte[] address23 = ECKey - .signatureToAddress(transactionCapsule.getTransactionId().getBytes(), ecdsaSignature23); - Assert.assertTrue(Arrays.equals(address23, ByteArray.fromHexString(KEY_ADDRESS_23))); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Sign KEY_11, throw exception - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_11), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - KEY_11 + "'s address is " + Wallet - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) - + " but it is not contained of permission."); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //invalidate signature - transactionCapsule = new TransactionCapsule(transferContract, accountStore); - Transaction.Builder builder1 = transactionCapsule.getInstance().toBuilder(); - builder1.addSignature(ByteString.copyFromUtf8("test")); - transactionCapsule = new TransactionCapsule(builder1.build()); - //Sign KEY_21, throw exception - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_11), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertEquals(e.getMessage(), "Signature size is " + "test".length()); - } - - //invalidate signature - transactionCapsule = new TransactionCapsule(transferContract, accountStore); - builder1 = transactionCapsule.getInstance().toBuilder(); - builder1.addSignature(ByteString.copyFromUtf8("test")); - transactionCapsule = new TransactionCapsule(builder1.build()); - //Sign KEY_21, throw exception - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_11), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertEquals(e.getMessage(), "Signature size is " + "test".length()); - } - //transaction already have a signature signed by a invalidate key - //that the key is not in the permission. - transactionCapsule = new TransactionCapsule(transferContract, accountStore); - List prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_11)); - ArrayList sign11 = sign(prikeys, transactionCapsule.getTransactionId().getBytes()); - builder1 = transactionCapsule.getInstance().toBuilder(); - builder1.addAllSignature(sign11); - transactionCapsule = new TransactionCapsule(builder1.build()); - - try { - transactionCapsule.addSign(ByteArray.fromHexString(KEY_21), accountStore); - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - ByteArray.toHexString(sign11.get(0).toByteArray()) + " is signed by " + Wallet - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) - + " but it is not contained of permission."); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - } - - @Test - // test public static boolean validateSignature(Transaction.Contract contract, - ByteString sigs, byte[] hash, AccountStore accountStore) - public void validateSignature0() { - //Update permission, can signed by key21 key22 key23 - AccountStore accountStore = dbManager.getAccountStore(); - List permissions = buildPermissions(); - - byte[] to = ByteArray.fromHexString(TO_ADDRESS); - byte[] owner_not_exist = ByteArray.fromHexString(OWNER_ACCOUNT_NOT_Exist); - TransferContract transferContract = createTransferContract(to, owner_not_exist, 1); - Transaction.Builder trxBuilder = Transaction - .newBuilder(); - Transaction.raw.Builder rawBuilder = Transaction.raw.newBuilder(); - Contract.Builder contractBuilder = Contract.newBuilder(); - contractBuilder.setType(ContractType.TransferContract).setParameter(Any.pack(transferContract)); - rawBuilder.addContract(contractBuilder.build()); - trxBuilder.setRawData(rawBuilder.build()); - List prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign = sign(prikeys, Sha256Hash.hash(rawBuilder.build().toByteArray())); - trxBuilder.addAllSignature(sign); - - Account account = accountStore.get(ByteArray.fromHexString(OWNER_ADDRESS)).getInstance(); - Account.Builder builder = account.toBuilder(); - builder.clearPermissions(); - builder.addPermissions(permissions.get(0)); - builder.addPermissions(permissions.get(1)); - builder.addPermissions(permissions.get(2)); - accountStore.put(ByteArray.fromHexString(OWNER_ADDRESS), new AccountCapsule(builder.build())); - byte[] hash = Sha256Hash.hash("test".getBytes()); - - byte[] owner = ByteArray.fromHexString(OWNER_ADDRESS); - transferContract = createTransferContract(to, owner, 1); - contractBuilder = Contract.newBuilder(); - contractBuilder.setParameter(Any.pack(transferContract)).setType(ContractType.TransferContract); - rawBuilder.clearContract().addContract(contractBuilder.build()); - trxBuilder.setRawData(rawBuilder.build()); - - //SignatureFormatException - ByteString test = ByteString.copyFromUtf8("test"); - trxBuilder.clearSignature().addSignature(test); - try { - TransactionCapsule.validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertEquals(e.getMessage(), "Signature size is " + test.size()); - } - //SignatureException: Header byte out of range: - //Ignore more exception case. - byte[] rand = new byte[65]; - new Random().nextBytes(rand); - rand[64] = 8; // v = 8 < 27 v += 35 > 35 - trxBuilder.clearSignature().addSignature(ByteString.copyFrom(rand)); - try { - TransactionCapsule.validateSignature(trxBuilder.build(), hash, - accountStore); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertEquals(e.getMessage(), "Header byte out of range: 35"); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Permission is not contain KEY - prikeys = new ArrayList<>(); - prikeys.clear(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - prikeys.add(ByteArray.fromHexString(KEY_11)); - ArrayList sign21_11 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21_11); - try { - TransactionCapsule.validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - ByteString sign21 = sign21_11.get(1); - Assert.assertEquals(e.getMessage(), - ByteArray.toHexString(sign21.toByteArray()) + " is signed by " + Wallet - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) - + " but it is not contained of permission."); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - //Too many signature - prikeys.add(ByteArray.fromHexString(KEY_22)); - prikeys.add(ByteArray.fromHexString(KEY_23)); - ArrayList sign21_11_22_23 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21_11_22_23); - try { - TransactionCapsule - .validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - "Signature count is " + prikeys.size() + " more than key counts of permission : " - + permissions.get(1).getKeysCount()); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - //Sign twices by same key - prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - prikeys.add(ByteArray.fromHexString(KEY_22)); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign21_22_21 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21_22_21); - try { - TransactionCapsule - .validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertFalse(true); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertEquals(e.getMessage(), - WalletUtil.encode58Check(ByteArray.fromHexString(KEY_ADDRESS_21)) + " has signed twice!"); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - // - prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign21 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21); - try { - boolean result = TransactionCapsule - .validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertFalse(result); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - prikeys.add(ByteArray.fromHexString(KEY_22)); - ArrayList sign21_22 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21_22); - try { - boolean result = TransactionCapsule - .validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertTrue(result); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - - prikeys.add(ByteArray.fromHexString(KEY_23)); - ArrayList sign21_22_23 = sign(prikeys, hash); - trxBuilder.clearSignature().addAllSignature(sign21_22_23); - try { - boolean result = TransactionCapsule - .validateSignature(trxBuilder.build(), hash, accountStore); - Assert.assertTrue(result); - } catch (SignatureException e) { - Assert.assertFalse(true); - } catch (PermissionException e) { - Assert.assertFalse(true); - } catch (SignatureFormatException e) { - Assert.assertFalse(true); - } - } - - @Test - // test public boolean validateSignature(AccountStore accountStore) - public void validateSignature1() { - //Update permission, can signed by key21 key22 key23 - List permissions = buildPermissions(); - Account account = dbManager.getAccountStore().get(ByteArray.fromHexString(OWNER_ADDRESS)) - .getInstance(); - Account.Builder builder = account.toBuilder(); - builder.clearPermissions(); - builder.addPermissions(permissions.get(0)); - builder.addPermissions(permissions.get(1)); - builder.addPermissions(permissions.get(2)); - dbManager.getAccountStore() - .put(ByteArray.fromHexString(OWNER_ADDRESS), new AccountCapsule(builder.build())); - - byte[] to = ByteArray.fromHexString(TO_ADDRESS); - byte[] owner_not_exist = ByteArray.fromHexString(OWNER_ACCOUNT_NOT_Exist); - TransferContract transferContract = createTransferContract(to, owner_not_exist, 1); - Transaction.Builder trxBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = Transaction.raw.newBuilder(); - Contract.Builder contractBuilder = Contract.newBuilder(); - contractBuilder.setType(ContractType.TransferContract).setParameter(Any.pack(transferContract)) - .build(); - rawBuilder.addContract(contractBuilder); - trxBuilder.setRawData(rawBuilder); - TransactionCapsule transactionCapsule = new TransactionCapsule(trxBuilder.build()); - List prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign = sign(prikeys, Sha256Hash.hash(rawBuilder.build().toByteArray())); - trxBuilder.addAllSignature(sign); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - - // no contract - prikeys.clear(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - trxBuilder = Transaction.newBuilder(); - rawBuilder = Transaction.raw.newBuilder(); - rawBuilder.setTimestamp(System.currentTimeMillis()); - trxBuilder.setRawData(rawBuilder); - sign = sign(prikeys, Sha256Hash.hash(rawBuilder.build().toByteArray())); - trxBuilder.addAllSignature(sign); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), "miss sig or contract"); - } - // no sign - byte[] owner = ByteArray.fromHexString(OWNER_ADDRESS); - transferContract = createTransferContract(to, owner, 1); - transactionCapsule = new TransactionCapsule(transferContract, dbManager.getAccountStore()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), "miss sig or contract"); - } - - transactionCapsule = new TransactionCapsule(transferContract, dbManager.getAccountStore()); - byte[] hash = transactionCapsule.getTransactionId().getBytes(); - trxBuilder = transactionCapsule.getInstance().toBuilder(); - //SignatureFormatException - ByteString test = ByteString.copyFromUtf8("test"); - trxBuilder.clearSignature(); - trxBuilder.addSignature(test); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), "Signature size is " + test.size()); - } - //SignatureException: Header byte out of range: - //Ignore more exception case. - byte[] rand = new byte[65]; - new Random().nextBytes(rand); - rand[64] = 8; // v = 8 < 27 v += 35 > 35 - trxBuilder.clearSignature(); - trxBuilder.addSignature(ByteString.copyFrom(rand)); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), "Header byte out of range: 35"); - } - //Permission is not contain KEY - prikeys.clear(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - prikeys.add(ByteArray.fromHexString(KEY_11)); - ArrayList sign21_11 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21_11); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - ByteString sign21 = sign21_11.get(1); - Assert.assertEquals(e.getMessage(), - ByteArray.toHexString(sign21.toByteArray()) + " is signed by " + Wallet - .encode58Check(ByteArray.fromHexString(KEY_ADDRESS_11)) - + " but it is not contained of permission."); - } - //Too many signature - prikeys.add(ByteArray.fromHexString(KEY_22)); - prikeys.add(ByteArray.fromHexString(KEY_23)); - ArrayList sign21_11_22_23 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21_11_22_23); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), - "Signature count is " + prikeys.size() + " more than key counts of permission : " - + permissions.get(1).getKeysCount()); - } - - //Sign twices by same key - prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - prikeys.add(ByteArray.fromHexString(KEY_22)); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign21_22_21 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21_22_21); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), - WalletUtil.encode58Check(ByteArray.fromHexString(KEY_ADDRESS_21)) + " has signed twice!"); - } - - // - prikeys = new ArrayList<>(); - prikeys.add(ByteArray.fromHexString(KEY_21)); - ArrayList sign21 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - transactionCapsule.validateSignature(dbManager); - Assert.assertFalse(true); - } catch (ValidateSignatureException e) { - Assert.assertEquals(e.getMessage(), "sig error"); - } - - prikeys.add(ByteArray.fromHexString(KEY_22)); - ArrayList sign21_22 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21_22); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - boolean result = transactionCapsule.validateSignature(dbManager); - Assert.assertTrue(result); - } catch (ValidateSignatureException e) { - Assert.assertFalse(true); - } - - prikeys.add(ByteArray.fromHexString(KEY_23)); - ArrayList sign21_22_23 = sign(prikeys, hash); - trxBuilder.clearSignature(); - trxBuilder.addAllSignature(sign21_22_23); - transactionCapsule = new TransactionCapsule(trxBuilder.build()); - try { - boolean result = transactionCapsule.validateSignature(dbManager); - Assert.assertTrue(result); - } catch (ValidateSignatureException e) { - Assert.assertFalse(true); - } - }*/ - @Test public void trxCapsuleClearTest() { Transaction tx = Transaction.newBuilder() diff --git a/framework/src/test/java/org/tron/core/config/ConfigurationTest.java b/framework/src/test/java/org/tron/core/config/ConfigurationTest.java index 24a34dbcd0e..f3ca2da5312 100644 --- a/framework/src/test/java/org/tron/core/config/ConfigurationTest.java +++ b/framework/src/test/java/org/tron/core/config/ConfigurationTest.java @@ -17,7 +17,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.tron.common.utils.PublicMethod.getRandomPrivateKey; +import static org.tron.common.utils.client.utils.AbiUtil.generateOccupationConstantPrivateKey; +import static org.tron.core.Constant.ADD_PRE_FIX_STRING_MAINNET; import com.typesafe.config.Config; import java.lang.reflect.Field; @@ -46,13 +50,10 @@ public void resetSingleton() @Test public void testGetEcKey() { - ECKey key = ECKey.fromPrivate( - Hex.decode("1cd5a70741c6e583d2dd3c5f17231e608eb1e52437210d948c5085e141c2d830")); - - //log.debug("address = {}", ByteArray.toHexString(key.getOwnerAddress())); - - assertEquals(Wallet.getAddressPreFixString() + "125b6c87b3d67114b3873977888c34582f27bbb0", - ByteArray.toHexString(key.getAddress())); + ECKey key = ECKey.fromPrivate(Hex.decode(generateOccupationConstantPrivateKey())); + assertNotNull(key); + assertEquals("2e988a386a799f506693793c6a5af6b54dfaabfb", + ByteArray.toHexString(key.getAddress()).substring(2)); } @Test(expected = IllegalArgumentException.class) diff --git a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java index 157a7ba732f..94d7f38cd8a 100755 --- a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java @@ -1,5 +1,8 @@ package org.tron.core.zksnark; +import static org.tron.common.utils.PublicMethod.getHexAddressByPrivateKey; +import static org.tron.common.utils.PublicMethod.getRandomPrivateKey; + import com.google.common.primitives.Bytes; import com.google.protobuf.Any; import com.google.protobuf.ByteString; @@ -125,8 +128,8 @@ public class ShieldedReceiveTest extends BaseTest { static { Args.setParam(new String[]{"--output-directory", dbPath()}, "config-localtest.conf"); - ADDRESS_ONE_PRIVATE_KEY = PublicMethod.getRandomPrivateKey(); - FROM_ADDRESS = PublicMethod.getHexAddressByPrivateKey(ADDRESS_ONE_PRIVATE_KEY);; + ADDRESS_ONE_PRIVATE_KEY = getRandomPrivateKey(); + FROM_ADDRESS = getHexAddressByPrivateKey(ADDRESS_ONE_PRIVATE_KEY);; } /** @@ -2395,10 +2398,10 @@ public void testMemoNotEnough() throws ContractValidateException, TooBigTransact */ @Test public void pushSameSkAndScanAndSpend() throws Exception { - - byte[] privateKey = ByteArray - .fromHexString("f4df789d3210ac881cb900464dd30409453044d2777060a0c391cbdf4c6a4f57"); + List localPrivateKeys = Args.getLocalWitnesses().getPrivateKeys(); + byte[] privateKey = ByteArray.fromHexString(localPrivateKeys.get(0)); final ECKey ecKey = ECKey.fromPrivate(privateKey); + assert ecKey != null; byte[] witnessAddress = ecKey.getAddress(); WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(witnessAddress)); chainBaseManager.addWitness(ByteString.copyFrom(witnessAddress)); diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 62337f02fc5..92179ec6b54 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -132,7 +132,7 @@ node { dnsDomain = "nodes1.example.org" # dns private key used to publish, required if publish is true, hex string of length 64 - dnsPrivate = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" + dnsPrivate = "1234567890123456789012345678901234567890123456789012345678901234" # known dns urls to publish if publish is true, url format tree://{pubkey}@{domain}, default empty knownUrls = [ diff --git a/framework/src/test/resources/testng.conf b/framework/src/test/resources/testng.conf index 2e5b9a375e0..ea4f25ad87b 100644 --- a/framework/src/test/resources/testng.conf +++ b/framework/src/test/resources/testng.conf @@ -98,56 +98,16 @@ ethHttpsNode = { foundationAccount = { - key1 = FC8BF0238748587B9617EB6D15D47A66C0E07C1A1959033CF249C6532DC29FE6 - key2 = 6815B367FDDE637E53E9ADC8E69424E07724333C9A2B973CFA469975E20753FC - #Main_in_mock_foundationAccount_key - #key1 = 324a2052e491e99026442d81df4d2777292840c1b3949e20696c49096c6bacb8 - #key2 = 2925e186bb1e88988855f11ebf20ea3a6e19ed92328b0ffb576122e769d45b68 + } witness = { - key1 = 369F095838EB6EED45D4F6312AF962D5B9DE52927DA9F04174EE49F9AF54BC77 - key2 = 9FD8E129DE181EA44C6129F727A6871440169568ADE002943EAD0E7A16D8EDAC - key3 = 291C233A5A7660FB148BAE07FCBCF885224F2DF453239BD983F859E8E5AA4602 - key4 = 99676348CBF9501D07819BD4618ED885210CB5A03FEAF6BFF28F0AF8E1DE7DBE - key5 = FA090CFB9F3A6B00BE95FE185E82BBCFC4DA959CA6A795D275635ECF5D58466D - #replay env witness - #key1 = 0528dc17428585fc4dece68b79fa7912270a1fe8e85f244372f59eb7e8925e04 - #key2 = 553c7b0dee17d3f5b334925f5a90fe99fb0b93d47073d69ec33eead8459d171e - #key3 = 324a2052e491e99026442d81df4d2777292840c1b3949e20696c49096c6bacb8 - #key4 = ff5d867c4434ac17d264afc6696e15365832d5e8000f75733ebb336d66df148d - #key5 = 2925e186bb1e88988855f11ebf20ea3a6e19ed92328b0ffb576122e769d45b68 + } mainWitness = { - key1 = 22a6aca17f8ec257cc57e190902767d7fedf908bba920b4fbeaab8f158e0da17 - key2 = b6d8d3382c32d4d066c4f830a7e53c3da9ad8b9665dda4ca081b6cd4e807d09c - key3 = 03caf867c46aaf86d56aa446db80cb49305126b77bfaccfe57ab17bdb4993ccc - key4 = 763009595dd132aaf2d248999f2c6e7ba0acbbd9a9dfd88f7c2c158d97327645 - key5 = a21a3074d4d84685efaffcd7c04e3eccb541ec4c85f61c41a099cd598ad39825 - key6 = 541a2d585fcea7e9b1803df4eb49af0eb09f1fa2ce06aa5b8ed60ac95655d66d - key7 = 7d5a7396d6430edb7f66aa5736ef388f2bea862c9259de8ad8c2cfe080f6f5a0 - key8 = 7c4977817417495f4ca0c35ab3d5a25e247355d68f89f593f3fea2ab62c8644f - key9 = 4521c13f65cc9f5c1daa56923b8598d4015801ad28379675c64106f5f6afec30 - key10 = f33101ea976d90491dcb9669be568db8bbc1ad23d90be4dede094976b67d550e - key11 = 1bb32958909299db452d3c9bbfd15fd745160d63e4985357874ee57708435a00 - key12 = 29c91bd8b27c807d8dc2d2991aa0fbeafe7f54f4de9fac1e1684aa57242e3922 - key13 = 97317d4d68a0c5ce14e74ad04dfc7521f142f5c0f247b632c8f94c755bdbe669 - key14 = 1fe1d91bbe3ac4ac5dc9866c157ef7615ec248e3fd4f7d2b49b0428da5e046b2 - key15 = 7c37ef485e186e07952bcc8e30cd911a6cd9f2a847736c89132762fb67a42329 - key16 = bcc142d57d872cd2cc1235bca454f2efd5a87f612856c979cc5b45a7399272a8 - key17 = 6054824dc03546f903a06da1f405e72409379b83395d0bbb3d4563f56e828d52 - key18 = 87cc8832b1b4860c3c69994bbfcdae9b520e6ce40cbe2a90566e707a7e04fc70 - key19 = c96c92c8a5f68ffba2ced3f7cd4baa6b784838a366f62914efdc79c6c18cd7d0 - key20 = d29e34899a21dc801c2be88184bed29a66246b5d85f26e8c77922ee2403a1934 - key21 = dc51f31e4de187c1c2530d65fb8f2958dff4c37f8cea430ce98d254baae37564 - key22 = ff43b371d67439bb8b6fa6c4ff615c954682008343d4cb2583b19f50adbac90f - key23 = dbc78781ad27f3751358333412d5edc85b13e5eee129a1a77f7232baadafae0e - key24 = a79a37a3d868e66456d76b233cb894d664b75fd91861340f3843db05ab3a8c66 - key25 = a8107ea1c97c90cd4d84e79cd79d327def6362cc6fd498fc3d3766a6a71924f6 - key26 = b5076206430b2ca069ae2f4dc6f20dd0d74551559878990d1df12a723c228039 - key27 = 442513e2e801bc42d14d33b8148851dae756d08eeb48881a44e1b2002b3fb700 + } defaultParameter = { diff --git a/plugins/src/test/java/org/tron/plugins/DbLiteTest.java b/plugins/src/test/java/org/tron/plugins/DbLiteTest.java index 5cb8c26c4bc..a0ab366e9fc 100644 --- a/plugins/src/test/java/org/tron/plugins/DbLiteTest.java +++ b/plugins/src/test/java/org/tron/plugins/DbLiteTest.java @@ -1,5 +1,7 @@ package org.tron.plugins; +import static org.tron.common.utils.PublicMethod.getRandomPrivateKey; + import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.io.File; @@ -159,7 +161,7 @@ private void generateSomeTransactions(int during) { ECKey ecKey2 = new ECKey(Utils.getRandom()); byte[] address = ecKey2.getAddress(); - String sunPri = "cba92a516ea09f620a16ff7ee95ce0df1d56550a8babe9964981a7144c8a784a"; + String sunPri = getRandomPrivateKey(); byte[] sunAddress = PublicMethod.getFinalAddress(sunPri); PublicMethod.sendcoin(address, 1L, sunAddress, sunPri, blockingStubFull); From 0642903884e47fb0d988776a8ffd59a96c6133f2 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Wed, 8 Jan 2025 14:22:53 +0800 Subject: [PATCH 030/107] feat(exception): add TronError --- .../org/tron/core/exception/TronError.java | 56 +++++++++++++++++++ .../tron/core/exception/TronErrorTest.java | 19 +++++++ 2 files changed, 75 insertions(+) create mode 100644 common/src/main/java/org/tron/core/exception/TronError.java create mode 100644 framework/src/test/java/org/tron/core/exception/TronErrorTest.java diff --git a/common/src/main/java/org/tron/core/exception/TronError.java b/common/src/main/java/org/tron/core/exception/TronError.java new file mode 100644 index 00000000000..c7ddfc38bad --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/TronError.java @@ -0,0 +1,56 @@ +package org.tron.core.exception; + +import lombok.Getter; + +/** + * If a {@link TronError} is thrown, the service will trigger {@link System#exit(int)} by + * {@link Thread#setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)}. + * NOTE: Do not attempt to catch {@link TronError}. + */ +@Getter +public class TronError extends Error { + + private final ErrCode errCode; + + public TronError(String message, ErrCode exitCode) { + super(message); + this.errCode = exitCode; + } + + public TronError(String message, Throwable cause, ErrCode exitCode) { + super(message, cause); + this.errCode = exitCode; + } + + public TronError(Throwable cause, ErrCode exitCode) { + super(cause); + this.errCode = exitCode; + } + + @Getter + public enum ErrCode { + WITNESS_KEYSTORE_LOAD(-1), + CHECKPOINT_VERSION(-1), + LEVELDB_INIT(1), + ROCKSDB_INIT(1), + DB_FLUSH(1), + REWARD_VI_CALCULATOR(1), + KHAOS_DB_INIT(1), + GENESIS_BLOCK_INIT(1), + EVENT_SUBSCRIBE_ERROR(1), + AUTO_STOP_PARAMS(1), + API_SERVER_INIT(1), + SOLID_NODE_INIT(0); + + private final int code; + + ErrCode(int code) { + this.code = code; + } + + @Override + public String toString() { + return name() + "(" + code + ")"; + } + } +} diff --git a/framework/src/test/java/org/tron/core/exception/TronErrorTest.java b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java new file mode 100644 index 00000000000..0ec1bcca349 --- /dev/null +++ b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java @@ -0,0 +1,19 @@ +package org.tron.core.exception; + +import org.junit.Assert; +import org.junit.Test; + +public class TronErrorTest { + + @Test + public void testTronError() { + TronError tronError = new TronError("message", TronError.ErrCode.WITNESS_KEYSTORE_LOAD); + Assert.assertEquals(tronError.getErrCode(), TronError.ErrCode.WITNESS_KEYSTORE_LOAD); + Assert.assertEquals(tronError.getErrCode().toString(), "WITNESS_KEYSTORE_LOAD(-1)"); + Assert.assertEquals(tronError.getErrCode().getCode(), -1); + tronError = new TronError("message", new Throwable(), TronError.ErrCode.API_SERVER_INIT); + Assert.assertEquals(tronError.getErrCode(), TronError.ErrCode.API_SERVER_INIT); + tronError = new TronError(new Throwable(), TronError.ErrCode.LEVELDB_INIT); + Assert.assertEquals(tronError.getErrCode(), TronError.ErrCode.LEVELDB_INIT); + } +} From b57411fd827d3798180fb0cc9f2a5ff068b2b82d Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 6 Feb 2025 15:31:23 +0800 Subject: [PATCH 031/107] feat(transaction): optimize transactions during the consensus phase --- .../java/org/tron/core/ChainBaseManager.java | 9 +++++++ .../org/tron/core/db/BandwidthProcessor.java | 6 +++-- .../src/main/java/org/tron/core/Wallet.java | 2 +- .../main/java/org/tron/core/db/Manager.java | 8 ++++++- .../org/tron/core/net/TronNetDelegate.java | 8 ------- .../TransactionsMsgHandler.java | 5 +++- .../java/org/tron/core/db/ManagerTest.java | 24 +++++++++++++++++++ 7 files changed, 49 insertions(+), 13 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java index d148021f6c4..21f0bac8d77 100644 --- a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java +++ b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java @@ -380,6 +380,15 @@ public static synchronized void init(ChainBaseManager manager) { AssetUtil.setDynamicPropertiesStore(manager.getDynamicPropertiesStore()); } + public long getNextBlockSlotTime() { + long slotCount = 1; + if (dynamicPropertiesStore.getStateFlag() == 1) { + slotCount += dynamicPropertiesStore.getMaintenanceSkipSlots(); + } + return dynamicPropertiesStore.getLatestBlockHeaderTimestamp() + + slotCount * BLOCK_PRODUCED_INTERVAL; + } + @PostConstruct private void init() { this.lowestBlockNum = this.blockIndexStore.getLimitNumber(1, 1).stream() diff --git a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java index 3f0db86c537..73b9efaa35e 100644 --- a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java @@ -99,7 +99,9 @@ public void consume(TransactionCapsule trx, TransactionTrace trace) TooBigTransactionResultException, TooBigTransactionException { List contracts = trx.getInstance().getRawData().getContractList(); long resultSizeWithMaxContractRet = trx.getResultSizeWithMaxContractRet(); - if (!trx.isInBlock() && resultSizeWithMaxContractRet > + boolean optimizeTxs = !trx.isInBlock() || chainBaseManager + .getDynamicPropertiesStore().allowConsensusLogicOptimization(); + if (optimizeTxs && resultSizeWithMaxContractRet > Constant.MAX_RESULT_SIZE_IN_TX * contracts.size()) { throw new TooBigTransactionResultException(String.format( "Too big transaction result, TxId %s, the result size is %d bytes, maxResultSize %d", @@ -135,7 +137,7 @@ public void consume(TransactionCapsule trx, TransactionTrace trace) } long now = chainBaseManager.getHeadSlot(); if (contractCreateNewAccount(contract)) { - if (!trx.isInBlock()) { + if (optimizeTxs) { long maxCreateAccountTxSize = dynamicPropertiesStore.getMaxCreateAccountTxSize(); int signatureCount = trx.getInstance().getSignatureCount(); long createAccountBytesSize = trx.getInstance().toBuilder().clearRet() diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index e2eea8700d1..3297eb02df8 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -549,7 +549,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { throw new ContractValidateException(ActuatorConstant.CONTRACT_NOT_EXIST); } TransactionMessage message = new TransactionMessage(trx.getInstance().toByteArray()); - trx.checkExpiration(tronNetDelegate.getNextBlockSlotTime()); + trx.checkExpiration(chainBaseManager.getNextBlockSlotTime()); dbManager.pushTransaction(trx); int num = tronNetService.fastBroadcastTransaction(message); if (num == 0 && minEffectiveConnection != 0) { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 908e248bdee..8311c8c6a71 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -794,7 +794,9 @@ void validateTapos(TransactionCapsule transactionCapsule) throws TaposException void validateCommon(TransactionCapsule transactionCapsule) throws TransactionExpirationException, TooBigTransactionException { - if (!transactionCapsule.isInBlock()) { + boolean optimizeTxs = !transactionCapsule.isInBlock() || chainBaseManager + .getDynamicPropertiesStore().allowConsensusLogicOptimization(); + if (optimizeTxs) { transactionCapsule.removeRedundantRet(); long generalBytesSize = transactionCapsule.getInstance().toBuilder().clearRet().build().getSerializedSize() @@ -813,6 +815,10 @@ void validateCommon(TransactionCapsule transactionCapsule) } long transactionExpiration = transactionCapsule.getExpiration(); long headBlockTime = chainBaseManager.getHeadBlockTimeStamp(); + if (transactionCapsule.isInBlock() + && chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()) { + transactionCapsule.checkExpiration(chainBaseManager.getNextBlockSlotTime()); + } if (transactionExpiration <= headBlockTime || transactionExpiration > headBlockTime + Constant.MAXIMUM_TIME_UNTIL_EXPIRATION) { throw new TransactionExpirationException( diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index a6f9812a2d7..cd9c8f01d8b 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -380,12 +380,4 @@ public boolean isBlockUnsolidified() { return headNum - solidNum >= maxUnsolidifiedBlocks; } - public long getNextBlockSlotTime() { - long slotCount = 1; - if (chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1) { - slotCount += chainBaseManager.getDynamicPropertiesStore().getMaintenanceSkipSlots(); - } - return chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp() - + slotCount * BLOCK_PRODUCED_INTERVAL; - } } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java index 0c58fe08cd6..e537e7edfbe 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.es.ExecutorServiceManager; +import org.tron.core.ChainBaseManager; import org.tron.core.config.args.Args; import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; @@ -36,6 +37,8 @@ public class TransactionsMsgHandler implements TronMsgHandler { private TronNetDelegate tronNetDelegate; @Autowired private AdvService advService; + @Autowired + private ChainBaseManager chainBaseManager; private BlockingQueue smartContractQueue = new LinkedBlockingQueue(MAX_TRX_SIZE); @@ -129,7 +132,7 @@ private void handleTransaction(PeerConnection peer, TransactionMessage trx) { } try { - trx.getTransactionCapsule().checkExpiration(tronNetDelegate.getNextBlockSlotTime()); + trx.getTransactionCapsule().checkExpiration(chainBaseManager.getNextBlockSlotTime()); tronNetDelegate.pushTransaction(trx.getTransactionCapsule()); advService.broadcast(trx); } catch (P2pException e) { diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 07440435f41..1553ba15ec3 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -1158,6 +1158,30 @@ public void testTooBigTransaction() { } + @Test + public void testExpiration() { + dbManager.getDynamicPropertiesStore().saveConsensusLogicOptimization(1); + TransferContract transferContract = + TransferContract.newBuilder() + .setAmount(10) + .setOwnerAddress(ByteString.copyFromUtf8("aaa")) + .setToAddress(ByteString.copyFromUtf8("bbb")) + .build(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 100; i++) { + sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + } + Transaction transaction = Transaction.newBuilder().setRawData(Transaction.raw.newBuilder() + .setData(ByteString.copyFrom(sb.toString().getBytes(StandardCharsets.UTF_8))) + .addContract(Transaction.Contract.newBuilder().setParameter(Any.pack(transferContract)) + .setType(ContractType.TransferContract))).build(); + TransactionCapsule trx = new TransactionCapsule(transaction); + trx.setInBlock(true); + + assertThrows(TransactionExpirationException.class, () -> dbManager.validateCommon(trx)); + + } + @Test public void blockTrigger() { exit.expectSystemExitWithStatus(1); From 5619441399fb5535b1010593e452b4eee6f26fbe Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 13 May 2024 21:31:51 +0800 Subject: [PATCH 032/107] feat(api): optimize api service startup --- .../common/parameter/CommonParameter.java | 18 + .../src/main/java/org/tron/core/Constant.java | 8 +- .../common/application/AbstractService.java | 73 +++ .../tron/common/application/Application.java | 10 - .../common/application/ApplicationImpl.java | 33 +- .../common/application/CliApplication.java | 22 - .../tron/common/application/HttpService.java | 76 ++- .../tron/common/application/RpcService.java | 121 +++-- .../org/tron/common/application/Service.java | 23 +- .../common/application/ServiceContainer.java | 91 ++-- .../java/org/tron/core/config/args/Args.java | 28 ++ .../org/tron/core/services/RpcApiService.java | 93 +--- .../services/http/FullNodeHttpApiService.java | 475 +++++++++--------- .../solidity/SolidityNodeHttpApiService.java | 232 ++++----- .../JsonRpcServiceOnPBFT.java | 36 +- .../JsonRpcServiceOnSolidity.java | 35 +- .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 82 +-- .../http/PBFT/HttpApiOnPBFTService.java | 204 ++++---- .../RpcApiServiceOnSolidity.java | 80 +-- .../solidity/HttpApiOnSolidityService.java | 242 +++++---- .../jsonrpc/FullNodeJsonRpcHttpService.java | 47 +- .../org/tron/core/zen/ZksnarkInitService.java | 2 - .../main/java/org/tron/program/FullNode.java | 59 --- .../java/org/tron/program/SolidityNode.java | 25 +- framework/src/main/resources/config.conf | 8 +- .../tron/common/jetty/JettyServerTest.java | 3 +- .../org/tron/core/config/args/ArgsTest.java | 99 +++- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 11 +- .../core/metrics/MetricsApiServiceTest.java | 4 +- .../test/java/org/tron/core/net/BaseNet.java | 12 +- .../java/org/tron/core/pbft/PbftApiTest.java | 8 +- .../core/services/RpcApiServicesTest.java | 11 +- .../org/tron/core/services/WalletApiTest.java | 30 +- .../filter/HttpApiAccessFilterTest.java | 20 +- .../LiteFnQueryGrpcInterceptorTest.java | 9 +- .../filter/LiteFnQueryHttpFilterTest.java | 26 +- .../filter/RpcApiAccessInterceptorTest.java | 11 +- .../services/http/BroadcastServletTest.java | 4 +- .../http/TriggerSmartContractServletTest.java | 21 +- ...GetTransactionByIdSolidityServletTest.java | 7 +- .../org/tron/program/SolidityNodeTest.java | 41 +- .../src/test/resources/config-localtest.conf | 20 +- .../src/test/resources/config-test-index.conf | 16 +- .../test/resources/config-test-mainnet.conf | 18 + framework/src/test/resources/config-test.conf | 16 +- .../java/org/tron/plugins/DbLiteTest.java | 5 +- 46 files changed, 1175 insertions(+), 1340 deletions(-) create mode 100644 framework/src/main/java/org/tron/common/application/AbstractService.java diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index d4a7b064cbb..8b599035f64 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -456,12 +456,30 @@ public class CommonParameter { @Getter @Setter public String cryptoEngine = Constant.ECKey_ENGINE; + + @Getter + @Setter + public boolean rpcEnable = true; + + @Getter + @Setter + public boolean rpcSolidityEnable = true; + + @Getter + @Setter + public boolean rpcPBFTEnable = true; + @Getter @Setter public boolean fullNodeHttpEnable = true; @Getter @Setter public boolean solidityNodeHttpEnable = true; + + @Getter + @Setter + public boolean pBFTHttpEnable = true; + @Getter @Setter public boolean jsonRpcHttpFullNodeEnable = false; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 3bdbf2113af..2043ba7fcdc 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -124,15 +124,21 @@ public class Constant { public static final String NODE_DNS_AWS_REGION = "node.dns.awsRegion"; public static final String NODE_DNS_AWS_HOST_ZONE_ID = "node.dns.awsHostZoneId"; + // config for rpc public static final String NODE_RPC_PORT = "node.rpc.port"; public static final String NODE_RPC_SOLIDITY_PORT = "node.rpc.solidityPort"; public static final String NODE_RPC_PBFT_PORT = "node.rpc.PBFTPort"; + public static final String NODE_RPC_ENABLE = "node.rpc.enable"; + public static final String NODE_RPC_SOLIDITY_ENABLE = "node.rpc.solidityEnable"; + public static final String NODE_RPC_PBFT_ENABLE = "node.rpc.PBFTEnable"; + // config for http public static final String NODE_HTTP_FULLNODE_PORT = "node.http.fullNodePort"; public static final String NODE_HTTP_SOLIDITY_PORT = "node.http.solidityPort"; public static final String NODE_HTTP_FULLNODE_ENABLE = "node.http.fullNodeEnable"; public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; + public static final String NODE_HTTP_PBFT_ENABLE = "node.http.PBFTEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; - + // config for jsonrpc public static final String NODE_JSONRPC_HTTP_FULLNODE_ENABLE = "node.jsonrpc.httpFullNodeEnable"; public static final String NODE_JSONRPC_HTTP_FULLNODE_PORT = "node.jsonrpc.httpFullNodePort"; public static final String NODE_JSONRPC_HTTP_SOLIDITY_ENABLE = "node.jsonrpc.httpSolidityEnable"; diff --git a/framework/src/main/java/org/tron/common/application/AbstractService.java b/framework/src/main/java/org/tron/common/application/AbstractService.java new file mode 100644 index 00000000000..79c25dc4944 --- /dev/null +++ b/framework/src/main/java/org/tron/common/application/AbstractService.java @@ -0,0 +1,73 @@ +package org.tron.common.application; + +import com.google.common.base.Objects; +import java.util.concurrent.CompletableFuture; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.tron.core.config.args.Args; + + +@Slf4j(topic = "service") +public abstract class AbstractService implements Service { + + protected int port; + @Getter + protected boolean enable; + @Getter + protected final String name = this.getClass().getSimpleName(); + + + @Override + public CompletableFuture start() { + logger.info("{} starting on {}", name, port); + final CompletableFuture resultFuture = new CompletableFuture<>(); + try { + innerStart(); + resultFuture.complete(true); + logger.info("{} started, listening on {}", name, port); + } catch (Exception e) { + resultFuture.completeExceptionally(e); + } + return resultFuture; + } + + @Override + public CompletableFuture stop() { + logger.info("{} shutdown...", name); + final CompletableFuture resultFuture = new CompletableFuture<>(); + try { + innerStop(); + resultFuture.complete(true); + logger.info("{} shutdown complete", name); + } catch (Exception e) { + resultFuture.completeExceptionally(e); + } + return resultFuture; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AbstractService that = (AbstractService) o; + return port == that.port; + } + + @Override + public int hashCode() { + return Objects.hashCode(name, port); + } + + public abstract void innerStart() throws Exception; + + public abstract void innerStop() throws Exception; + + protected boolean isFullNode() { + return !Args.getInstance().isSolidityNode(); + } + +} diff --git a/framework/src/main/java/org/tron/common/application/Application.java b/framework/src/main/java/org/tron/common/application/Application.java index 3d7e7a10864..0cdcca70580 100644 --- a/framework/src/main/java/org/tron/common/application/Application.java +++ b/framework/src/main/java/org/tron/common/application/Application.java @@ -15,19 +15,11 @@ package org.tron.common.application; -import org.tron.common.parameter.CommonParameter; import org.tron.core.ChainBaseManager; -import org.tron.core.config.args.Args; import org.tron.core.db.Manager; public interface Application { - void setOptions(Args args); - - void init(CommonParameter parameter); - - void initServices(CommonParameter parameter); - void startup(); void shutdown(); @@ -40,8 +32,6 @@ default void blockUntilShutdown() { void shutdownServices(); - void addService(Service service); - Manager getDbManager(); ChainBaseManager getChainBaseManager(); diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index 3cb75cb1e24..bfd6c939e89 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -1,9 +1,9 @@ package org.tron.common.application; +import java.util.concurrent.CountDownLatch; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.tron.common.parameter.CommonParameter; import org.tron.core.ChainBaseManager; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; @@ -15,6 +15,7 @@ @Component public class ApplicationImpl implements Application { + @Autowired private ServiceContainer services; @Autowired @@ -29,32 +30,12 @@ public class ApplicationImpl implements Application { @Autowired private ConsensusService consensusService; - @Override - public void setOptions(Args args) { - // not used - } - - @Override - @Autowired - public void init(CommonParameter parameter) { - services = new ServiceContainer(); - } - - @Override - public void addService(Service service) { - services.add(service); - } - - @Override - public void initServices(CommonParameter parameter) { - services.init(parameter); - } + private final CountDownLatch shutdown = new CountDownLatch(1); /** * start up the app. */ public void startup() { - this.initServices(Args.getInstance()); this.startServices(); if ((!Args.getInstance().isSolidityNode()) && (!Args.getInstance().isP2pDisable())) { tronNetService.start(); @@ -71,6 +52,7 @@ public void shutdown() { tronNetService.close(); } dbManager.close(); + shutdown.countDown(); } @Override @@ -80,7 +62,12 @@ public void startServices() { @Override public void blockUntilShutdown() { - services.blockUntilShutdown(); + try { + shutdown.await(); + } catch (final InterruptedException e) { + logger.debug("Interrupted, exiting", e); + Thread.currentThread().interrupt(); + } } @Override diff --git a/framework/src/main/java/org/tron/common/application/CliApplication.java b/framework/src/main/java/org/tron/common/application/CliApplication.java index 288149da4e4..bb056a34c11 100644 --- a/framework/src/main/java/org/tron/common/application/CliApplication.java +++ b/framework/src/main/java/org/tron/common/application/CliApplication.java @@ -15,28 +15,11 @@ package org.tron.common.application; -import org.tron.common.parameter.CommonParameter; import org.tron.core.ChainBaseManager; -import org.tron.core.config.args.Args; import org.tron.core.db.Manager; public class CliApplication implements Application { - @Override - public void setOptions(Args args) { - - } - - @Override - public void init(CommonParameter parameter) { - - } - - @Override - public void initServices(CommonParameter parameter) { - - } - @Override public void startup() { @@ -57,11 +40,6 @@ public void shutdownServices() { } - @Override - public void addService(Service service) { - - } - @Override public Manager getDbManager() { return null; diff --git a/framework/src/main/java/org/tron/common/application/HttpService.java b/framework/src/main/java/org/tron/common/application/HttpService.java index 76f8e74d65c..e9a902002ba 100644 --- a/framework/src/main/java/org/tron/common/application/HttpService.java +++ b/framework/src/main/java/org/tron/common/application/HttpService.java @@ -15,67 +15,61 @@ package org.tron.common.application; -import com.google.common.base.Objects; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.tron.core.config.args.Args; @Slf4j(topic = "rpc") -public abstract class HttpService implements Service { +public abstract class HttpService extends AbstractService { protected Server apiServer; - protected int port; + + protected String contextPath; @Override - public void blockUntilShutdown() { - if (apiServer != null) { - try { - apiServer.join(); - } catch (InterruptedException e) { - logger.warn("{}", e.getMessage()); - Thread.currentThread().interrupt(); - } + public void innerStart() throws Exception { + if (this.apiServer != null) { + this.apiServer.start(); } } @Override - public void start() { - if (apiServer != null) { - try { - apiServer.start(); - logger.info("{} started, listening on {}", this.getClass().getSimpleName(), port); - } catch (Exception e) { - logger.error("{}", this.getClass().getSimpleName(), e); - } + public void innerStop() throws Exception { + if (this.apiServer != null) { + this.apiServer.stop(); } } @Override - public void stop() { - if (apiServer != null) { - logger.info("{} shutdown...", this.getClass().getSimpleName()); - try { - apiServer.stop(); - } catch (Exception e) { - logger.warn("{}", this.getClass().getSimpleName(), e); - } - logger.info("{} shutdown complete", this.getClass().getSimpleName()); - } + public CompletableFuture start() { + initServer(); + ServletContextHandler context = initContextHandler(); + addServlet(context); + addFilter(context); + return super.start(); } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + protected void initServer() { + this.apiServer = new Server(this.port); + int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); + if (maxHttpConnectNumber > 0) { + this.apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, this.apiServer)); } - if (o == null || getClass() != o.getClass()) { - return false; - } - HttpService that = (HttpService) o; - return port == that.port; } - @Override - public int hashCode() { - return Objects.hashCode(getClass().getSimpleName(), port); + protected ServletContextHandler initContextHandler() { + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath(this.contextPath); + this.apiServer.setHandler(context); + return context; + } + + protected abstract void addServlet(ServletContextHandler context); + + protected void addFilter(ServletContextHandler context) { + } } diff --git a/framework/src/main/java/org/tron/common/application/RpcService.java b/framework/src/main/java/org/tron/common/application/RpcService.java index cb89441174a..2d118806e2c 100644 --- a/framework/src/main/java/org/tron/common/application/RpcService.java +++ b/framework/src/main/java/org/tron/common/application/RpcService.java @@ -15,71 +15,106 @@ package org.tron.common.application; -import com.google.common.base.Objects; import io.grpc.Server; -import java.io.IOException; +import io.grpc.netty.NettyServerBuilder; +import io.grpc.protobuf.services.ProtoReflectionService; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; +import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; +import org.tron.core.services.ratelimiter.PrometheusInterceptor; +import org.tron.core.services.ratelimiter.RateLimiterInterceptor; +import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; @Slf4j(topic = "rpc") -public abstract class RpcService implements Service { +public abstract class RpcService extends AbstractService { - protected Server apiServer; - protected int port; + private Server apiServer; + protected String executorName; + + @Autowired + private RateLimiterInterceptor rateLimiterInterceptor; + + @Autowired + private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; + + @Autowired + private RpcApiAccessInterceptor apiAccessInterceptor; + + @Autowired + private PrometheusInterceptor prometheusInterceptor; @Override - public void blockUntilShutdown() { - if (apiServer != null) { - try { - apiServer.awaitTermination(); - } catch (InterruptedException e) { - logger.warn("{}", e.getMessage()); - Thread.currentThread().interrupt(); - } + public void innerStart() throws Exception { + if (this.apiServer != null) { + this.apiServer.start(); } } @Override - public void start() { - if (apiServer != null) { - try { - apiServer.start(); - logger.info("{} started, listening on {}", this.getClass().getSimpleName(), port); - } catch (IOException e) { - logger.error("{}", this.getClass().getSimpleName(), e); - } + public void innerStop() throws Exception { + if (this.apiServer != null) { + this.apiServer.shutdown().awaitTermination(5, TimeUnit.SECONDS); } } @Override - public void stop() { - if (apiServer != null) { - logger.info("{} shutdown...", this.getClass().getSimpleName()); - try { - apiServer.shutdown().awaitTermination(5, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - logger.warn("{}", this.getClass().getSimpleName(), e); - } - logger.info("{} shutdown complete", this.getClass().getSimpleName()); - } + public CompletableFuture start() { + NettyServerBuilder serverBuilder = initServerBuilder(); + addService(serverBuilder); + addInterceptor(serverBuilder); + initServer(serverBuilder); + this.rateLimiterInterceptor.init(this.apiServer); + return super.start(); } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + protected NettyServerBuilder initServerBuilder() { + NettyServerBuilder serverBuilder = NettyServerBuilder.forPort(this.port); + CommonParameter parameter = Args.getInstance(); + if (parameter.getRpcThreadNum() > 0) { + serverBuilder = serverBuilder + .executor(ExecutorServiceManager.newFixedThreadPool( + this.executorName, parameter.getRpcThreadNum())); } - if (o == null || getClass() != o.getClass()) { - return false; + // Set configs from config.conf or default value + serverBuilder + .maxConcurrentCallsPerConnection(parameter.getMaxConcurrentCallsPerConnection()) + .flowControlWindow(parameter.getFlowControlWindow()) + .maxConnectionIdle(parameter.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) + .maxConnectionAge(parameter.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) + .maxInboundMessageSize(parameter.getMaxMessageSize()) + .maxHeaderListSize(parameter.getMaxHeaderListSize()); + + if (parameter.isRpcReflectionServiceEnable()) { + serverBuilder.addService(ProtoReflectionService.newInstance()); } - RpcService that = (RpcService) o; - return port == that.port; + return serverBuilder; } - @Override - public int hashCode() { - return Objects.hashCode(getClass().getSimpleName(), port); + protected abstract void addService(NettyServerBuilder serverBuilder); + + protected void addInterceptor(NettyServerBuilder serverBuilder) { + // add a ratelimiter interceptor + serverBuilder.intercept(this.rateLimiterInterceptor); + + // add api access interceptor + serverBuilder.intercept(this.apiAccessInterceptor); + + // add lite fullnode query interceptor + serverBuilder.intercept(this.liteFnQueryGrpcInterceptor); + + // add prometheus interceptor + if (Args.getInstance().isMetricsPrometheusEnable()) { + serverBuilder.intercept(prometheusInterceptor); + } + } + + protected void initServer(NettyServerBuilder serverBuilder) { + this.apiServer = serverBuilder.build(); } } diff --git a/framework/src/main/java/org/tron/common/application/Service.java b/framework/src/main/java/org/tron/common/application/Service.java index 67b4e3ce9ae..629e7e61a4c 100644 --- a/framework/src/main/java/org/tron/common/application/Service.java +++ b/framework/src/main/java/org/tron/common/application/Service.java @@ -15,22 +15,25 @@ package org.tron.common.application; -import org.tron.common.parameter.CommonParameter; +import java.util.concurrent.CompletableFuture; public interface Service { - void init(); - - void init(CommonParameter parameter); + /** + * Starts the service and all needed backend systems. + * + * @return completion state + */ + CompletableFuture start(); /** - * Start the service. - * {@link Service#init(CommonParameter parameter) init(CommonParameter parameter)} must be called - * before this method. + * Stops the service and performs needed cleanup. + * + * @return completion state */ - void start(); + CompletableFuture stop(); - void stop(); + boolean isEnable(); - void blockUntilShutdown(); + String getName(); } diff --git a/framework/src/main/java/org/tron/common/application/ServiceContainer.java b/framework/src/main/java/org/tron/common/application/ServiceContainer.java index 2951596add7..38ca3910e42 100644 --- a/framework/src/main/java/org/tron/common/application/ServiceContainer.java +++ b/framework/src/main/java/org/tron/common/application/ServiceContainer.java @@ -15,59 +15,80 @@ package org.tron.common.application; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; -import org.tron.common.parameter.CommonParameter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.exception.TronError; @Slf4j(topic = "app") +@Component public class ServiceContainer { - private final Set services; + @Autowired + private List services; - public ServiceContainer() { - this.services = Collections.synchronizedSet(new LinkedHashSet<>()); - } - - public void add(Service service) { - this.services.add(service); - } + private List enabledServices; - - public void init() { - this.services.forEach(service -> { - logger.debug("Initing {}.", service.getClass().getSimpleName()); - service.init(); - }); + public ServiceContainer() { } - public void init(CommonParameter parameter) { - this.services.forEach(service -> { - logger.debug("Initing {}.", service.getClass().getSimpleName()); - service.init(parameter); - }); + @PostConstruct + private void initEnabledServices() { + this.enabledServices = this.services.stream() + .filter(Service::isEnable) + .collect(Collectors.toList()); } - public void start() { + void start() { logger.info("Starting api services."); - this.services.forEach(service -> { - logger.debug("Starting {}.", service.getClass().getSimpleName()); - service.start(); - }); + this.enabledServices.forEach(this::waitForServiceToStart); logger.info("All api services started."); } - public void stop() { + void stop() { logger.info("Stopping api services."); - this.services.forEach(service -> { - logger.debug("Stopping {}.", service.getClass().getSimpleName()); - service.stop(); - }); + this.enabledServices.forEach(this::waitForServiceToStop); logger.info("All api services stopped."); } - public void blockUntilShutdown() { - this.services.stream().findFirst().ifPresent(Service::blockUntilShutdown); + private void waitForServiceToStart(Service service) { + final String serviceName = service.getName(); + final CompletableFuture startFuture = service.start(); + do { + try { + startFuture.get(60, TimeUnit.SECONDS); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + throw new TronError("Interrupted while waiting for service to start", e, + TronError.ErrCode.API_SERVER_INIT); + } catch (final ExecutionException e) { + throw new TronError("Service " + serviceName + " failed to start", e, + TronError.ErrCode.API_SERVER_INIT); + } catch (final TimeoutException e) { + logger.warn("Service {} is taking an unusually long time to start", serviceName); + } + } while (!startFuture.isDone()); + } + + private void waitForServiceToStop(Service service) { + final String serviceName = service.getName(); + final CompletableFuture stopFuture = service.stop(); + try { + stopFuture.get(30, TimeUnit.SECONDS); + } catch (final InterruptedException e) { + logger.debug("Interrupted while waiting for service {} to complete", serviceName, e); + Thread.currentThread().interrupt(); + } catch (final ExecutionException e) { + logger.error("Service {} failed to shutdown", serviceName, e); + } catch (final TimeoutException e) { + logger.error("Service {} did not shut down cleanly", serviceName); + } } } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 7397b69cde3..2ac3e69eced 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -96,6 +96,7 @@ public class Args extends CommonParameter { public static void clearParam() { + PARAMETER.shellConfFileName = ""; PARAMETER.outputDirectory = "output-directory"; PARAMETER.help = false; PARAMETER.witness = false; @@ -190,8 +191,12 @@ public static void clearParam() { PARAMETER.validContractProtoThreadNum = 1; PARAMETER.shieldedTransInPendingMaxCounts = 10; PARAMETER.changedDelegation = 0; + PARAMETER.rpcEnable = true; + PARAMETER.rpcSolidityEnable = true; + PARAMETER.rpcPBFTEnable = true; PARAMETER.fullNodeHttpEnable = true; PARAMETER.solidityNodeHttpEnable = true; + PARAMETER.pBFTHttpEnable = true; PARAMETER.jsonRpcHttpFullNodeEnable = false; PARAMETER.jsonRpcHttpSolidityNodeEnable = false; PARAMETER.jsonRpcHttpPBFTNodeEnable = false; @@ -364,6 +369,13 @@ public static void setParam(final String[] args, final String confFileName) { } Config config = Configuration.getByFileName(PARAMETER.shellConfFileName, confFileName); + setParam(config); + } + + /** + * set parameters. + */ + public static void setParam(final Config config) { if (config.hasPath(Constant.NET_TYPE) && Constant.TESTNET.equalsIgnoreCase(config.getString(Constant.NET_TYPE))) { @@ -451,6 +463,18 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.lruCacheSize = config.getInt(Constant.VM_LRU_CACHE_SIZE); } + if (config.hasPath(Constant.NODE_RPC_ENABLE)) { + PARAMETER.rpcEnable = config.getBoolean(Constant.NODE_RPC_ENABLE); + } + + if (config.hasPath(Constant.NODE_RPC_SOLIDITY_ENABLE)) { + PARAMETER.rpcSolidityEnable = config.getBoolean(Constant.NODE_RPC_SOLIDITY_ENABLE); + } + + if (config.hasPath(Constant.NODE_RPC_PBFT_ENABLE)) { + PARAMETER.rpcPBFTEnable = config.getBoolean(Constant.NODE_RPC_PBFT_ENABLE); + } + if (config.hasPath(Constant.NODE_HTTP_FULLNODE_ENABLE)) { PARAMETER.fullNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_FULLNODE_ENABLE); } @@ -459,6 +483,10 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.solidityNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_SOLIDITY_ENABLE); } + if (config.hasPath(Constant.NODE_HTTP_PBFT_ENABLE)) { + PARAMETER.pBFTHttpEnable = config.getBoolean(Constant.NODE_HTTP_PBFT_ENABLE); + } + if (config.hasPath(Constant.NODE_JSONRPC_HTTP_FULLNODE_ENABLE)) { PARAMETER.jsonRpcHttpFullNodeEnable = config.getBoolean(Constant.NODE_JSONRPC_HTTP_FULLNODE_ENABLE); diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 3cc50c77890..8f9c6b15bb7 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -8,10 +8,8 @@ import io.grpc.Status; import io.grpc.StatusRuntimeException; import io.grpc.netty.NettyServerBuilder; -import io.grpc.protobuf.services.ProtoReflectionService; import io.grpc.stub.StreamObserver; import java.util.Objects; -import java.util.concurrent.TimeUnit; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -75,7 +73,6 @@ import org.tron.api.WalletGrpc.WalletImplBase; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.RpcService; -import org.tron.common.es.ExecutorServiceManager; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; @@ -97,10 +94,6 @@ import org.tron.core.exception.VMIllegalException; import org.tron.core.exception.ZksnarkException; import org.tron.core.metrics.MetricsApiService; -import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.PrometheusInterceptor; -import org.tron.core.services.ratelimiter.RateLimiterInterceptor; -import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.core.utils.TransactionUtil; import org.tron.core.zen.address.DiversifierT; import org.tron.core.zen.address.IncomingViewingKey; @@ -183,15 +176,7 @@ public class RpcApiService extends RpcService { @Autowired private NodeInfoService nodeInfoService; @Autowired - private RateLimiterInterceptor rateLimiterInterceptor; - @Autowired - private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; - @Autowired - private RpcApiAccessInterceptor apiAccessInterceptor; - @Autowired private MetricsApiService metricsApiService; - @Autowired - private PrometheusInterceptor prometheusInterceptor; @Getter private DatabaseApi databaseApi = new DatabaseApi(); private WalletApi walletApi = new WalletApi(); @@ -200,75 +185,27 @@ public class RpcApiService extends RpcService { @Getter private MonitorApi monitorApi = new MonitorApi(); - private final String executorName = "rpc-full-executor"; - - @Override - public void init() { - - } - - @Override - public void init(CommonParameter args) { + public RpcApiService() { port = Args.getInstance().getRpcPort(); + enable = Args.getInstance().isRpcEnable(); + executorName = "rpc-full-executor"; } @Override - public void start() { - try { - NettyServerBuilder serverBuilder = NettyServerBuilder.forPort(port).addService(databaseApi); - CommonParameter parameter = Args.getInstance(); - - if (parameter.getRpcThreadNum() > 0) { - serverBuilder = serverBuilder - .executor(ExecutorServiceManager.newFixedThreadPool( - executorName, parameter.getRpcThreadNum())); - } - - if (parameter.isSolidityNode()) { - serverBuilder = serverBuilder.addService(walletSolidityApi); - if (parameter.isWalletExtensionApi()) { - serverBuilder = serverBuilder.addService(new WalletExtensionApi()); - } - } else { - serverBuilder = serverBuilder.addService(walletApi); - } - - if (parameter.isNodeMetricsEnable()) { - serverBuilder = serverBuilder.addService(monitorApi); - } - - // Set configs from config.conf or default value - serverBuilder - .maxConcurrentCallsPerConnection(parameter.getMaxConcurrentCallsPerConnection()) - .flowControlWindow(parameter.getFlowControlWindow()) - .maxConnectionIdle(parameter.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) - .maxConnectionAge(parameter.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxInboundMessageSize(parameter.getMaxMessageSize()) - .maxHeaderListSize(parameter.getMaxHeaderListSize()); - - // add a rate limiter interceptor - serverBuilder.intercept(rateLimiterInterceptor); - - // add api access interceptor - serverBuilder.intercept(apiAccessInterceptor); - - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - - // add prometheus interceptor - if (parameter.isMetricsPrometheusEnable()) { - serverBuilder.intercept(prometheusInterceptor); - } - - if (parameter.isRpcReflectionServiceEnable()) { - serverBuilder.addService(ProtoReflectionService.newInstance()); + protected void addService(NettyServerBuilder serverBuilder) { + serverBuilder.addService(databaseApi); + CommonParameter parameter = Args.getInstance(); + if (parameter.isSolidityNode()) { + serverBuilder.addService(walletSolidityApi); + if (parameter.isWalletExtensionApi()) { + serverBuilder.addService(new WalletExtensionApi()); } + } else { + serverBuilder.addService(walletApi); + } - apiServer = serverBuilder.build(); - rateLimiterInterceptor.init(apiServer); - super.start(); - } catch (Exception e) { - logger.debug(e.getMessage(), e); + if (parameter.isNodeMetricsEnable()) { + serverBuilder.addService(monitorApi); } } diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 55e6e07b5ec..76785218096 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -4,8 +4,6 @@ import javax.servlet.DispatcherType; import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHandler; @@ -13,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.HttpInterceptor; @@ -294,261 +291,247 @@ public class FullNodeHttpApiService extends HttpService { @Autowired private CancelAllUnfreezeV2Servlet cancelAllUnfreezeV2Servlet; - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { + public FullNodeHttpApiService() { port = Args.getInstance().getFullNodeHttpPort(); + enable = isFullNode() && Args.getInstance().isFullNodeHttpEnable(); + contextPath = "/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); + protected void addServlet(ServletContextHandler context) { + context.addServlet(new ServletHolder(getAccountServlet), "/wallet/getaccount"); + context.addServlet(new ServletHolder(transferServlet), "/wallet/createtransaction"); + context.addServlet(new ServletHolder(broadcastServlet), "/wallet/broadcasttransaction"); + context.addServlet(new ServletHolder(updateAccountServlet), "/wallet/updateaccount"); + context.addServlet(new ServletHolder(voteWitnessAccountServlet), + "/wallet/votewitnessaccount"); + context.addServlet(new ServletHolder(createAssetIssueServlet), "/wallet/createassetissue"); + context.addServlet(new ServletHolder(updateWitnessServlet), "/wallet/updatewitness"); + context.addServlet(new ServletHolder(createAccountServlet), "/wallet/createaccount"); + context.addServlet(new ServletHolder(createWitnessServlet), "/wallet/createwitness"); + context.addServlet(new ServletHolder(transferAssetServlet), "/wallet/transferasset"); + context.addServlet(new ServletHolder(participateAssetIssueServlet), + "/wallet/participateassetissue"); + context.addServlet(new ServletHolder(freezeBalanceServlet), "/wallet/freezebalance"); + context.addServlet(new ServletHolder(unFreezeBalanceServlet), "/wallet/unfreezebalance"); + context.addServlet(new ServletHolder(unFreezeAssetServlet), "/wallet/unfreezeasset"); + context.addServlet(new ServletHolder(withdrawBalanceServlet), "/wallet/withdrawbalance"); + context.addServlet(new ServletHolder(updateAssetServlet), "/wallet/updateasset"); + context.addServlet(new ServletHolder(listNodesServlet), "/wallet/listnodes"); + context.addServlet( + new ServletHolder(getAssetIssueByAccountServlet), "/wallet/getassetissuebyaccount"); + context.addServlet(new ServletHolder(getAccountNetServlet), "/wallet/getaccountnet"); + context.addServlet(new ServletHolder(getAssetIssueByNameServlet), + "/wallet/getassetissuebyname"); + context.addServlet(new ServletHolder(getAssetIssueListByNameServlet), + "/wallet/getassetissuelistbyname"); + context.addServlet(new ServletHolder(getAssetIssueByIdServlet), "/wallet/getassetissuebyid"); + context.addServlet(new ServletHolder(getNowBlockServlet), "/wallet/getnowblock"); + context.addServlet(new ServletHolder(getBlockByNumServlet), "/wallet/getblockbynum"); + context.addServlet(new ServletHolder(getBlockByIdServlet), "/wallet/getblockbyid"); + context.addServlet(new ServletHolder(getBlockByLimitNextServlet), + "/wallet/getblockbylimitnext"); + context.addServlet(new ServletHolder(getBlockByLatestNumServlet), + "/wallet/getblockbylatestnum"); + context.addServlet(new ServletHolder(getTransactionByIdServlet), + "/wallet/gettransactionbyid"); + context.addServlet( + new ServletHolder(getTransactionInfoByIdServlet), "/wallet/gettransactioninfobyid"); + context.addServlet( + new ServletHolder(getTransactionReceiptByIdServlet), "/wallet/gettransactionreceiptbyid"); + context.addServlet( + new ServletHolder(getTransactionCountByBlockNumServlet), + "/wallet/gettransactioncountbyblocknum"); + context.addServlet(new ServletHolder(listWitnessesServlet), "/wallet/listwitnesses"); + context.addServlet(new ServletHolder(getAssetIssueListServlet), "/wallet/getassetissuelist"); + context.addServlet( + new ServletHolder(getPaginatedAssetIssueListServlet), + "/wallet/getpaginatedassetissuelist"); + context.addServlet( + new ServletHolder(getPaginatedProposalListServlet), "/wallet/getpaginatedproposallist"); + context.addServlet( + new ServletHolder(getPaginatedExchangeListServlet), "/wallet/getpaginatedexchangelist"); + context.addServlet(new ServletHolder(totalTransactionServlet), "/wallet/totaltransaction"); + context.addServlet( + new ServletHolder(getNextMaintenanceTimeServlet), "/wallet/getnextmaintenancetime"); + context.addServlet(new ServletHolder(validateAddressServlet), "/wallet/validateaddress"); + context.addServlet(new ServletHolder(deployContractServlet), "/wallet/deploycontract"); + context.addServlet(new ServletHolder(triggerSmartContractServlet), + "/wallet/triggersmartcontract"); + context.addServlet(new ServletHolder(triggerConstantContractServlet), + "/wallet/triggerconstantcontract"); + context.addServlet(new ServletHolder(estimateEnergyServlet), "/wallet/estimateenergy"); + context.addServlet(new ServletHolder(getContractServlet), "/wallet/getcontract"); + context.addServlet(new ServletHolder(getContractInfoServlet), "/wallet/getcontractinfo"); + context.addServlet(new ServletHolder(clearABIServlet), "/wallet/clearabi"); + context.addServlet(new ServletHolder(proposalCreateServlet), "/wallet/proposalcreate"); + context.addServlet(new ServletHolder(proposalApproveServlet), "/wallet/proposalapprove"); + context.addServlet(new ServletHolder(proposalDeleteServlet), "/wallet/proposaldelete"); + context.addServlet(new ServletHolder(listProposalsServlet), "/wallet/listproposals"); + context.addServlet(new ServletHolder(getProposalByIdServlet), "/wallet/getproposalbyid"); + context.addServlet(new ServletHolder(exchangeCreateServlet), "/wallet/exchangecreate"); + context.addServlet(new ServletHolder(exchangeInjectServlet), "/wallet/exchangeinject"); + context.addServlet(new ServletHolder(exchangeTransactionServlet), + "/wallet/exchangetransaction"); + context.addServlet(new ServletHolder(exchangeWithdrawServlet), "/wallet/exchangewithdraw"); + context.addServlet(new ServletHolder(getExchangeByIdServlet), "/wallet/getexchangebyid"); + context.addServlet(new ServletHolder(listExchangesServlet), "/wallet/listexchanges"); + context.addServlet(new ServletHolder(getChainParametersServlet), + "/wallet/getchainparameters"); + context.addServlet(new ServletHolder(getAccountResourceServlet), + "/wallet/getaccountresource"); + context.addServlet(new ServletHolder(getTransactionSignWeightServlet), + "/wallet/getsignweight"); + context.addServlet(new ServletHolder(getTransactionApprovedListServlet), + "/wallet/getapprovedlist"); + context.addServlet(new ServletHolder(accountPermissionUpdateServlet), + "/wallet/accountpermissionupdate"); + context.addServlet(new ServletHolder(getNodeInfoServlet), "/wallet/getnodeinfo"); + context.addServlet(new ServletHolder(updateSettingServlet), "/wallet/updatesetting"); + context.addServlet(new ServletHolder(updateEnergyLimitServlet), "/wallet/updateenergylimit"); + context.addServlet(new ServletHolder(getDelegatedResourceServlet), + "/wallet/getdelegatedresource"); + context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), + "/wallet/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getCanDelegatedMaxSizeServlet), + "/wallet/getcandelegatedmaxsize"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), + "/wallet/getavailableunfreezecount"); + context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), + "/wallet/getcanwithdrawunfreezeamount"); + context.addServlet( + new ServletHolder(getDelegatedResourceAccountIndexServlet), + "/wallet/getdelegatedresourceaccountindex"); + context.addServlet( + new ServletHolder(getDelegatedResourceAccountIndexV2Servlet), + "/wallet/getdelegatedresourceaccountindexv2"); + context.addServlet(new ServletHolder(setAccountServlet), "/wallet/setaccountid"); + context.addServlet(new ServletHolder(getAccountByIdServlet), "/wallet/getaccountbyid"); + context + .addServlet(new ServletHolder(getExpandedSpendingKeyServlet), + "/wallet/getexpandedspendingkey"); + context.addServlet(new ServletHolder(getAkFromAskServlet), "/wallet/getakfromask"); + context.addServlet(new ServletHolder(getNkFromNskServlet), "/wallet/getnkfromnsk"); + context.addServlet(new ServletHolder(getSpendingKeyServlet), "/wallet/getspendingkey"); + context + .addServlet(new ServletHolder(getNewShieldedAddressServlet), + "/wallet/getnewshieldedaddress"); + context.addServlet(new ServletHolder(getDiversifierServlet), "/wallet/getdiversifier"); + context.addServlet(new ServletHolder(getIncomingViewingKeyServlet), + "/wallet/getincomingviewingkey"); + context.addServlet(new ServletHolder(getZenPaymentAddressServlet), + "/wallet/getzenpaymentaddress"); + // context.addServlet(new ServletHolder(createShieldedTransactionServlet), + // "/wallet/createshieldedtransaction"); + // context.addServlet(new ServletHolder(createShieldedTransactionWithoutSpendAuthSigServlet), + // "/wallet/createshieldedtransactionwithoutspendauthsig"); + // context.addServlet(new ServletHolder(scanNoteByIvkServlet), "/wallet/scannotebyivk"); + // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkServlet), + // "/wallet/scanandmarknotebyivk"); + // context.addServlet(new ServletHolder(scanNoteByOvkServlet), "/wallet/scannotebyovk"); + context.addServlet(new ServletHolder(getRcmServlet), "/wallet/getrcm"); + // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoServlet), + // "/wallet/getmerkletreevoucherinfo"); + // context.addServlet(new ServletHolder(isSpendServlet), "/wallet/isspend"); + context.addServlet(new ServletHolder(createSpendAuthSigServlet), + "/wallet/createspendauthsig"); + // context.addServlet(new ServletHolder(createShieldNullifierServlet), + // "/wallet/createshieldnullifier"); + // context.addServlet(new ServletHolder(getShieldTransactionHashServlet), + // "/wallet/getshieldtransactionhash"); - context.addServlet(new ServletHolder(getAccountServlet), "/wallet/getaccount"); - context.addServlet(new ServletHolder(transferServlet), "/wallet/createtransaction"); - context.addServlet(new ServletHolder(broadcastServlet), "/wallet/broadcasttransaction"); - context.addServlet(new ServletHolder(updateAccountServlet), "/wallet/updateaccount"); - context.addServlet(new ServletHolder(voteWitnessAccountServlet), - "/wallet/votewitnessaccount"); - context.addServlet(new ServletHolder(createAssetIssueServlet), "/wallet/createassetissue"); - context.addServlet(new ServletHolder(updateWitnessServlet), "/wallet/updatewitness"); - context.addServlet(new ServletHolder(createAccountServlet), "/wallet/createaccount"); - context.addServlet(new ServletHolder(createWitnessServlet), "/wallet/createwitness"); - context.addServlet(new ServletHolder(transferAssetServlet), "/wallet/transferasset"); - context.addServlet(new ServletHolder(participateAssetIssueServlet), - "/wallet/participateassetissue"); - context.addServlet(new ServletHolder(freezeBalanceServlet), "/wallet/freezebalance"); - context.addServlet(new ServletHolder(unFreezeBalanceServlet), "/wallet/unfreezebalance"); - context.addServlet(new ServletHolder(unFreezeAssetServlet), "/wallet/unfreezeasset"); - context.addServlet(new ServletHolder(withdrawBalanceServlet), "/wallet/withdrawbalance"); - context.addServlet(new ServletHolder(updateAssetServlet), "/wallet/updateasset"); - context.addServlet(new ServletHolder(listNodesServlet), "/wallet/listnodes"); - context.addServlet( - new ServletHolder(getAssetIssueByAccountServlet), "/wallet/getassetissuebyaccount"); - context.addServlet(new ServletHolder(getAccountNetServlet), "/wallet/getaccountnet"); - context.addServlet(new ServletHolder(getAssetIssueByNameServlet), - "/wallet/getassetissuebyname"); - context.addServlet(new ServletHolder(getAssetIssueListByNameServlet), - "/wallet/getassetissuelistbyname"); - context.addServlet(new ServletHolder(getAssetIssueByIdServlet), "/wallet/getassetissuebyid"); - context.addServlet(new ServletHolder(getNowBlockServlet), "/wallet/getnowblock"); - context.addServlet(new ServletHolder(getBlockByNumServlet), "/wallet/getblockbynum"); - context.addServlet(new ServletHolder(getBlockByIdServlet), "/wallet/getblockbyid"); - context.addServlet(new ServletHolder(getBlockByLimitNextServlet), - "/wallet/getblockbylimitnext"); - context.addServlet(new ServletHolder(getBlockByLatestNumServlet), - "/wallet/getblockbylatestnum"); - context.addServlet(new ServletHolder(getTransactionByIdServlet), - "/wallet/gettransactionbyid"); - context.addServlet( - new ServletHolder(getTransactionInfoByIdServlet), "/wallet/gettransactioninfobyid"); - context.addServlet( - new ServletHolder(getTransactionReceiptByIdServlet), "/wallet/gettransactionreceiptbyid"); - context.addServlet( - new ServletHolder(getTransactionCountByBlockNumServlet), - "/wallet/gettransactioncountbyblocknum"); - context.addServlet(new ServletHolder(listWitnessesServlet), "/wallet/listwitnesses"); - context.addServlet(new ServletHolder(getAssetIssueListServlet), "/wallet/getassetissuelist"); - context.addServlet( - new ServletHolder(getPaginatedAssetIssueListServlet), - "/wallet/getpaginatedassetissuelist"); - context.addServlet( - new ServletHolder(getPaginatedProposalListServlet), "/wallet/getpaginatedproposallist"); - context.addServlet( - new ServletHolder(getPaginatedExchangeListServlet), "/wallet/getpaginatedexchangelist"); - context.addServlet(new ServletHolder(totalTransactionServlet), "/wallet/totaltransaction"); - context.addServlet( - new ServletHolder(getNextMaintenanceTimeServlet), "/wallet/getnextmaintenancetime"); - context.addServlet(new ServletHolder(validateAddressServlet), "/wallet/validateaddress"); - context.addServlet(new ServletHolder(deployContractServlet), "/wallet/deploycontract"); - context.addServlet(new ServletHolder(triggerSmartContractServlet), - "/wallet/triggersmartcontract"); - context.addServlet(new ServletHolder(triggerConstantContractServlet), - "/wallet/triggerconstantcontract"); - context.addServlet(new ServletHolder(estimateEnergyServlet), "/wallet/estimateenergy"); - context.addServlet(new ServletHolder(getContractServlet), "/wallet/getcontract"); - context.addServlet(new ServletHolder(getContractInfoServlet), "/wallet/getcontractinfo"); - context.addServlet(new ServletHolder(clearABIServlet), "/wallet/clearabi"); - context.addServlet(new ServletHolder(proposalCreateServlet), "/wallet/proposalcreate"); - context.addServlet(new ServletHolder(proposalApproveServlet), "/wallet/proposalapprove"); - context.addServlet(new ServletHolder(proposalDeleteServlet), "/wallet/proposaldelete"); - context.addServlet(new ServletHolder(listProposalsServlet), "/wallet/listproposals"); - context.addServlet(new ServletHolder(getProposalByIdServlet), "/wallet/getproposalbyid"); - context.addServlet(new ServletHolder(exchangeCreateServlet), "/wallet/exchangecreate"); - context.addServlet(new ServletHolder(exchangeInjectServlet), "/wallet/exchangeinject"); - context.addServlet(new ServletHolder(exchangeTransactionServlet), - "/wallet/exchangetransaction"); - context.addServlet(new ServletHolder(exchangeWithdrawServlet), "/wallet/exchangewithdraw"); - context.addServlet(new ServletHolder(getExchangeByIdServlet), "/wallet/getexchangebyid"); - context.addServlet(new ServletHolder(listExchangesServlet), "/wallet/listexchanges"); - context.addServlet(new ServletHolder(getChainParametersServlet), - "/wallet/getchainparameters"); - context.addServlet(new ServletHolder(getAccountResourceServlet), - "/wallet/getaccountresource"); - context.addServlet(new ServletHolder(getTransactionSignWeightServlet), - "/wallet/getsignweight"); - context.addServlet(new ServletHolder(getTransactionApprovedListServlet), - "/wallet/getapprovedlist"); - context.addServlet(new ServletHolder(accountPermissionUpdateServlet), - "/wallet/accountpermissionupdate"); - context.addServlet(new ServletHolder(getNodeInfoServlet), "/wallet/getnodeinfo"); - context.addServlet(new ServletHolder(updateSettingServlet), "/wallet/updatesetting"); - context.addServlet(new ServletHolder(updateEnergyLimitServlet), "/wallet/updateenergylimit"); - context.addServlet(new ServletHolder(getDelegatedResourceServlet), - "/wallet/getdelegatedresource"); - context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), - "/wallet/getdelegatedresourcev2"); - context.addServlet(new ServletHolder(getCanDelegatedMaxSizeServlet), - "/wallet/getcandelegatedmaxsize"); - context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), - "/wallet/getavailableunfreezecount"); - context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), - "/wallet/getcanwithdrawunfreezeamount"); - context.addServlet( - new ServletHolder(getDelegatedResourceAccountIndexServlet), - "/wallet/getdelegatedresourceaccountindex"); - context.addServlet( - new ServletHolder(getDelegatedResourceAccountIndexV2Servlet), - "/wallet/getdelegatedresourceaccountindexv2"); - context.addServlet(new ServletHolder(setAccountServlet), "/wallet/setaccountid"); - context.addServlet(new ServletHolder(getAccountByIdServlet), "/wallet/getaccountbyid"); - context - .addServlet(new ServletHolder(getExpandedSpendingKeyServlet), - "/wallet/getexpandedspendingkey"); - context.addServlet(new ServletHolder(getAkFromAskServlet), "/wallet/getakfromask"); - context.addServlet(new ServletHolder(getNkFromNskServlet), "/wallet/getnkfromnsk"); - context.addServlet(new ServletHolder(getSpendingKeyServlet), "/wallet/getspendingkey"); - context - .addServlet(new ServletHolder(getNewShieldedAddressServlet), - "/wallet/getnewshieldedaddress"); - context.addServlet(new ServletHolder(getDiversifierServlet), "/wallet/getdiversifier"); - context.addServlet(new ServletHolder(getIncomingViewingKeyServlet), - "/wallet/getincomingviewingkey"); - context.addServlet(new ServletHolder(getZenPaymentAddressServlet), - "/wallet/getzenpaymentaddress"); - // context.addServlet(new ServletHolder(createShieldedTransactionServlet), - // "/wallet/createshieldedtransaction"); - // context.addServlet(new ServletHolder(createShieldedTransactionWithoutSpendAuthSigServlet), - // "/wallet/createshieldedtransactionwithoutspendauthsig"); - // context.addServlet(new ServletHolder(scanNoteByIvkServlet), "/wallet/scannotebyivk"); - // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkServlet), - // "/wallet/scanandmarknotebyivk"); - // context.addServlet(new ServletHolder(scanNoteByOvkServlet), "/wallet/scannotebyovk"); - context.addServlet(new ServletHolder(getRcmServlet), "/wallet/getrcm"); - // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoServlet), - // "/wallet/getmerkletreevoucherinfo"); - // context.addServlet(new ServletHolder(isSpendServlet), "/wallet/isspend"); - context.addServlet(new ServletHolder(createSpendAuthSigServlet), - "/wallet/createspendauthsig"); - // context.addServlet(new ServletHolder(createShieldNullifierServlet), - // "/wallet/createshieldnullifier"); - // context.addServlet(new ServletHolder(getShieldTransactionHashServlet), - // "/wallet/getshieldtransactionhash"); + context + .addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentServlet), + "/wallet/isshieldedtrc20contractnotespent"); + context.addServlet(new ServletHolder(createShieldedContractParametersServlet), + "/wallet/createshieldedcontractparameters"); + context.addServlet(new ServletHolder(createShieldedContractParametersWithoutAskServlet), + "/wallet/createshieldedcontractparameterswithoutask"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkServlet), + "/wallet/scanshieldedtrc20notesbyivk"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkServlet), + "/wallet/scanshieldedtrc20notesbyovk"); + context.addServlet(new ServletHolder(getTriggerInputForShieldedTRC20ContractServlet), + "/wallet/gettriggerinputforshieldedtrc20contract"); - context - .addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentServlet), - "/wallet/isshieldedtrc20contractnotespent"); - context.addServlet(new ServletHolder(createShieldedContractParametersServlet), - "/wallet/createshieldedcontractparameters"); - context.addServlet(new ServletHolder(createShieldedContractParametersWithoutAskServlet), - "/wallet/createshieldedcontractparameterswithoutask"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkServlet), - "/wallet/scanshieldedtrc20notesbyivk"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkServlet), - "/wallet/scanshieldedtrc20notesbyovk"); - context.addServlet(new ServletHolder(getTriggerInputForShieldedTRC20ContractServlet), - "/wallet/gettriggerinputforshieldedtrc20contract"); + context.addServlet(new ServletHolder(broadcastHexServlet), "/wallet/broadcasthex"); + context.addServlet(new ServletHolder(getBrokerageServlet), "/wallet/getBrokerage"); + context.addServlet(new ServletHolder(getRewardServlet), "/wallet/getReward"); + context.addServlet(new ServletHolder(updateBrokerageServlet), "/wallet/updateBrokerage"); + context.addServlet(new ServletHolder(createCommonTransactionServlet), + "/wallet/createCommonTransaction"); + context.addServlet(new ServletHolder(getTransactionInfoByBlockNumServlet), + "/wallet/gettransactioninfobyblocknum"); + context.addServlet(new ServletHolder(listNodesServlet), "/net/listnodes"); - context.addServlet(new ServletHolder(broadcastHexServlet), "/wallet/broadcasthex"); - context.addServlet(new ServletHolder(getBrokerageServlet), "/wallet/getBrokerage"); - context.addServlet(new ServletHolder(getRewardServlet), "/wallet/getReward"); - context.addServlet(new ServletHolder(updateBrokerageServlet), "/wallet/updateBrokerage"); - context.addServlet(new ServletHolder(createCommonTransactionServlet), - "/wallet/createCommonTransaction"); - context.addServlet(new ServletHolder(getTransactionInfoByBlockNumServlet), - "/wallet/gettransactioninfobyblocknum"); - context.addServlet(new ServletHolder(listNodesServlet), "/net/listnodes"); + context.addServlet(new ServletHolder(metricsServlet), "/monitor/getstatsinfo"); + context.addServlet(new ServletHolder(getNodeInfoServlet), "/monitor/getnodeinfo"); + context.addServlet(new ServletHolder(marketSellAssetServlet), "/wallet/marketsellasset"); + context.addServlet(new ServletHolder(marketCancelOrderServlet), "/wallet/marketcancelorder"); + context.addServlet(new ServletHolder(getMarketOrderByAccountServlet), + "/wallet/getmarketorderbyaccount"); + context.addServlet(new ServletHolder(getMarketOrderByIdServlet), + "/wallet/getmarketorderbyid"); + context.addServlet(new ServletHolder(getMarketPriceByPairServlet), + "/wallet/getmarketpricebypair"); + context.addServlet(new ServletHolder(getMarketOrderListByPairServlet), + "/wallet/getmarketorderlistbypair"); + context.addServlet(new ServletHolder(getMarketPairListServlet), + "/wallet/getmarketpairlist"); - context.addServlet(new ServletHolder(metricsServlet), "/monitor/getstatsinfo"); - context.addServlet(new ServletHolder(getNodeInfoServlet), "/monitor/getnodeinfo"); - context.addServlet(new ServletHolder(marketSellAssetServlet), "/wallet/marketsellasset"); - context.addServlet(new ServletHolder(marketCancelOrderServlet), "/wallet/marketcancelorder"); - context.addServlet(new ServletHolder(getMarketOrderByAccountServlet), - "/wallet/getmarketorderbyaccount"); - context.addServlet(new ServletHolder(getMarketOrderByIdServlet), - "/wallet/getmarketorderbyid"); - context.addServlet(new ServletHolder(getMarketPriceByPairServlet), - "/wallet/getmarketpricebypair"); - context.addServlet(new ServletHolder(getMarketOrderListByPairServlet), - "/wallet/getmarketorderlistbypair"); - context.addServlet(new ServletHolder(getMarketPairListServlet), - "/wallet/getmarketpairlist"); + context.addServlet(new ServletHolder(getAccountBalanceServlet), + "/wallet/getaccountbalance"); + context.addServlet(new ServletHolder(getBlockBalanceServlet), + "/wallet/getblockbalance"); + context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx"); + context.addServlet(new ServletHolder(getTransactionFromPendingServlet), + "/wallet/gettransactionfrompending"); + context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), + "/wallet/gettransactionlistfrompending"); + context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize"); + context.addServlet(new ServletHolder(getEnergyPricesServlet), "/wallet/getenergyprices"); + context.addServlet(new ServletHolder(getBandwidthPricesServlet), + "/wallet/getbandwidthprices"); + context.addServlet(new ServletHolder(getBlockServlet), "/wallet/getblock"); + context.addServlet(new ServletHolder(getMemoFeePricesServlet), "/wallet/getmemofee"); - context.addServlet(new ServletHolder(getAccountBalanceServlet), - "/wallet/getaccountbalance"); - context.addServlet(new ServletHolder(getBlockBalanceServlet), - "/wallet/getblockbalance"); - context.addServlet(new ServletHolder(getBurnTrxServlet), "/wallet/getburntrx"); - context.addServlet(new ServletHolder(getTransactionFromPendingServlet), - "/wallet/gettransactionfrompending"); - context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), - "/wallet/gettransactionlistfrompending"); - context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize"); - context.addServlet(new ServletHolder(getEnergyPricesServlet), "/wallet/getenergyprices"); - context.addServlet(new ServletHolder(getBandwidthPricesServlet), - "/wallet/getbandwidthprices"); - context.addServlet(new ServletHolder(getBlockServlet), "/wallet/getblock"); - context.addServlet(new ServletHolder(getMemoFeePricesServlet), "/wallet/getmemofee"); + context.addServlet(new ServletHolder(freezeBalanceV2Servlet), + "/wallet/freezebalancev2"); + context.addServlet(new ServletHolder(unFreezeBalanceV2Servlet), + "/wallet/unfreezebalancev2"); + context.addServlet(new ServletHolder(withdrawExpireUnfreezeServlet), + "/wallet/withdrawexpireunfreeze"); + context.addServlet(new ServletHolder(delegateResourceServlet), + "/wallet/delegateresource"); + context.addServlet(new ServletHolder(unDelegateResourceServlet), + "/wallet/undelegateresource"); + context.addServlet(new ServletHolder(cancelAllUnfreezeV2Servlet), + "/wallet/cancelallunfreezev2"); - context.addServlet(new ServletHolder(freezeBalanceV2Servlet), - "/wallet/freezebalancev2"); - context.addServlet(new ServletHolder(unFreezeBalanceV2Servlet), - "/wallet/unfreezebalancev2"); - context.addServlet(new ServletHolder(withdrawExpireUnfreezeServlet), - "/wallet/withdrawexpireunfreeze"); - context.addServlet(new ServletHolder(delegateResourceServlet), - "/wallet/delegateresource"); - context.addServlet(new ServletHolder(unDelegateResourceServlet), - "/wallet/undelegateresource"); - context.addServlet(new ServletHolder(cancelAllUnfreezeV2Servlet), - "/wallet/cancelallunfreezev2"); - - int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } + } - // filters the specified APIs - // when node is lite fullnode and openHistoryQueryWhenLiteFN is false - context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", - EnumSet.allOf(DispatcherType.class)); + @Override + protected void addFilter(ServletContextHandler context) { + // filters the specified APIs + // when node is lite fullnode and openHistoryQueryWhenLiteFN is false + context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", + EnumSet.allOf(DispatcherType.class)); - // http access filter, it should have higher priority than HttpInterceptor - context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", - EnumSet.allOf(DispatcherType.class)); - // note: if the pathSpec of servlet is not started with wallet, it should be included here - context.getServletHandler().getFilterMappings()[1] - .setPathSpecs(new String[] {"/wallet/*", - "/net/listnodes", - "/monitor/getstatsinfo", - "/monitor/getnodeinfo"}); + // http access filter, it should have higher priority than HttpInterceptor + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); + // note: if the pathSpec of servlet is not started with wallet, it should be included here + context.getServletHandler().getFilterMappings()[1] + .setPathSpecs(new String[] {"/wallet/*", + "/net/listnodes", + "/monitor/getstatsinfo", + "/monitor/getnodeinfo"}); - // metrics filter - ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler - .addFilterWithMapping((Class) HttpInterceptor.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); - super.start(); - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + // metrics filter + ServletHandler handler = new ServletHandler(); + FilterHolder fh = handler + .addFilterWithMapping((Class) HttpInterceptor.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); } } diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index 0c66b220e09..ea08d2d42cf 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -3,15 +3,12 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.http.EstimateEnergyServlet; @@ -166,140 +163,123 @@ public class SolidityNodeHttpApiService extends HttpService { private GetEnergyPricesServlet getEnergyPricesServlet; - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { + public SolidityNodeHttpApiService() { port = Args.getInstance().getSolidityHttpPort(); + enable = !isFullNode() && Args.getInstance().isSolidityNodeHttpEnable(); + contextPath = "/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); - - // same as FullNode - context.addServlet(new ServletHolder(getAccountServlet), "/walletsolidity/getaccount"); - context.addServlet(new ServletHolder(listWitnessesServlet), "/walletsolidity/listwitnesses"); - context.addServlet(new ServletHolder(getAssetIssueListServlet), - "/walletsolidity/getassetissuelist"); - context.addServlet(new ServletHolder(getPaginatedAssetIssueListServlet), - "/walletsolidity/getpaginatedassetissuelist"); - context.addServlet(new ServletHolder(getAssetIssueByNameServlet), - "/walletsolidity/getassetissuebyname"); - context.addServlet(new ServletHolder(getAssetIssueByIdServlet), - "/walletsolidity/getassetissuebyid"); - context.addServlet(new ServletHolder(getAssetIssueListByNameServlet), - "/walletsolidity/getassetissuelistbyname"); - context.addServlet(new ServletHolder(getNowBlockServlet), "/walletsolidity/getnowblock"); - context.addServlet(new ServletHolder(getBlockByNumServlet), "/walletsolidity/getblockbynum"); - context.addServlet(new ServletHolder(getDelegatedResourceServlet), - "/walletsolidity/getdelegatedresource"); - context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), - "/walletsolidity/getdelegatedresourcev2"); - context.addServlet(new ServletHolder(getCanDelegatedMaxSizeServlet), - "/walletsolidity/getcandelegatedmaxsize"); - context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), - "/walletsolidity/getavailableunfreezecount"); - context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), - "/walletsolidity/getcanwithdrawunfreezeamount"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexServlet), - "/walletsolidity/getdelegatedresourceaccountindex"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2Servlet), - "/walletsolidity/getdelegatedresourceaccountindexv2"); - context - .addServlet(new ServletHolder(getExchangeByIdServlet), - "/walletsolidity/getexchangebyid"); - context.addServlet(new ServletHolder(listExchangesServlet), - "/walletsolidity/listexchanges"); + protected void addServlet(ServletContextHandler context) { + // same as FullNode + context.addServlet(new ServletHolder(getAccountServlet), "/walletsolidity/getaccount"); + context.addServlet(new ServletHolder(listWitnessesServlet), "/walletsolidity/listwitnesses"); + context.addServlet(new ServletHolder(getAssetIssueListServlet), + "/walletsolidity/getassetissuelist"); + context.addServlet(new ServletHolder(getPaginatedAssetIssueListServlet), + "/walletsolidity/getpaginatedassetissuelist"); + context.addServlet(new ServletHolder(getAssetIssueByNameServlet), + "/walletsolidity/getassetissuebyname"); + context.addServlet(new ServletHolder(getAssetIssueByIdServlet), + "/walletsolidity/getassetissuebyid"); + context.addServlet(new ServletHolder(getAssetIssueListByNameServlet), + "/walletsolidity/getassetissuelistbyname"); + context.addServlet(new ServletHolder(getNowBlockServlet), "/walletsolidity/getnowblock"); + context.addServlet(new ServletHolder(getBlockByNumServlet), "/walletsolidity/getblockbynum"); + context.addServlet(new ServletHolder(getDelegatedResourceServlet), + "/walletsolidity/getdelegatedresource"); + context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), + "/walletsolidity/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getCanDelegatedMaxSizeServlet), + "/walletsolidity/getcandelegatedmaxsize"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), + "/walletsolidity/getavailableunfreezecount"); + context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), + "/walletsolidity/getcanwithdrawunfreezeamount"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexServlet), + "/walletsolidity/getdelegatedresourceaccountindex"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2Servlet), + "/walletsolidity/getdelegatedresourceaccountindexv2"); + context + .addServlet(new ServletHolder(getExchangeByIdServlet), + "/walletsolidity/getexchangebyid"); + context.addServlet(new ServletHolder(listExchangesServlet), + "/walletsolidity/listexchanges"); - context.addServlet(new ServletHolder(getAccountByIdServlet), - "/walletsolidity/getaccountbyid"); - context.addServlet(new ServletHolder(getBlockByIdServlet), - "/walletsolidity/getblockbyid"); - context.addServlet(new ServletHolder(getBlockByLimitNextServlet), - "/walletsolidity/getblockbylimitnext"); - context.addServlet(new ServletHolder(getBlockByLatestNumServlet), - "/walletsolidity/getblockbylatestnum"); + context.addServlet(new ServletHolder(getAccountByIdServlet), + "/walletsolidity/getaccountbyid"); + context.addServlet(new ServletHolder(getBlockByIdServlet), + "/walletsolidity/getblockbyid"); + context.addServlet(new ServletHolder(getBlockByLimitNextServlet), + "/walletsolidity/getblockbylimitnext"); + context.addServlet(new ServletHolder(getBlockByLatestNumServlet), + "/walletsolidity/getblockbylatestnum"); - // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoServlet), - // "/walletsolidity/getmerkletreevoucherinfo"); - // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkServlet), - // "/walletsolidity/scanandmarknotebyivk"); - // context.addServlet(new ServletHolder(scanNoteByIvkServlet), - // "/walletsolidity/scannotebyivk"); - // context.addServlet(new ServletHolder(scanNoteByOvkServlet), - // "/walletsolidity/scannotebyovk"); - // context.addServlet(new ServletHolder(isSpendServlet), - // "/walletsolidity/isspend"); + // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoServlet), + // "/walletsolidity/getmerkletreevoucherinfo"); + // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkServlet), + // "/walletsolidity/scanandmarknotebyivk"); + // context.addServlet(new ServletHolder(scanNoteByIvkServlet), + // "/walletsolidity/scannotebyivk"); + // context.addServlet(new ServletHolder(scanNoteByOvkServlet), + // "/walletsolidity/scannotebyovk"); + // context.addServlet(new ServletHolder(isSpendServlet), + // "/walletsolidity/isspend"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkServlet), + "/walletsolidity/scanshieldedtrc20notesbyivk"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkServlet), + "/walletsolidity/scanshieldedtrc20notesbyovk"); + context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentServlet), + "/walletsolidity/isshieldedtrc20contractnotespent"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkServlet), - "/walletsolidity/scanshieldedtrc20notesbyivk"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkServlet), - "/walletsolidity/scanshieldedtrc20notesbyovk"); - context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentServlet), - "/walletsolidity/isshieldedtrc20contractnotespent"); + context.addServlet(new ServletHolder(getTransactionInfoByBlockNumServlet), + "/walletsolidity/gettransactioninfobyblocknum"); - context.addServlet(new ServletHolder(getTransactionInfoByBlockNumServlet), - "/walletsolidity/gettransactioninfobyblocknum"); + context.addServlet(new ServletHolder(getMarketOrderByAccountServlet), + "/walletsolidity/getmarketorderbyaccount"); + context.addServlet(new ServletHolder(getMarketOrderByIdServlet), + "/walletsolidity/getmarketorderbyid"); + context.addServlet(new ServletHolder(getMarketPriceByPairServlet), + "/walletsolidity/getmarketpricebypair"); + context.addServlet(new ServletHolder(getMarketOrderListByPairServlet), + "/walletsolidity/getmarketorderlistbypair"); + context.addServlet(new ServletHolder(getMarketPairListServlet), + "/walletsolidity/getmarketpairlist"); - context.addServlet(new ServletHolder(getMarketOrderByAccountServlet), - "/walletsolidity/getmarketorderbyaccount"); - context.addServlet(new ServletHolder(getMarketOrderByIdServlet), - "/walletsolidity/getmarketorderbyid"); - context.addServlet(new ServletHolder(getMarketPriceByPairServlet), - "/walletsolidity/getmarketpricebypair"); - context.addServlet(new ServletHolder(getMarketOrderListByPairServlet), - "/walletsolidity/getmarketorderlistbypair"); - context.addServlet(new ServletHolder(getMarketPairListServlet), - "/walletsolidity/getmarketpairlist"); + // only for SolidityNode + context.addServlet(new ServletHolder(getTransactionByIdServlet), + "/walletsolidity/gettransactionbyid"); - // only for SolidityNode - context.addServlet(new ServletHolder(getTransactionByIdServlet), - "/walletsolidity/gettransactionbyid"); + context + .addServlet(new ServletHolder(getTransactionInfoByIdServlet), + "/walletsolidity/gettransactioninfobyid"); + context + .addServlet(new ServletHolder(getTransactionCountByBlockNumServlet), + "/walletsolidity/gettransactioncountbyblocknum"); + context.addServlet(new ServletHolder(triggerConstantContractServlet), + "/walletsolidity/triggerconstantcontract"); + context.addServlet(new ServletHolder(estimateEnergyServlet), + "/walletsolidity/estimateenergy"); - context - .addServlet(new ServletHolder(getTransactionInfoByIdServlet), - "/walletsolidity/gettransactioninfobyid"); - context - .addServlet(new ServletHolder(getTransactionCountByBlockNumServlet), - "/walletsolidity/gettransactioncountbyblocknum"); - context.addServlet(new ServletHolder(triggerConstantContractServlet), - "/walletsolidity/triggerconstantcontract"); - context.addServlet(new ServletHolder(estimateEnergyServlet), - "/walletsolidity/estimateenergy"); - - context.addServlet(new ServletHolder(getNodeInfoServlet), "/wallet/getnodeinfo"); - context.addServlet(new ServletHolder(getNodeInfoServlet), "/walletsolidity/getnodeinfo"); - context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); - context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); - context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); - context.addServlet(new ServletHolder(getBlockServlet), "/walletsolidity/getblock"); - context.addServlet(new ServletHolder(getBandwidthPricesServlet), - "/walletsolidity/getbandwidthprices"); - context.addServlet(new ServletHolder(getEnergyPricesServlet), - "/walletsolidity/getenergyprices"); - - // http access filter - context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", - EnumSet.allOf(DispatcherType.class)); - context.getServletHandler().getFilterMappings()[0] - .setPathSpecs(new String[] {"/walletsolidity/*", - "/wallet/getnodeinfo"}); - - int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } + context.addServlet(new ServletHolder(getNodeInfoServlet), "/wallet/getnodeinfo"); + context.addServlet(new ServletHolder(getNodeInfoServlet), "/walletsolidity/getnodeinfo"); + context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); + context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); + context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); + context.addServlet(new ServletHolder(getBlockServlet), "/walletsolidity/getblock"); + context.addServlet(new ServletHolder(getBandwidthPricesServlet), + "/walletsolidity/getbandwidthprices"); + context.addServlet(new ServletHolder(getEnergyPricesServlet), + "/walletsolidity/getenergyprices"); + } - super.start(); - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + @Override + protected void addFilter(ServletContextHandler context) { + // http access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", + EnumSet.allOf(DispatcherType.class)); + context.getServletHandler().getFilterMappings()[0] + .setPathSpecs(new String[] {"/walletsolidity/*", + "/wallet/getnodeinfo"}); } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java index 1893a46045a..fffaf8d4e7b 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java @@ -1,14 +1,12 @@ package org.tron.core.services.interfaceJsonRpcOnPBFT; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; @Component @Slf4j(topic = "API") @@ -17,34 +15,14 @@ public class JsonRpcServiceOnPBFT extends HttpService { @Autowired private JsonRpcOnPBFTServlet jsonRpcOnPBFTServlet; - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { - port = CommonParameter.getInstance().getJsonRpcHttpPBFTPort(); + public JsonRpcServiceOnPBFT() { + port = Args.getInstance().getJsonRpcHttpPBFTPort(); + enable = isFullNode() && Args.getInstance().isJsonRpcHttpPBFTNodeEnable(); + contextPath = "/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); - - context.addServlet(new ServletHolder(jsonRpcOnPBFTServlet), "/jsonrpc"); - - int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } - - super.start(); - - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + public void addServlet(ServletContextHandler context) { + context.addServlet(new ServletHolder(jsonRpcOnPBFTServlet), "/jsonrpc"); } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java index 52f5b761ae2..a6f7d5dd5e7 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java @@ -1,14 +1,12 @@ package org.tron.core.services.interfaceJsonRpcOnSolidity; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; @Component @Slf4j(topic = "API") @@ -17,33 +15,14 @@ public class JsonRpcServiceOnSolidity extends HttpService { @Autowired private JsonRpcOnSolidityServlet jsonRpcOnSolidityServlet; - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { - port = CommonParameter.getInstance().getJsonRpcHttpSolidityPort(); + public JsonRpcServiceOnSolidity() { + port = Args.getInstance().getJsonRpcHttpSolidityPort(); + enable = isFullNode() && Args.getInstance().isJsonRpcHttpSolidityNodeEnable(); + contextPath = "/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); - - context.addServlet(new ServletHolder(jsonRpcOnSolidityServlet), "/jsonrpc"); - - int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } - super.start(); - - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + public void addServlet(ServletContextHandler context) { + context.addServlet(new ServletHolder(jsonRpcOnSolidityServlet), "/jsonrpc"); } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index cf945f664d1..54e7b69f7fc 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -1,9 +1,7 @@ package org.tron.core.services.interfaceOnPBFT; import io.grpc.netty.NettyServerBuilder; -import io.grpc.protobuf.services.ProtoReflectionService; import io.grpc.stub.StreamObserver; -import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.tron.api.DatabaseGrpc.DatabaseImplBase; @@ -36,14 +34,8 @@ import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.RpcService; -import org.tron.common.es.ExecutorServiceManager; -import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; -import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.PrometheusInterceptor; -import org.tron.core.services.ratelimiter.RateLimiterInterceptor; -import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.DelegatedResourceAccountIndex; @@ -71,78 +63,16 @@ public class RpcApiServiceOnPBFT extends RpcService { @Autowired private RpcApiService rpcApiService; - @Autowired - private RateLimiterInterceptor rateLimiterInterceptor; - - @Autowired - private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; - - @Autowired - private RpcApiAccessInterceptor apiAccessInterceptor; - - @Autowired - private PrometheusInterceptor prometheusInterceptor; - - private final String executorName = "rpc-pbft-executor"; - - @Override - public void init() { - } - - @Override - public void init(CommonParameter parameter) { + public RpcApiServiceOnPBFT() { port = Args.getInstance().getRpcOnPBFTPort(); + enable = isFullNode() && Args.getInstance().isRpcPBFTEnable(); + executorName = "rpc-pbft-executor"; } @Override - public void start() { - try { - NettyServerBuilder serverBuilder = NettyServerBuilder.forPort(port) - .addService(new DatabaseApi()); - - CommonParameter args = CommonParameter.getInstance(); - - if (args.getRpcThreadNum() > 0) { - serverBuilder = serverBuilder - .executor(ExecutorServiceManager.newFixedThreadPool( - executorName, args.getRpcThreadNum())); - } - - serverBuilder = serverBuilder.addService(new WalletPBFTApi()); - - // Set configs from config.conf or default value - serverBuilder - .maxConcurrentCallsPerConnection(args.getMaxConcurrentCallsPerConnection()) - .flowControlWindow(args.getFlowControlWindow()) - .maxConnectionIdle(args.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) - .maxConnectionAge(args.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxInboundMessageSize(args.getMaxMessageSize()) - .maxHeaderListSize(args.getMaxHeaderListSize()); - - // add a ratelimiter interceptor - serverBuilder.intercept(rateLimiterInterceptor); - - // add api access interceptor - serverBuilder.intercept(apiAccessInterceptor); - - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - - // add prometheus interceptor - if (args.isMetricsPrometheusEnable()) { - serverBuilder.intercept(prometheusInterceptor); - } - - if (args.isRpcReflectionServiceEnable()) { - serverBuilder.addService(ProtoReflectionService.newInstance()); - } - - apiServer = serverBuilder.build(); - rateLimiterInterceptor.init(apiServer); - super.start(); - } catch (Exception e) { - logger.debug(e.getMessage(), e); - } + protected void addService(NettyServerBuilder serverBuilder) { + serverBuilder.addService(new DatabaseApi()); + serverBuilder.addService(new WalletPBFTApi()); } /** diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index 7a5fd0cbcde..828d36e664f 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -3,14 +3,11 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; @@ -172,126 +169,109 @@ public class HttpApiOnPBFTService extends HttpService { @Autowired private GetDelegatedResourceV2OnPBFTServlet getDelegatedResourceV2OnPBFTServlet; - @Override - public void init() { - - } - - @Override - public void init(CommonParameter parameter) { + public HttpApiOnPBFTService() { port = Args.getInstance().getPBFTHttpPort(); + enable = isFullNode() && Args.getInstance().isPBFTHttpEnable(); + contextPath = "/walletpbft/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/walletpbft/"); - apiServer.setHandler(context); + protected void addServlet(ServletContextHandler context) { + // same as FullNode + context.addServlet(new ServletHolder(accountOnPBFTServlet), "/getaccount"); + context.addServlet(new ServletHolder(listWitnessesOnPBFTServlet), "/listwitnesses"); + context.addServlet(new ServletHolder(getAssetIssueListOnPBFTServlet), "/getassetissuelist"); + context.addServlet(new ServletHolder(getPaginatedAssetIssueListOnPBFTServlet), + "/getpaginatedassetissuelist"); + context + .addServlet(new ServletHolder(getAssetIssueByNameOnPBFTServlet), "/getassetissuebyname"); + context.addServlet(new ServletHolder(getAssetIssueByIdOnPBFTServlet), "/getassetissuebyid"); + context.addServlet(new ServletHolder(getAssetIssueListByNameOnPBFTServlet), + "/getassetissuelistbyname"); + context.addServlet(new ServletHolder(getNowBlockOnPBFTServlet), "/getnowblock"); + context.addServlet(new ServletHolder(getBlockByNumOnPBFTServlet), "/getblockbynum"); + context.addServlet(new ServletHolder(getDelegatedResourceOnPBFTServlet), + "/getdelegatedresource"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexOnPBFTServlet), + "/getdelegatedresourceaccountindex"); + context.addServlet(new ServletHolder(getExchangeByIdOnPBFTServlet), "/getexchangebyid"); + context.addServlet(new ServletHolder(listExchangesOnPBFTServlet), "/listexchanges"); + context.addServlet(new ServletHolder(getAccountByIdOnPBFTServlet), "/getaccountbyid"); + context.addServlet(new ServletHolder(getBlockByIdOnPBFTServlet), "/getblockbyid"); + context + .addServlet(new ServletHolder(getBlockByLimitNextOnPBFTServlet), "/getblockbylimitnext"); + context + .addServlet(new ServletHolder(getBlockByLatestNumOnPBFTServlet), "/getblockbylatestnum"); + context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoOnPBFTServlet), + "/getmerkletreevoucherinfo"); + context.addServlet(new ServletHolder(scanAndMarkNoteByIvkOnPBFTServlet), + "/scanandmarknotebyivk"); + context.addServlet(new ServletHolder(scanNoteByIvkOnPBFTServlet), "/scannotebyivk"); + context.addServlet(new ServletHolder(scanNoteByOvkOnPBFTServlet), "/scannotebyovk"); + context.addServlet(new ServletHolder(isSpendOnPBFTServlet), "/isspend"); + context.addServlet(new ServletHolder(triggerConstantContractOnPBFTServlet), + "/triggerconstantcontract"); + context.addServlet(new ServletHolder(estimateEnergyOnPBFTServlet), "/estimateenergy"); - // same as FullNode - context.addServlet(new ServletHolder(accountOnPBFTServlet), "/getaccount"); - context.addServlet(new ServletHolder(listWitnessesOnPBFTServlet), "/listwitnesses"); - context.addServlet(new ServletHolder(getAssetIssueListOnPBFTServlet), "/getassetissuelist"); - context.addServlet(new ServletHolder(getPaginatedAssetIssueListOnPBFTServlet), - "/getpaginatedassetissuelist"); - context - .addServlet(new ServletHolder(getAssetIssueByNameOnPBFTServlet), "/getassetissuebyname"); - context.addServlet(new ServletHolder(getAssetIssueByIdOnPBFTServlet), "/getassetissuebyid"); - context.addServlet(new ServletHolder(getAssetIssueListByNameOnPBFTServlet), - "/getassetissuelistbyname"); - context.addServlet(new ServletHolder(getNowBlockOnPBFTServlet), "/getnowblock"); - context.addServlet(new ServletHolder(getBlockByNumOnPBFTServlet), "/getblockbynum"); - context.addServlet(new ServletHolder(getDelegatedResourceOnPBFTServlet), - "/getdelegatedresource"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexOnPBFTServlet), - "/getdelegatedresourceaccountindex"); - context.addServlet(new ServletHolder(getExchangeByIdOnPBFTServlet), "/getexchangebyid"); - context.addServlet(new ServletHolder(listExchangesOnPBFTServlet), "/listexchanges"); - context.addServlet(new ServletHolder(getAccountByIdOnPBFTServlet), "/getaccountbyid"); - context.addServlet(new ServletHolder(getBlockByIdOnPBFTServlet), "/getblockbyid"); - context - .addServlet(new ServletHolder(getBlockByLimitNextOnPBFTServlet), "/getblockbylimitnext"); - context - .addServlet(new ServletHolder(getBlockByLatestNumOnPBFTServlet), "/getblockbylatestnum"); - context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoOnPBFTServlet), - "/getmerkletreevoucherinfo"); - context.addServlet(new ServletHolder(scanAndMarkNoteByIvkOnPBFTServlet), - "/scanandmarknotebyivk"); - context.addServlet(new ServletHolder(scanNoteByIvkOnPBFTServlet), "/scannotebyivk"); - context.addServlet(new ServletHolder(scanNoteByOvkOnPBFTServlet), "/scannotebyovk"); - context.addServlet(new ServletHolder(isSpendOnPBFTServlet), "/isspend"); - context.addServlet(new ServletHolder(triggerConstantContractOnPBFTServlet), - "/triggerconstantcontract"); - context.addServlet(new ServletHolder(estimateEnergyOnPBFTServlet), "/estimateenergy"); + // only for PBFTNode + context.addServlet(new ServletHolder(getTransactionByIdOnPBFTServlet), "/gettransactionbyid"); + context.addServlet(new ServletHolder(getTransactionInfoByIdOnPBFTServlet), + "/gettransactioninfobyid"); - // only for PBFTNode - context.addServlet(new ServletHolder(getTransactionByIdOnPBFTServlet), "/gettransactionbyid"); - context.addServlet(new ServletHolder(getTransactionInfoByIdOnPBFTServlet), - "/gettransactioninfobyid"); + context.addServlet(new ServletHolder(getTransactionCountByBlockNumOnPBFTServlet), + "/gettransactioncountbyblocknum"); - context.addServlet(new ServletHolder(getTransactionCountByBlockNumOnPBFTServlet), - "/gettransactioncountbyblocknum"); + context.addServlet(new ServletHolder(getNodeInfoOnPBFTServlet), "/getnodeinfo"); + context.addServlet(new ServletHolder(getBrokerageServlet), "/getBrokerage"); + context.addServlet(new ServletHolder(getRewardServlet), "/getReward"); - context.addServlet(new ServletHolder(getNodeInfoOnPBFTServlet), "/getnodeinfo"); - context.addServlet(new ServletHolder(getBrokerageServlet), "/getBrokerage"); - context.addServlet(new ServletHolder(getRewardServlet), "/getReward"); + context.addServlet(new ServletHolder(getMarketOrderByAccountOnPBFTServlet), + "/getmarketorderbyaccount"); + context.addServlet(new ServletHolder(getMarketOrderByIdOnPBFTServlet), + "/getmarketorderbyid"); + context.addServlet(new ServletHolder(getMarketPriceByPairOnPBFTServlet), + "/getmarketpricebypair"); + context.addServlet(new ServletHolder(getMarketOrderListByPairOnPBFTServlet), + "/getmarketorderlistbypair"); + context.addServlet(new ServletHolder(getMarketPairListOnPBFTServlet), + "/getmarketpairlist"); - context.addServlet(new ServletHolder(getMarketOrderByAccountOnPBFTServlet), - "/getmarketorderbyaccount"); - context.addServlet(new ServletHolder(getMarketOrderByIdOnPBFTServlet), - "/getmarketorderbyid"); - context.addServlet(new ServletHolder(getMarketPriceByPairOnPBFTServlet), - "/getmarketpricebypair"); - context.addServlet(new ServletHolder(getMarketOrderListByPairOnPBFTServlet), - "/getmarketorderlistbypair"); - context.addServlet(new ServletHolder(getMarketPairListOnPBFTServlet), - "/getmarketpairlist"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkOnPBFTServlet), + "/scanshieldedtrc20notesbyivk"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkOnPBFTServlet), + "/scanshieldedtrc20notesbyovk"); + context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentOnPBFTServlet), + "/isshieldedtrc20contractnotespent"); + context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), + "/getburntrx"); + context.addServlet(new ServletHolder(getBandwidthPricesOnPBFTServlet), + "/getbandwidthprices"); + context.addServlet(new ServletHolder(getEnergyPricesOnPBFTServlet), + "/getenergyprices"); + context.addServlet(new ServletHolder(getBlockOnPBFTServlet), + "/getblock"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkOnPBFTServlet), - "/scanshieldedtrc20notesbyivk"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkOnPBFTServlet), - "/scanshieldedtrc20notesbyovk"); - context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentOnPBFTServlet), - "/isshieldedtrc20contractnotespent"); - context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), - "/getburntrx"); - context.addServlet(new ServletHolder(getBandwidthPricesOnPBFTServlet), - "/getbandwidthprices"); - context.addServlet(new ServletHolder(getEnergyPricesOnPBFTServlet), - "/getenergyprices"); - context.addServlet(new ServletHolder(getBlockOnPBFTServlet), - "/getblock"); - - context.addServlet(new ServletHolder(getAvailableUnfreezeCountOnPBFTServlet), - "/getavailableunfreezecount"); - context.addServlet(new ServletHolder(getCanDelegatedMaxSizeOnPBFTServlet), - "/getcandelegatedmaxsize"); - context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountOnPBFTServlet), - "/getcanwithdrawunfreezeamount"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2OnPBFTServlet), - "/getdelegatedresourceaccountindexv2"); - context.addServlet(new ServletHolder(getDelegatedResourceV2OnPBFTServlet), - "/getdelegatedresourcev2"); - - int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } - - // filters the specified APIs - // when node is lite fullnode and openHistoryQueryWhenLiteFN is false - context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", - EnumSet.allOf(DispatcherType.class)); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountOnPBFTServlet), + "/getavailableunfreezecount"); + context.addServlet(new ServletHolder(getCanDelegatedMaxSizeOnPBFTServlet), + "/getcandelegatedmaxsize"); + context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountOnPBFTServlet), + "/getcanwithdrawunfreezeamount"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2OnPBFTServlet), + "/getdelegatedresourceaccountindexv2"); + context.addServlet(new ServletHolder(getDelegatedResourceV2OnPBFTServlet), + "/getdelegatedresourcev2"); + } - // api access filter - context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", - EnumSet.allOf(DispatcherType.class)); + @Override + protected void addFilter(ServletContextHandler context) { + // filters the specified APIs + // when node is lite fullnode and openHistoryQueryWhenLiteFN is false + context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", + EnumSet.allOf(DispatcherType.class)); - super.start(); - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + // api access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 4bd3fbe4fef..aa566f56042 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -2,9 +2,7 @@ import com.google.protobuf.ByteString; import io.grpc.netty.NettyServerBuilder; -import io.grpc.protobuf.services.ProtoReflectionService; import io.grpc.stub.StreamObserver; -import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.tron.api.DatabaseGrpc.DatabaseImplBase; @@ -35,16 +33,11 @@ import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.RpcService; -import org.tron.common.es.ExecutorServiceManager; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.BlockCapsule; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; -import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.PrometheusInterceptor; -import org.tron.core.services.ratelimiter.RateLimiterInterceptor; -import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.DelegatedResourceAccountIndex; @@ -73,77 +66,16 @@ public class RpcApiServiceOnSolidity extends RpcService { @Autowired private RpcApiService rpcApiService; - @Autowired - private RateLimiterInterceptor rateLimiterInterceptor; - - @Autowired - private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; - - @Autowired - private RpcApiAccessInterceptor apiAccessInterceptor; - - @Autowired - private PrometheusInterceptor prometheusInterceptor; - - private final String executorName = "rpc-solidity-executor"; - - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { + public RpcApiServiceOnSolidity() { port = Args.getInstance().getRpcOnSolidityPort(); + enable = isFullNode() && Args.getInstance().isRpcSolidityEnable(); + executorName = "rpc-solidity-executor"; } @Override - public void start() { - try { - NettyServerBuilder serverBuilder = NettyServerBuilder.forPort(port) - .addService(new DatabaseApi()); - - CommonParameter parameter = Args.getInstance(); - - if (parameter.getRpcThreadNum() > 0) { - serverBuilder = serverBuilder - .executor(ExecutorServiceManager.newFixedThreadPool( - executorName, parameter.getRpcThreadNum())); - } - - serverBuilder = serverBuilder.addService(new WalletSolidityApi()); - - // Set configs from config.conf or default value - serverBuilder.maxConcurrentCallsPerConnection(parameter.getMaxConcurrentCallsPerConnection()) - .flowControlWindow(parameter.getFlowControlWindow()) - .maxConnectionIdle(parameter.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) - .maxConnectionAge(parameter.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxInboundMessageSize(parameter.getMaxMessageSize()) - .maxHeaderListSize(parameter.getMaxHeaderListSize()); - - // add a ratelimiter interceptor - serverBuilder.intercept(rateLimiterInterceptor); - - // add api access interceptor - serverBuilder.intercept(apiAccessInterceptor); - - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - - // add prometheus interceptor - if (parameter.isMetricsPrometheusEnable()) { - serverBuilder.intercept(prometheusInterceptor); - } - - if (parameter.isRpcReflectionServiceEnable()) { - serverBuilder.addService(ProtoReflectionService.newInstance()); - } - - apiServer = serverBuilder.build(); - rateLimiterInterceptor.init(apiServer); - super.start(); - } catch (Exception e) { - logger.debug(e.getMessage(), e); - } + protected void addService(NettyServerBuilder serverBuilder) { + serverBuilder.addService(new DatabaseApi()); + serverBuilder.addService(new WalletSolidityApi()); } private TransactionExtention transaction2Extention(Transaction transaction) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index f89be80c71b..b1d940ce2cd 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -10,7 +10,6 @@ import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; @@ -178,144 +177,129 @@ public class HttpApiOnSolidityService extends HttpService { @Autowired private GetBlockOnSolidityServlet getBlockOnSolidityServlet; - @Override - public void init() { - - } - - @Override - public void init(CommonParameter args) { + public HttpApiOnSolidityService() { port = Args.getInstance().getSolidityHttpPort(); + enable = isFullNode() && Args.getInstance().isSolidityNodeHttpEnable(); + contextPath = "/"; } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); - - // same as FullNode - context.addServlet(new ServletHolder(accountOnSolidityServlet), "/walletsolidity/getaccount"); - context.addServlet(new ServletHolder(listWitnessesOnSolidityServlet), - "/walletsolidity/listwitnesses"); - context.addServlet(new ServletHolder(getAssetIssueListOnSolidityServlet), - "/walletsolidity/getassetissuelist"); - context.addServlet(new ServletHolder(getPaginatedAssetIssueListOnSolidityServlet), - "/walletsolidity/getpaginatedassetissuelist"); - context.addServlet(new ServletHolder(getAssetIssueByNameOnSolidityServlet), - "/walletsolidity/getassetissuebyname"); - context.addServlet(new ServletHolder(getAssetIssueByIdOnSolidityServlet), - "/walletsolidity/getassetissuebyid"); - context.addServlet(new ServletHolder(getAssetIssueListByNameOnSolidityServlet), - "/walletsolidity/getassetissuelistbyname"); - context.addServlet(new ServletHolder(getNowBlockOnSolidityServlet), - "/walletsolidity/getnowblock"); - context.addServlet(new ServletHolder(getBlockByNumOnSolidityServlet), - "/walletsolidity/getblockbynum"); - context.addServlet(new ServletHolder(getDelegatedResourceOnSolidityServlet), - "/walletsolidity/getdelegatedresource"); - context.addServlet(new ServletHolder(getDelegatedResourceV2OnSolidityServlet), - "/walletsolidity/getdelegatedresourcev2"); - context.addServlet(new ServletHolder(getCanDelegatedMaxSizeOnSolidityServlet), - "/walletsolidity/getcandelegatedmaxsize"); - context.addServlet(new ServletHolder(getAvailableUnfreezeCountOnSolidityServlet), - "/walletsolidity/getavailableunfreezecount"); - context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountOnSolidityServlet), - "/walletsolidity/getcanwithdrawunfreezeamount"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexOnSolidityServlet), - "/walletsolidity/getdelegatedresourceaccountindex"); - context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2OnSolidityServlet), - "/walletsolidity/getdelegatedresourceaccountindexv2"); - context.addServlet(new ServletHolder(getExchangeByIdOnSolidityServlet), - "/walletsolidity/getexchangebyid"); - context.addServlet(new ServletHolder(listExchangesOnSolidityServlet), - "/walletsolidity/listexchanges"); - context.addServlet(new ServletHolder(getAccountByIdOnSolidityServlet), - "/walletsolidity/getaccountbyid"); - context.addServlet(new ServletHolder(getBlockByIdOnSolidityServlet), - "/walletsolidity/getblockbyid"); - context.addServlet(new ServletHolder(getBlockByLimitNextOnSolidityServlet), - "/walletsolidity/getblockbylimitnext"); - context.addServlet(new ServletHolder(getBlockByLatestNumOnSolidityServlet), - "/walletsolidity/getblockbylatestnum"); - // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoOnSolidityServlet), - // "/walletsolidity/getmerkletreevoucherinfo"); - // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkOnSolidityServlet), - // "/walletsolidity/scanandmarknotebyivk"); - // context.addServlet(new ServletHolder(scanNoteByIvkOnSolidityServlet), - // "/walletsolidity/scannotebyivk"); - // context.addServlet(new ServletHolder(scanNoteByOvkOnSolidityServlet), - // "/walletsolidity/scannotebyovk"); - // context.addServlet(new ServletHolder(isSpendOnSolidityServlet), - // "/walletsolidity/isspend"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkOnSolidityServlet), - "/walletsolidity/scanshieldedtrc20notesbyivk"); - context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkOnSolidityServlet), - "/walletsolidity/scanshieldedtrc20notesbyovk"); - context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentOnSolidityServlet), - "/walletsolidity/isshieldedtrc20contractnotespent"); - context.addServlet(new ServletHolder(triggerConstantContractOnSolidityServlet), - "/walletsolidity/triggerconstantcontract"); - context.addServlet(new ServletHolder(estimateEnergyOnSolidityServlet), - "/walletsolidity/estimateenergy"); - context.addServlet(new ServletHolder(getTransactionInfoByBlockNumOnSolidityServlet), - "/walletsolidity/gettransactioninfobyblocknum"); - context.addServlet(new ServletHolder(getMarketOrderByAccountOnSolidityServlet), - "/walletsolidity/getmarketorderbyaccount"); - context.addServlet(new ServletHolder(getMarketOrderByIdOnSolidityServlet), - "/walletsolidity/getmarketorderbyid"); - context.addServlet(new ServletHolder(getMarketPriceByPairOnSolidityServlet), - "/walletsolidity/getmarketpricebypair"); - context.addServlet(new ServletHolder(getMarketOrderListByPairOnSolidityServlet), - "/walletsolidity/getmarketorderlistbypair"); - context.addServlet(new ServletHolder(getMarketPairListOnSolidityServlet), - "/walletsolidity/getmarketpairlist"); + protected void addServlet(ServletContextHandler context) { + // same as FullNode + context.addServlet(new ServletHolder(accountOnSolidityServlet), "/walletsolidity/getaccount"); + context.addServlet(new ServletHolder(listWitnessesOnSolidityServlet), + "/walletsolidity/listwitnesses"); + context.addServlet(new ServletHolder(getAssetIssueListOnSolidityServlet), + "/walletsolidity/getassetissuelist"); + context.addServlet(new ServletHolder(getPaginatedAssetIssueListOnSolidityServlet), + "/walletsolidity/getpaginatedassetissuelist"); + context.addServlet(new ServletHolder(getAssetIssueByNameOnSolidityServlet), + "/walletsolidity/getassetissuebyname"); + context.addServlet(new ServletHolder(getAssetIssueByIdOnSolidityServlet), + "/walletsolidity/getassetissuebyid"); + context.addServlet(new ServletHolder(getAssetIssueListByNameOnSolidityServlet), + "/walletsolidity/getassetissuelistbyname"); + context.addServlet(new ServletHolder(getNowBlockOnSolidityServlet), + "/walletsolidity/getnowblock"); + context.addServlet(new ServletHolder(getBlockByNumOnSolidityServlet), + "/walletsolidity/getblockbynum"); + context.addServlet(new ServletHolder(getDelegatedResourceOnSolidityServlet), + "/walletsolidity/getdelegatedresource"); + context.addServlet(new ServletHolder(getDelegatedResourceV2OnSolidityServlet), + "/walletsolidity/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getCanDelegatedMaxSizeOnSolidityServlet), + "/walletsolidity/getcandelegatedmaxsize"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountOnSolidityServlet), + "/walletsolidity/getavailableunfreezecount"); + context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountOnSolidityServlet), + "/walletsolidity/getcanwithdrawunfreezeamount"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexOnSolidityServlet), + "/walletsolidity/getdelegatedresourceaccountindex"); + context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexV2OnSolidityServlet), + "/walletsolidity/getdelegatedresourceaccountindexv2"); + context.addServlet(new ServletHolder(getExchangeByIdOnSolidityServlet), + "/walletsolidity/getexchangebyid"); + context.addServlet(new ServletHolder(listExchangesOnSolidityServlet), + "/walletsolidity/listexchanges"); + context.addServlet(new ServletHolder(getAccountByIdOnSolidityServlet), + "/walletsolidity/getaccountbyid"); + context.addServlet(new ServletHolder(getBlockByIdOnSolidityServlet), + "/walletsolidity/getblockbyid"); + context.addServlet(new ServletHolder(getBlockByLimitNextOnSolidityServlet), + "/walletsolidity/getblockbylimitnext"); + context.addServlet(new ServletHolder(getBlockByLatestNumOnSolidityServlet), + "/walletsolidity/getblockbylatestnum"); + // context.addServlet(new ServletHolder(getMerkleTreeVoucherInfoOnSolidityServlet), + // "/walletsolidity/getmerkletreevoucherinfo"); + // context.addServlet(new ServletHolder(scanAndMarkNoteByIvkOnSolidityServlet), + // "/walletsolidity/scanandmarknotebyivk"); + // context.addServlet(new ServletHolder(scanNoteByIvkOnSolidityServlet), + // "/walletsolidity/scannotebyivk"); + // context.addServlet(new ServletHolder(scanNoteByOvkOnSolidityServlet), + // "/walletsolidity/scannotebyovk"); + // context.addServlet(new ServletHolder(isSpendOnSolidityServlet), + // "/walletsolidity/isspend"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByIvkOnSolidityServlet), + "/walletsolidity/scanshieldedtrc20notesbyivk"); + context.addServlet(new ServletHolder(scanShieldedTRC20NotesByOvkOnSolidityServlet), + "/walletsolidity/scanshieldedtrc20notesbyovk"); + context.addServlet(new ServletHolder(isShieldedTRC20ContractNoteSpentOnSolidityServlet), + "/walletsolidity/isshieldedtrc20contractnotespent"); + context.addServlet(new ServletHolder(triggerConstantContractOnSolidityServlet), + "/walletsolidity/triggerconstantcontract"); + context.addServlet(new ServletHolder(estimateEnergyOnSolidityServlet), + "/walletsolidity/estimateenergy"); + context.addServlet(new ServletHolder(getTransactionInfoByBlockNumOnSolidityServlet), + "/walletsolidity/gettransactioninfobyblocknum"); + context.addServlet(new ServletHolder(getMarketOrderByAccountOnSolidityServlet), + "/walletsolidity/getmarketorderbyaccount"); + context.addServlet(new ServletHolder(getMarketOrderByIdOnSolidityServlet), + "/walletsolidity/getmarketorderbyid"); + context.addServlet(new ServletHolder(getMarketPriceByPairOnSolidityServlet), + "/walletsolidity/getmarketpricebypair"); + context.addServlet(new ServletHolder(getMarketOrderListByPairOnSolidityServlet), + "/walletsolidity/getmarketorderlistbypair"); + context.addServlet(new ServletHolder(getMarketPairListOnSolidityServlet), + "/walletsolidity/getmarketpairlist"); - // only for SolidityNode - context.addServlet(new ServletHolder(getTransactionByIdOnSolidityServlet), - "/walletsolidity/gettransactionbyid"); - context.addServlet(new ServletHolder(getTransactionInfoByIdOnSolidityServlet), - "/walletsolidity/gettransactioninfobyid"); + // only for SolidityNode + context.addServlet(new ServletHolder(getTransactionByIdOnSolidityServlet), + "/walletsolidity/gettransactionbyid"); + context.addServlet(new ServletHolder(getTransactionInfoByIdOnSolidityServlet), + "/walletsolidity/gettransactioninfobyid"); - context.addServlet(new ServletHolder(getTransactionCountByBlockNumOnSolidityServlet), - "/walletsolidity/gettransactioncountbyblocknum"); + context.addServlet(new ServletHolder(getTransactionCountByBlockNumOnSolidityServlet), + "/walletsolidity/gettransactioncountbyblocknum"); - context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/wallet/getnodeinfo"); - context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), - "/walletsolidity/getnodeinfo"); - context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); - context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); - context - .addServlet(new ServletHolder(getBurnTrxOnSolidityServlet), "/walletsolidity/getburntrx"); - context.addServlet(new ServletHolder(getBandwidthPricesOnSolidityServlet), - "/walletsolidity/getbandwidthprices"); - context.addServlet(new ServletHolder(getEnergyPricesOnSolidityServlet), - "/walletsolidity/getenergyprices"); + context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/wallet/getnodeinfo"); + context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), + "/walletsolidity/getnodeinfo"); + context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); + context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); + context + .addServlet(new ServletHolder(getBurnTrxOnSolidityServlet), "/walletsolidity/getburntrx"); + context.addServlet(new ServletHolder(getBandwidthPricesOnSolidityServlet), + "/walletsolidity/getbandwidthprices"); + context.addServlet(new ServletHolder(getEnergyPricesOnSolidityServlet), + "/walletsolidity/getenergyprices"); - context.addServlet(new ServletHolder(getBlockOnSolidityServlet), - "/walletsolidity/getblock"); + context.addServlet(new ServletHolder(getBlockOnSolidityServlet), + "/walletsolidity/getblock"); - // filters the specified APIs - // when node is lite fullnode and openHistoryQueryWhenLiteFN is false - context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", - EnumSet.allOf(DispatcherType.class)); + } - // api access filter - context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", - EnumSet.allOf(DispatcherType.class)); - context.getServletHandler().getFilterMappings()[1] - .setPathSpecs(new String[] {"/walletsolidity/*", - "/wallet/getnodeinfo"}); + @Override + protected void addFilter(ServletContextHandler context) { + // filters the specified APIs + // when node is lite fullnode and openHistoryQueryWhenLiteFN is false + context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", + EnumSet.allOf(DispatcherType.class)); - int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } - super.start(); - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + // api access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", + EnumSet.allOf(DispatcherType.class)); + context.getServletHandler().getFilterMappings()[1] + .setPathSpecs(new String[] {"/walletsolidity/*", + "/wallet/getnodeinfo"}); } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index ff017f9562e..566ad33a722 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -3,8 +3,6 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.ConnectionLimit; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHandler; @@ -12,7 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.HttpService; -import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; import org.tron.core.services.filter.HttpInterceptor; @Component @@ -22,41 +20,24 @@ public class FullNodeJsonRpcHttpService extends HttpService { @Autowired private JsonRpcServlet jsonRpcServlet; - @Override - public void init() { + public FullNodeJsonRpcHttpService() { + port = Args.getInstance().getJsonRpcHttpFullNodePort(); + enable = isFullNode() && Args.getInstance().isJsonRpcHttpFullNodeEnable(); + contextPath = "/"; } @Override - public void init(CommonParameter args) { - port = CommonParameter.getInstance().getJsonRpcHttpFullNodePort(); + protected void addServlet(ServletContextHandler context) { + context.addServlet(new ServletHolder(jsonRpcServlet), "/jsonrpc"); } @Override - public void start() { - try { - apiServer = new Server(port); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - apiServer.setHandler(context); - - context.addServlet(new ServletHolder(jsonRpcServlet), "/jsonrpc"); - - int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); - if (maxHttpConnectNumber > 0) { - apiServer.addBean(new ConnectionLimit(maxHttpConnectNumber, apiServer)); - } - - // filter - ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler - .addFilterWithMapping(HttpInterceptor.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); - - super.start(); - - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } + protected void addFilter(ServletContextHandler context) { + // filter + ServletHandler handler = new ServletHandler(); + FilterHolder fh = handler + .addFilterWithMapping(HttpInterceptor.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); } } diff --git a/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java b/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java index 8b9aafe4715..04405dfc758 100644 --- a/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java +++ b/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java @@ -6,7 +6,6 @@ import javax.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; import org.tron.common.zksnark.JLibrustzcash; import org.tron.common.zksnark.LibrustzcashParam; @@ -14,7 +13,6 @@ @Slf4j(topic = "API") @Component -@DependsOn("fullNodeHttpApiService") public class ZksnarkInitService { @PostConstruct diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 0fd87eb5de0..b7adf0ffe1a 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -15,16 +15,6 @@ import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.net.P2pEventHandlerImpl; -import org.tron.core.services.RpcApiService; -import org.tron.core.services.http.FullNodeHttpApiService; -import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; -import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcServiceOnSolidity; -import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; -import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; -import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; -import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; -import org.tron.core.services.jsonrpc.FullNodeJsonRpcHttpService; @Slf4j(topic = "app") public class FullNode { @@ -80,55 +70,6 @@ public static void main(String[] args) { context.refresh(); Application appT = ApplicationFactory.create(context); context.registerShutdownHook(); - - // grpc api server - RpcApiService rpcApiService = context.getBean(RpcApiService.class); - appT.addService(rpcApiService); - - // http api server - FullNodeHttpApiService httpApiService = context.getBean(FullNodeHttpApiService.class); - if (CommonParameter.getInstance().fullNodeHttpEnable) { - appT.addService(httpApiService); - } - - // JSON-RPC http server - if (CommonParameter.getInstance().jsonRpcHttpFullNodeEnable) { - FullNodeJsonRpcHttpService jsonRpcHttpService = - context.getBean(FullNodeJsonRpcHttpService.class); - appT.addService(jsonRpcHttpService); - } - - // full node and solidity node fuse together - // provide solidity rpc and http server on the full node. - RpcApiServiceOnSolidity rpcApiServiceOnSolidity = context - .getBean(RpcApiServiceOnSolidity.class); - appT.addService(rpcApiServiceOnSolidity); - HttpApiOnSolidityService httpApiOnSolidityService = context - .getBean(HttpApiOnSolidityService.class); - if (CommonParameter.getInstance().solidityNodeHttpEnable) { - appT.addService(httpApiOnSolidityService); - } - - // JSON-RPC on solidity - if (CommonParameter.getInstance().jsonRpcHttpSolidityNodeEnable) { - JsonRpcServiceOnSolidity jsonRpcServiceOnSolidity = context - .getBean(JsonRpcServiceOnSolidity.class); - appT.addService(jsonRpcServiceOnSolidity); - } - - // PBFT API (HTTP and GRPC) - RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context - .getBean(RpcApiServiceOnPBFT.class); - appT.addService(rpcApiServiceOnPBFT); - HttpApiOnPBFTService httpApiOnPBFTService = context - .getBean(HttpApiOnPBFTService.class); - appT.addService(httpApiOnPBFTService); - - // JSON-RPC on PBFT - if (CommonParameter.getInstance().jsonRpcHttpPBFTNodeEnable) { - JsonRpcServiceOnPBFT jsonRpcServiceOnPBFT = context.getBean(JsonRpcServiceOnPBFT.class); - appT.addService(jsonRpcServiceOnPBFT); - } appT.startup(); appT.blockUntilShutdown(); } diff --git a/framework/src/main/java/org/tron/program/SolidityNode.java b/framework/src/main/java/org/tron/program/SolidityNode.java index 4cf71177803..8def8ed7ebc 100644 --- a/framework/src/main/java/org/tron/program/SolidityNode.java +++ b/framework/src/main/java/org/tron/program/SolidityNode.java @@ -6,9 +6,8 @@ import java.util.concurrent.atomic.AtomicLong; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; -import org.springframework.context.ApplicationContext; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -21,8 +20,6 @@ import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.Manager; -import org.tron.core.services.RpcApiService; -import org.tron.core.services.http.solidity.SolidityNodeHttpApiService; import org.tron.protos.Protocol.Block; @Slf4j(topic = "app") @@ -71,9 +68,6 @@ public static void main(String[] args) { } parameter.setSolidityNode(true); - TronApplicationContext context = new TronApplicationContext(DefaultConfig.class); - context.registerShutdownHook(); - if (parameter.isHelp()) { logger.info("Here is the help message."); return; @@ -81,18 +75,17 @@ public static void main(String[] args) { // init metrics first Metrics.init(); + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + beanFactory.setAllowCircularReferences(false); + TronApplicationContext context = + new TronApplicationContext(beanFactory); + context.register(DefaultConfig.class); + context.refresh(); Application appT = ApplicationFactory.create(context); - RpcApiService rpcApiService = context.getBean(RpcApiService.class); - appT.addService(rpcApiService); - //http - SolidityNodeHttpApiService httpApiService = context.getBean(SolidityNodeHttpApiService.class); - if (CommonParameter.getInstance().solidityNodeHttpEnable) { - appT.addService(httpApiService); - } - + context.registerShutdownHook(); + appT.startup(); SolidityNode node = new SolidityNode(appT.getDbManager()); node.start(); - appT.startup(); appT.blockUntilShutdown(); } diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index f9fc2dd673d..49b11d41e42 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -210,6 +210,8 @@ node { fullNodePort = 8090 solidityEnable = true solidityPort = 8091 + PBFTEnable = true + PBFTPort = 8092 } # use your ipv6 address for node discovery and tcp connection, default false @@ -226,8 +228,12 @@ node { } rpc { + enable = true port = 50051 - #solidityPort = 50061 + solidityEnable = true + solidityPort = 50061 + PBFTEnable = true + PBFTPort = 50071 # Number of gRPC thread, default availableProcessors / 2 # thread = 16 diff --git a/framework/src/test/java/org/tron/common/jetty/JettyServerTest.java b/framework/src/test/java/org/tron/common/jetty/JettyServerTest.java index fec29de0cb6..fbb2721f502 100644 --- a/framework/src/test/java/org/tron/common/jetty/JettyServerTest.java +++ b/framework/src/test/java/org/tron/common/jetty/JettyServerTest.java @@ -15,6 +15,7 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import org.tron.common.utils.PublicMethod; @Slf4j public class JettyServerTest { @@ -25,7 +26,7 @@ public class JettyServerTest { public static void startJetty() throws Exception { server = new Server(); ServerConnector connector = new ServerConnector(server); - connector.setPort(0); + connector.setPort(PublicMethod.chooseRandomPort()); server.addConnector(connector); ServletContextHandler context = new ServletContextHandler(); diff --git a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java index 61f34b647c5..196941328b4 100644 --- a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java @@ -17,11 +17,14 @@ import com.google.common.collect.Lists; import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; import io.grpc.internal.GrpcUtil; import io.grpc.netty.NettyServerBuilder; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; @@ -31,6 +34,7 @@ import org.tron.common.args.GenesisBlock; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.LocalWitnesses; import org.tron.common.utils.PublicMethod; import org.tron.core.Constant; @@ -53,7 +57,7 @@ public void destroy() { @Test public void get() { - Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {"-w", "-c", Constant.TEST_CONF}, Constant.TESTNET_CONF); CommonParameter parameter = Args.getInstance(); @@ -65,7 +69,7 @@ public void get() { Args.setLocalWitnesses(localWitnesses); address = ByteArray.toHexString(Args.getLocalWitnesses() .getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine())); - + Assert.assertEquals(Constant.ADD_PRE_FIX_STRING_TESTNET, DecodeUtil.addressPreFixString); Assert.assertEquals(0, parameter.getBackupPriority()); Assert.assertEquals(3000, parameter.getKeepAliveInterval()); @@ -149,7 +153,96 @@ public void testIpFromLibP2p() @Test public void testOldRewardOpt() { thrown.expect(IllegalArgumentException.class); - Args.setParam(new String[] {"-w"}, "args-test.conf"); + Args.setParam(new String[] {"-w", "-c", "args-test.conf"}, Constant.TESTNET_CONF); + } + + @Test + public void testInitService() { + Map storage = new HashMap<>(); + // avoid the exception for the missing storage + storage.put("storage.db.directory", "database"); + Config config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); + // test default value + Args.setParam(config); + Assert.assertTrue(Args.getInstance().isRpcEnable()); + Assert.assertTrue(Args.getInstance().isRpcSolidityEnable()); + Assert.assertTrue(Args.getInstance().isRpcPBFTEnable()); + Assert.assertTrue(Args.getInstance().isFullNodeHttpEnable()); + Assert.assertTrue(Args.getInstance().isSolidityNodeHttpEnable()); + Assert.assertTrue(Args.getInstance().isPBFTHttpEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpFullNodeEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Args.clearParam(); + // test set all true value + storage.put("node.rpc.enable", "true"); + storage.put("node.rpc.solidityEnable", "true"); + storage.put("node.rpc.PBFTEnable", "true"); + storage.put("node.http.fullNodeEnable", "true"); + storage.put("node.http.solidityEnable", "true"); + storage.put("node.http.PBFTEnable", "true"); + storage.put("node.jsonrpc.httpFullNodeEnable", "true"); + storage.put("node.jsonrpc.httpSolidityEnable", "true"); + storage.put("node.jsonrpc.httpPBFTEnable", "true"); + config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); + // test value + Args.setParam(config); + Assert.assertTrue(Args.getInstance().isRpcEnable()); + Assert.assertTrue(Args.getInstance().isRpcSolidityEnable()); + Assert.assertTrue(Args.getInstance().isRpcPBFTEnable()); + Assert.assertTrue(Args.getInstance().isFullNodeHttpEnable()); + Assert.assertTrue(Args.getInstance().isSolidityNodeHttpEnable()); + Assert.assertTrue(Args.getInstance().isPBFTHttpEnable()); + Assert.assertTrue(Args.getInstance().isJsonRpcHttpFullNodeEnable()); + Assert.assertTrue(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); + Assert.assertTrue(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Args.clearParam(); + // test set all false value + storage.put("node.rpc.enable", "false"); + storage.put("node.rpc.solidityEnable", "false"); + storage.put("node.rpc.PBFTEnable", "false"); + storage.put("node.http.fullNodeEnable", "false"); + storage.put("node.http.solidityEnable", "false"); + storage.put("node.http.PBFTEnable", "false"); + storage.put("node.jsonrpc.httpFullNodeEnable", "false"); + storage.put("node.jsonrpc.httpSolidityEnable", "false"); + storage.put("node.jsonrpc.httpPBFTEnable", "false"); + config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); + // test value + Args.setParam(config); + Assert.assertFalse(Args.getInstance().isRpcEnable()); + Assert.assertFalse(Args.getInstance().isRpcSolidityEnable()); + Assert.assertFalse(Args.getInstance().isRpcPBFTEnable()); + Assert.assertFalse(Args.getInstance().isFullNodeHttpEnable()); + Assert.assertFalse(Args.getInstance().isSolidityNodeHttpEnable()); + Assert.assertFalse(Args.getInstance().isPBFTHttpEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpFullNodeEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Args.clearParam(); + // test set random value + storage.put("node.rpc.enable", "false"); + storage.put("node.rpc.solidityEnable", "false"); + storage.put("node.rpc.PBFTEnable", "true"); + storage.put("node.http.fullNodeEnable", "false"); + storage.put("node.http.solidityEnable", "true"); + storage.put("node.http.PBFTEnable", "false"); + storage.put("node.jsonrpc.httpFullNodeEnable", "true"); + storage.put("node.jsonrpc.httpSolidityEnable", "false"); + storage.put("node.jsonrpc.httpPBFTEnable", "true"); + config = ConfigFactory.defaultOverrides().withFallback(ConfigFactory.parseMap(storage)); + // test value + Args.setParam(config); + Assert.assertFalse(Args.getInstance().isRpcEnable()); + Assert.assertFalse(Args.getInstance().isRpcSolidityEnable()); + Assert.assertTrue(Args.getInstance().isRpcPBFTEnable()); + Assert.assertFalse(Args.getInstance().isFullNodeHttpEnable()); + Assert.assertTrue(Args.getInstance().isSolidityNodeHttpEnable()); + Assert.assertFalse(Args.getInstance().isPBFTHttpEnable()); + Assert.assertTrue(Args.getInstance().isJsonRpcHttpFullNodeEnable()); + Assert.assertFalse(Args.getInstance().isJsonRpcHttpSolidityNodeEnable()); + Assert.assertTrue(Args.getInstance().isJsonRpcHttpPBFTNodeEnable()); + Args.clearParam(); } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index b3ed26b591f..6bf83ddc534 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -21,6 +21,7 @@ import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.PublicMethod; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -66,9 +67,13 @@ public class JsonrpcServiceTest extends BaseTest { static { Args.setParam(new String[]{"--output-directory", dbPath()}, Constant.TEST_CONF); CommonParameter.getInstance().setJsonRpcHttpFullNodeEnable(true); + CommonParameter.getInstance().setJsonRpcHttpFullNodePort(PublicMethod.chooseRandomPort()); CommonParameter.getInstance().setJsonRpcHttpPBFTNodeEnable(true); + CommonParameter.getInstance().setJsonRpcHttpPBFTPort(PublicMethod.chooseRandomPort()); CommonParameter.getInstance().setJsonRpcHttpSolidityNodeEnable(true); + CommonParameter.getInstance().setJsonRpcHttpSolidityPort(PublicMethod.chooseRandomPort()); CommonParameter.getInstance().setMetricsPrometheusEnable(true); + CommonParameter.getInstance().setMetricsPrometheusPort(PublicMethod.chooseRandomPort()); Metrics.init(); OWNER_ADDRESS = @@ -265,7 +270,6 @@ public void testGetTransactionByHash() { @Test public void testGetBlockByNumber2() { - fullNodeJsonRpcHttpService.init(Args.getInstance()); fullNodeJsonRpcHttpService.start(); JsonArray params = new JsonArray(); params.add(ByteArray.toJsonHex(blockCapsule.getNum())); @@ -277,7 +281,8 @@ public void testGetBlockByNumber2() { requestBody.addProperty("id", 1); CloseableHttpResponse response; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { - HttpPost httpPost = new HttpPost("http://127.0.0.1:8545/jsonrpc"); + HttpPost httpPost = new HttpPost("http://127.0.0.1:" + + CommonParameter.getInstance().getJsonRpcHttpFullNodePort() + "/jsonrpc"); httpPost.addHeader("Content-Type", "application/json"); httpPost.setEntity(new StringEntity(requestBody.toString())); response = httpClient.execute(httpPost); @@ -303,9 +308,7 @@ public void testGetBlockByNumber2() { @Test public void testServicesInit() { try { - jsonRpcServiceOnPBFT.init(Args.getInstance()); jsonRpcServiceOnPBFT.start(); - jsonRpcServiceOnSolidity.init(Args.getInstance()); jsonRpcServiceOnSolidity.start(); } finally { jsonRpcServiceOnPBFT.stop(); diff --git a/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java b/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java index 51a46b09388..e36029c6141 100644 --- a/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java +++ b/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java @@ -44,7 +44,7 @@ public void init() throws IOException { "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory }, - "config.conf" + Constant.TEST_CONF ); CommonParameter parameter = Args.getInstance(); parameter.setNodeListenPort(port); @@ -52,9 +52,7 @@ public void init() throws IOException { parameter.setNodeExternalIp("127.0.0.1"); context = new TronApplicationContext(DefaultConfig.class); appT = ApplicationFactory.create(context); - rpcApiService = context.getBean(RpcApiService.class); metricsApiService = context.getBean(MetricsApiService.class); - appT.addService(rpcApiService); appT.startup(); } diff --git a/framework/src/test/java/org/tron/core/net/BaseNet.java b/framework/src/test/java/org/tron/core/net/BaseNet.java index 7ae8b355168..65771bae952 100644 --- a/framework/src/test/java/org/tron/core/net/BaseNet.java +++ b/framework/src/test/java/org/tron/core/net/BaseNet.java @@ -30,12 +30,12 @@ import org.tron.common.application.TronApplicationContext; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.common.utils.ReflectUtils; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.net.peer.PeerConnection; -import org.tron.core.services.RpcApiService; @Slf4j public class BaseNet { @@ -48,7 +48,6 @@ public class BaseNet { protected static TronApplicationContext context; - private static RpcApiService rpcApiService; private static Application appT; private static TronNetDelegate tronNetDelegate; @@ -98,10 +97,15 @@ public static void init() throws Exception { parameter.setNodeListenPort(port); parameter.getSeedNode().getAddressList().clear(); parameter.setNodeExternalIp(Constant.LOCAL_HOST); + parameter.setRpcEnable(true); + parameter.setRpcPort(PublicMethod.chooseRandomPort()); + parameter.setRpcSolidityEnable(false); + parameter.setRpcPBFTEnable(false); + parameter.setFullNodeHttpEnable(false); + parameter.setSolidityNodeHttpEnable(false); + parameter.setPBFTHttpEnable(false); context = new TronApplicationContext(DefaultConfig.class); appT = ApplicationFactory.create(context); - rpcApiService = context.getBean(RpcApiService.class); - appT.addService(rpcApiService); appT.startup(); try { Thread.sleep(2000); diff --git a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java index 9bc942d6684..a7fb2644495 100755 --- a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java +++ b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java @@ -17,6 +17,8 @@ import org.junit.Test; import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.PublicMethod; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.Utils; import org.tron.core.ChainBaseManager; @@ -36,6 +38,8 @@ public class PbftApiTest extends BaseTest { @BeforeClass public static void init() { Args.setParam(new String[]{"-d", dbPath(), "-w"}, Constant.TEST_CONF); + CommonParameter.getInstance().setPBFTHttpEnable(true); + CommonParameter.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); } @Test @@ -58,11 +62,11 @@ public void pbftapi() throws IOException { Assert.assertTrue(dynamicPropertiesStore.getLatestBlockHeaderNumber() >= 10); commonDataBase.saveLatestPbftBlockNum(6); - httpApiOnPBFTService.init(Args.getInstance()); httpApiOnPBFTService.start(); CloseableHttpResponse response; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { - HttpGet httpGet = new HttpGet("http://127.0.0.1:8092/walletpbft/getnowblock"); + HttpGet httpGet = new HttpGet("http://127.0.0.1:" + + CommonParameter.getInstance().getPBFTHttpPort() + "/walletpbft/getnowblock"); response = httpClient.execute(httpGet); String responseString = EntityUtils.toString(response.getEntity()); JSONObject jsonObject = JSON.parseObject(responseString); diff --git a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java index 83930403312..7179215393f 100644 --- a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java +++ b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java @@ -135,8 +135,11 @@ public static void init() throws IOException { Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); String OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; + getInstance().setRpcEnable(true); getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + getInstance().setRpcSolidityEnable(true); getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); + getInstance().setRpcPBFTEnable(true); getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); getInstance().setMetricsPrometheusPort(PublicMethod.chooseRandomPort()); getInstance().setMetricsPrometheusEnable(true); @@ -164,11 +167,6 @@ public static void init() throws IOException { blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelSolidity); blockingStubPBFT = WalletSolidityGrpc.newBlockingStub(channelPBFT); - RpcApiService rpcApiService = context.getBean(RpcApiService.class); - RpcApiServiceOnSolidity rpcApiServiceOnSolidity = - context.getBean(RpcApiServiceOnSolidity.class); - RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context.getBean(RpcApiServiceOnPBFT.class); - Manager manager = context.getBean(Manager.class); ownerAddress = ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)); @@ -178,9 +176,6 @@ public static void init() throws IOException { manager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1); manager.getDynamicPropertiesStore().saveAllowShieldedTRC20Transaction(1); Application appTest = ApplicationFactory.create(context); - appTest.addService(rpcApiService); - appTest.addService(rpcApiServiceOnSolidity); - appTest.addService(rpcApiServiceOnPBFT); appTest.startup(); } diff --git a/framework/src/test/java/org/tron/core/services/WalletApiTest.java b/framework/src/test/java/org/tron/core/services/WalletApiTest.java index 0a87c348fdb..8890d4bfd9e 100644 --- a/framework/src/test/java/org/tron/core/services/WalletApiTest.java +++ b/framework/src/test/java/org/tron/core/services/WalletApiTest.java @@ -5,8 +5,8 @@ import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; +import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.tron.api.GrpcAPI.EmptyMessage; @@ -14,7 +14,7 @@ import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.client.Configuration; +import org.tron.common.utils.PublicMethod; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @@ -23,34 +23,34 @@ @Slf4j public class WalletApiTest { - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); + @ClassRule + public static TemporaryFolder temporaryFolder = new TemporaryFolder(); private static TronApplicationContext context; - private String fullnode = Configuration.getByPath("testng.conf") - .getStringList("fullnode.ip.list").get(0); - private RpcApiService rpcApiService; - private Application appT; + private static Application appT; - @Before - public void init() throws IOException { + + @BeforeClass + public static void init() throws IOException { Args.setParam(new String[]{ "-d", temporaryFolder.newFolder().toString(), "--p2p-disable", "true"}, Constant.TEST_CONF); + Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcEnable(true); context = new TronApplicationContext(DefaultConfig.class); appT = ApplicationFactory.create(context); - rpcApiService = context.getBean(RpcApiService.class); - appT.addService(rpcApiService); appT.startup(); } @Test public void listNodesTest() { + String fullNode = String.format("%s:%d", "127.0.0.1", + Args.getInstance().getRpcPort()); WalletGrpc.WalletBlockingStub walletStub = WalletGrpc - .newBlockingStub(ManagedChannelBuilder.forTarget(fullnode) + .newBlockingStub(ManagedChannelBuilder.forTarget(fullNode) .usePlaintext() .build()); Assert.assertTrue(walletStub.listNodes(EmptyMessage.getDefaultInstance()) - .getNodesList().size() == 0); + .getNodesList().isEmpty()); } @After diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java index 5f883fc8c07..9484155a0b7 100644 --- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -14,10 +14,10 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.PublicMethod; import org.tron.core.Constant; import org.tron.core.config.args.Args; import org.tron.core.services.http.FullNodeHttpApiService; @@ -39,21 +39,17 @@ public class HttpApiAccessFilterTest extends BaseTest { static { Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); - } - - /** - * init dependencies. - */ - @Before - public void init() { - appT.addService(httpApiService); - appT.addService(httpApiOnSolidityService); - appT.addService(httpApiOnPBFTService); - appT.startup(); + Args.getInstance().setFullNodeHttpEnable(true); + Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setPBFTHttpEnable(true); + Args.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setSolidityNodeHttpEnable(true); + Args.getInstance().setSolidityHttpPort(PublicMethod.chooseRandomPort()); } @Test public void testHttpFilter() { + appT.startup(); List disabledApiList = new ArrayList<>(); disabledApiList.add("getaccount"); disabledApiList.add("getnowblock"); diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java index 081b5839f84..c5c7185b6d8 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java @@ -55,8 +55,11 @@ public class LiteFnQueryGrpcInterceptorTest { @BeforeClass public static void init() throws IOException { Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); + Args.getInstance().setRpcEnable(true); Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcSolidityEnable(true); Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcPBFTEnable(true); Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); String fullnode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), Args.getInstance().getRpcPort()); @@ -78,14 +81,8 @@ public static void init() throws IOException { blockingStubFull = WalletGrpc.newBlockingStub(channelFull); blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelSolidity); blockingStubpBFT = WalletSolidityGrpc.newBlockingStub(channelpBFT); - RpcApiService rpcApiService = context.getBean(RpcApiService.class); - RpcApiServiceOnSolidity rpcOnSolidity = context.getBean(RpcApiServiceOnSolidity.class); - RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context.getBean(RpcApiServiceOnPBFT.class); chainBaseManager = context.getBean(ChainBaseManager.class); Application appTest = ApplicationFactory.create(context); - appTest.addService(rpcApiService); - appTest.addService(rpcOnSolidity); - appTest.addService(rpcApiServiceOnPBFT); appTest.startup(); } diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index 5fd4711273e..a9068c228b6 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.Set; -import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; @@ -19,28 +18,32 @@ import org.junit.Before; import org.junit.Test; import org.tron.common.BaseTest; +import org.tron.common.utils.PublicMethod; import org.tron.core.Constant; import org.tron.core.config.args.Args; -import org.tron.core.services.http.FullNodeHttpApiService; -import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; -import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; @Slf4j public class LiteFnQueryHttpFilterTest extends BaseTest { private final String ip = "127.0.0.1"; private int fullHttpPort; - @Resource - private FullNodeHttpApiService httpApiService; - @Resource - private HttpApiOnSolidityService httpApiOnSolidityService; - @Resource - private HttpApiOnPBFTService httpApiOnPBFTService; private final CloseableHttpClient httpClient = HttpClients.createDefault(); static { Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + Args.getInstance().setRpcEnable(false); + Args.getInstance().setRpcSolidityEnable(false); + Args.getInstance().setRpcPBFTEnable(false); + Args.getInstance().setFullNodeHttpEnable(true); + Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setPBFTHttpEnable(true); + Args.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setSolidityNodeHttpEnable(true); + Args.getInstance().setSolidityHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setJsonRpcHttpFullNodeEnable(false); + Args.getInstance().setJsonRpcHttpSolidityNodeEnable(false); + Args.getInstance().setJsonRpcHttpPBFTNodeEnable(false); } /** @@ -48,9 +51,6 @@ public class LiteFnQueryHttpFilterTest extends BaseTest { */ @Before public void init() { - appT.addService(httpApiService); - appT.addService(httpApiOnSolidityService); - appT.addService(httpApiOnPBFTService); appT.startup(); } diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java index 38af756f790..5845a89c2e4 100644 --- a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -56,8 +56,11 @@ public class RpcApiAccessInterceptorTest { @BeforeClass public static void init() throws IOException { Args.setParam(new String[] {"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); + Args.getInstance().setRpcEnable(true); Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcSolidityEnable(true); Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcPBFTEnable(true); Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); String fullNode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), Args.getInstance().getRpcPort()); @@ -82,15 +85,7 @@ public static void init() throws IOException { blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelSolidity); blockingStubPBFT = WalletSolidityGrpc.newBlockingStub(channelPBFT); - RpcApiService rpcApiService = context.getBean(RpcApiService.class); - RpcApiServiceOnSolidity rpcApiServiceOnSolidity = - context.getBean(RpcApiServiceOnSolidity.class); - RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context.getBean(RpcApiServiceOnPBFT.class); - Application appTest = ApplicationFactory.create(context); - appTest.addService(rpcApiService); - appTest.addService(rpcApiServiceOnSolidity); - appTest.addService(rpcApiServiceOnPBFT); appTest.startup(); } diff --git a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java index 37956e71762..d6bf3850f30 100644 --- a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java @@ -27,6 +27,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.core.services.http.solidity.mockito.HttpUrlStreamHandler; @Slf4j @@ -100,7 +101,8 @@ public void doPostTest() throws IOException { final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:8090/wallet/broadcasttransaction"; + String href = "http://127.0.0.1:" + + PublicMethod.chooseRandomPort() + "/wallet/broadcasttransaction"; httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); httpUrlConnection.setRequestMethod("POST"); httpUrlConnection.setRequestProperty("Content-Type", "application/json"); diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index f363b7fbefc..e9cd9cb1f26 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -1,7 +1,6 @@ package org.tron.core.services.http; import com.google.gson.JsonObject; -import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.bouncycastle.util.encoders.Hex; @@ -9,10 +8,9 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.client.Configuration; +import org.tron.common.utils.PublicMethod; import org.tron.common.utils.client.utils.HttpMethed; import org.tron.core.Constant; import org.tron.core.capsule.ContractCapsule; @@ -25,31 +23,24 @@ @Slf4j public class TriggerSmartContractServletTest extends BaseTest { - private static final String httpNode = Configuration.getByPath("testng.conf") - .getStringList("httpnode.ip.list") - .get(0); + private static String httpNode; private static final byte[] ownerAddr = Hex.decode("410000000000000000000000000000000000000000"); private static final byte[] contractAddr = Hex.decode( "41000000000000000000000000000000000000dEaD"); - @Resource - private FullNodeHttpApiService httpApiService; - @BeforeClass public static void init() throws Exception { Args.setParam( new String[]{"--output-directory", dbPath(), "--debug", "--witness"}, Constant.TEST_CONF); Args.getInstance().needSyncCheck = false; - - // build app context - DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); - beanFactory.setAllowCircularReferences(false); + Args.getInstance().setFullNodeHttpEnable(true); + Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); + httpNode = String.format("%s:%d", "127.0.0.1", + Args.getInstance().getFullNodeHttpPort()); } @Before public void before() { - appT.addService(httpApiService); - // start services appT.startup(); diff --git a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java index 70c74e3a2a7..e1abb41d1e1 100644 --- a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java @@ -27,6 +27,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.core.services.http.solidity.mockito.HttpUrlStreamHandler; @@ -91,7 +92,8 @@ public void doPostTest() throws IOException { final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:8091/walletsolidity/gettransactioninfobyid"; + String href = "http://127.0.0.1:" + + PublicMethod.chooseRandomPort() + "/walletsolidity/gettransactioninfobyid"; httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); httpUrlConnection.setRequestMethod("POST"); httpUrlConnection.setRequestProperty("Content-Type", "application/json"); @@ -146,7 +148,8 @@ public void doGetTest() throws IOException { final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); System.setOut(new PrintStream(outContent)); - String href = "http://127.0.0.1:8091/walletsolidity/gettransactioninfobyid"; + String href = "http://127.0.0.1:" + + PublicMethod.chooseRandomPort() + "/walletsolidity/gettransactioninfobyid"; httpUrlStreamHandler.addConnection(new URL(href), httpUrlConnection); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setRequestProperty("Content-Type", "application/json"); diff --git a/framework/src/test/java/org/tron/program/SolidityNodeTest.java b/framework/src/test/java/org/tron/program/SolidityNodeTest.java index a77fa2fa8c6..a95d07c0c11 100755 --- a/framework/src/test/java/org/tron/program/SolidityNodeTest.java +++ b/framework/src/test/java/org/tron/program/SolidityNodeTest.java @@ -1,12 +1,8 @@ package org.tron.program; -import java.io.File; -import java.io.IOException; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.BaseTest; import org.tron.common.client.DatabaseGrpcClient; @@ -26,41 +22,10 @@ public class SolidityNodeTest extends BaseTest { SolidityNodeHttpApiService solidityNodeHttpApiService; static { - try { - Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); - } catch (IOException e) { - Assert.fail("create temp directory failed."); - } + Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); Args.getInstance().setSolidityNode(true); } - /** - * init db. - */ - @BeforeClass - public static void init() { - } - - /** - * remo db when after test. - */ - @AfterClass - public static void removeDb() { - Args.clearParam(); - } - - private static Boolean deleteFolder(File index) { - if (!index.isDirectory() || index.listFiles().length <= 0) { - return index.delete(); - } - for (File file : index.listFiles()) { - if (null != file && !deleteFolder(file)) { - return false; - } - } - return index.delete(); - } - @Test public void testSolidityArgs() { Assert.assertNotNull(Args.getInstance().getTrustNodeAddr()); @@ -69,7 +34,6 @@ public void testSolidityArgs() { @Test public void testSolidityGrpcCall() { - rpcApiService.init(Args.getInstance()); rpcApiService.start(); DatabaseGrpcClient databaseGrpcClient = null; String address = Args.getInstance().getTrustNodeAddr(); @@ -99,7 +63,8 @@ public void testSolidityGrpcCall() { @Test public void testSolidityNodeHttpApiService() { - solidityNodeHttpApiService.init(Args.getInstance()); + solidityNodeHttpApiService.start(); + // start again solidityNodeHttpApiService.start(); solidityNodeHttpApiService.stop(); Assert.assertTrue(true); diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index 1d7ae09af7c..44c051e1079 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -117,14 +117,30 @@ node { ] http { + fullNodeEnable = false fullNodePort = 8090 + solidityEnable = false solidityPort = 8091 + PBFTEnable = false + PBFTPort = 8092 + } + + jsonrpc { + httpFullNodeEnable = false + httpFullNodePort = 8545 + httpSolidityEnable = false + httpSolidityPort = 8555 + httpPBFTEnable = false + httpPBFTPort = 8565 } rpc { + enable = false port = 50051 - # default value is 50061 - # solidityPort = 50061 + solidityEnable = false + solidityPort = 50061 + PBFTEnable = false + PBFTPort = 50071 # Number of gRPC thread, default availableProcessors / 2 # thread = 16 diff --git a/framework/src/test/resources/config-test-index.conf b/framework/src/test/resources/config-test-index.conf index 6eb3621e747..cff08fd3abb 100644 --- a/framework/src/test/resources/config-test-index.conf +++ b/framework/src/test/resources/config-test-index.conf @@ -76,9 +76,23 @@ node { version = 43 # 43: testnet; 101: debug } + http { + fullNodeEnable = false + solidityEnable = false + PBFTEnable = false + } + + jsonrpc { + httpFullNodeEnable = false + httpSolidityEnable = false + httpPBFTEnable = false + } + rpc { port = 50051 - + enable = false + solidityEnable = false + PBFTEnable = false # Number of gRPC thread, default availableProcessors / 2 # thread = 16 diff --git a/framework/src/test/resources/config-test-mainnet.conf b/framework/src/test/resources/config-test-mainnet.conf index ad72d2afaaa..de9170a0ec4 100644 --- a/framework/src/test/resources/config-test-mainnet.conf +++ b/framework/src/test/resources/config-test-mainnet.conf @@ -82,6 +82,24 @@ node { version = 43 # 43: testnet; 101: debug } + http { + fullNodeEnable = false + solidityEnable = false + PBFTEnable = false + } + + jsonrpc { + httpFullNodeEnable = false + httpSolidityEnable = false + httpPBFTEnable = false + } + + rpc { + enable = false + solidityEnable = false + PBFTEnable = false + } + } sync { diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 62337f02fc5..997f3e98b37 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -107,10 +107,15 @@ node { } http { - fullNodeEnable = true - fullNodePort = 8090 - solidityEnable = true - solidityPort = 8091 + fullNodeEnable = false + solidityEnable = false + PBFTEnable = false + } + + jsonrpc { + httpFullNodeEnable = false + httpSolidityEnable = false + httpPBFTEnable = false } # use your ipv6 address for node discovery and tcp connection, default false @@ -172,6 +177,9 @@ node { } rpc { + enable = false + solidityEnable = false + PBFTEnable = false port = 50051 PBFTPort = 50072 diff --git a/plugins/src/test/java/org/tron/plugins/DbLiteTest.java b/plugins/src/test/java/org/tron/plugins/DbLiteTest.java index 5cb8c26c4bc..7e7e3c38f33 100644 --- a/plugins/src/test/java/org/tron/plugins/DbLiteTest.java +++ b/plugins/src/test/java/org/tron/plugins/DbLiteTest.java @@ -22,8 +22,6 @@ import org.tron.common.utils.Utils; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.services.RpcApiService; -import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; import picocli.CommandLine; @Slf4j @@ -47,8 +45,6 @@ public class DbLiteTest { public void startApp() { context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); - appTest.addService(context.getBean(RpcApiService.class)); - appTest.addService(context.getBean(RpcApiServiceOnSolidity.class)); appTest.startup(); String fullNode = String.format("%s:%d", "127.0.0.1", @@ -76,6 +72,7 @@ public void init() throws IOException { // allow account root Args.getInstance().setAllowAccountStateRoot(1); Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcEnable(true); databaseDir = Args.getInstance().getStorage().getDbDirectory(); // init dbBackupConfig to avoid NPE Args.getInstance().dbBackupConfig = DbBackupConfig.getInstance(); From a86d0ed919df5079a16387253c3dc51bce337491 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Fri, 3 Jan 2025 16:54:02 +0800 Subject: [PATCH 033/107] feat(*): reactor system.exit --- .../leveldb/LevelDbDataSourceImpl.java | 3 +- .../rocksdb/RocksDbDataSourceImpl.java | 3 +- .../tron/core/db2/core/SnapshotManager.java | 35 ++++-------- .../tron/core/service/RewardViCalService.java | 3 +- .../org/tron/common/exit/ExitManager.java | 53 +++++++++++++++++++ framework/build.gradle | 1 - .../org/tron/core/config/DefaultConfig.java | 1 - .../java/org/tron/core/config/args/Args.java | 4 +- .../main/java/org/tron/core/db/Manager.java | 16 +++--- .../main/java/org/tron/program/FullNode.java | 2 + .../java/org/tron/program/SolidityNode.java | 5 +- .../leveldb/LevelDbDataSourceImplTest.java | 7 +-- .../leveldb/RocksDbDataSourceImplTest.java | 7 +-- .../java/org/tron/core/db/ManagerTest.java | 8 +-- .../tron/core/db2/SnapshotManagerTest.java | 30 ++++++++++- .../tron/core/services/ComputeRewardTest.java | 7 +-- 16 files changed, 128 insertions(+), 57 deletions(-) create mode 100644 common/src/main/java/org/tron/common/exit/ExitManager.java diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index 43a24ff4416..506ecdcb6c7 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -59,6 +59,7 @@ import org.tron.core.db.common.iterator.StoreIterator; import org.tron.core.db2.common.Instance; import org.tron.core.db2.common.WrappedByteArray; +import org.tron.core.exception.TronError; @Slf4j(topic = "DB") @NoArgsConstructor @@ -157,7 +158,7 @@ private void openDatabase(Options dbOptions) throws IOException { } else { logger.error("Open Database {} failed", dataBaseName, e); } - System.exit(1); + throw new TronError(e, TronError.ErrCode.LEVELDB_INIT); } } diff --git a/chainbase/src/main/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImpl.java index 6c5d8018487..5c051bdc101 100644 --- a/chainbase/src/main/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImpl.java @@ -45,6 +45,7 @@ import org.tron.core.db.common.iterator.RockStoreIterator; import org.tron.core.db2.common.Instance; import org.tron.core.db2.common.WrappedByteArray; +import org.tron.core.exception.TronError; @Slf4j(topic = "DB") @@ -272,7 +273,7 @@ protected void log(InfoLogLevel infoLogLevel, String logMsg) { } else { logger.error("Open Database {} failed", dataBaseName, e); } - System.exit(1); + throw new TronError(e, TronError.ErrCode.ROCKSDB_INIT); } alive = true; diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index f0f169ae340..eb27141a82c 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -20,7 +20,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.LockSupport; import java.util.stream.Collectors; import javax.annotation.PostConstruct; import lombok.Getter; @@ -42,6 +41,7 @@ import org.tron.core.db2.common.Value; import org.tron.core.db2.common.WrappedByteArray; import org.tron.core.exception.RevokingStoreIllegalStateException; +import org.tron.core.exception.TronError; import org.tron.core.store.CheckPointV2Store; import org.tron.core.store.CheckTmpStore; @@ -68,7 +68,6 @@ public class SnapshotManager implements RevokingDatabase { private volatile int flushCount = 0; - private Thread exitThread; private volatile boolean hitDown; private Map flushServices = new HashMap<>(); @@ -105,15 +104,6 @@ public void init() { } }, 10000, 3600, TimeUnit.MILLISECONDS); } - exitThread = new Thread(() -> { - LockSupport.park(); - // to Guarantee Some other thread invokes unpark with the current thread as the target - if (hitDown) { - System.exit(1); - } - }); - exitThread.setName("exit-thread"); - exitThread.start(); } public static String simpleDecode(byte[] bytes) { @@ -281,13 +271,6 @@ public void shutdown() { ExecutorServiceManager.shutdownAndAwaitTermination(pruneCheckpointThread, pruneName); flushServices.forEach((key, value) -> ExecutorServiceManager.shutdownAndAwaitTermination(value, "flush-service-" + key)); - try { - exitThread.interrupt(); - // help GC - exitThread = null; - } catch (Exception e) { - logger.warn("exitThread interrupt error", e); - } } public void updateSolidity(int hops) { @@ -298,7 +281,7 @@ public void updateSolidity(int hops) { } } - private boolean shouldBeRefreshed() { + public boolean shouldBeRefreshed() { return flushCount >= maxFlushCount; } @@ -367,12 +350,12 @@ public void flush() { } catch (TronDBException e) { logger.error(" Find fatal error, program will be exited soon.", e); hitDown = true; - LockSupport.unpark(exitThread); + throw new TronError(e, TronError.ErrCode.DB_FLUSH); } } } - private void createCheckpoint() { + public void createCheckpoint() { TronDatabase checkPointStore = null; boolean syncFlag; try { @@ -430,7 +413,7 @@ private TronDatabase getCheckpointDB(String dbName) { return new CheckPointV2Store(CHECKPOINT_V2_DIR+"/"+dbName); } - private List getCheckpointList() { + public List getCheckpointList() { String dbPath = Paths.get(StorageUtils.getOutputDirectoryByDbName(CHECKPOINT_V2_DIR), CommonParameter.getInstance().getStorage().getDbDirectory()).toString(); File file = new File(Paths.get(dbPath, CHECKPOINT_V2_DIR).toString()); @@ -490,10 +473,10 @@ public void check() { if (!isV2Open()) { List cpList = getCheckpointList(); if (cpList != null && cpList.size() != 0) { - logger.error("checkpoint check failed, the checkpoint version of database not match your " + - "config file, please set storage.checkpoint.version = 2 in your config file " + - "and restart the node."); - System.exit(-1); + String msg = "checkpoint check failed, the checkpoint version of database not match your " + + "config file, please set storage.checkpoint.version = 2 in your config file " + + "and restart the node."; + throw new TronError(msg, TronError.ErrCode.CHECKPOINT_VERSION); } checkV1(); } else { diff --git a/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java b/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java index e27990f0403..b3ef76b091e 100644 --- a/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java +++ b/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java @@ -30,6 +30,7 @@ import org.tron.common.utils.Sha256Hash; import org.tron.core.db.common.iterator.DBIterator; import org.tron.core.db2.common.DB; +import org.tron.core.exception.TronError; import org.tron.core.store.DelegationStore; import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.store.RewardViStore; @@ -121,7 +122,7 @@ private void maybeRun() { } } catch (Exception e) { logger.error(" Find fatal error, program will be exited soon.", e); - System.exit(1); + throw new TronError(e, TronError.ErrCode.REWARD_VI_CALCULATOR); } } diff --git a/common/src/main/java/org/tron/common/exit/ExitManager.java b/common/src/main/java/org/tron/common/exit/ExitManager.java new file mode 100644 index 00000000000..ff3e0de734b --- /dev/null +++ b/common/src/main/java/org/tron/common/exit/ExitManager.java @@ -0,0 +1,53 @@ +package org.tron.common.exit; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.tron.core.exception.TronError; + +@Slf4j(topic = "Exit") +public class ExitManager { + + private static final ThreadFactory exitThreadFactory = r -> { + Thread thread = new Thread(r, "System-Exit-Thread"); + thread.setDaemon(true); + return thread; + }; + + private ExitManager() { + + } + + public static void initExceptionHandler() { + Thread.setDefaultUncaughtExceptionHandler((t, e) -> { + findTronError(e).ifPresent(ExitManager::logAndExit); + logger.error("Uncaught exception", e); + }); + } + + public static Optional findTronError(Throwable e) { + if (e == null) { + return Optional.empty(); + } + + Set seen = new HashSet<>(); + + while (e != null && !seen.contains(e)) { + if (e instanceof TronError) { + return Optional.of((TronError) e); + } + seen.add(e); + e = e.getCause(); + } + return Optional.empty(); + } + + private static void logAndExit(TronError exit) { + final int code = exit.getErrCode().getCode(); + logger.error("Shutting down with code: {}.", exit.getErrCode(), exit); + Thread exitThread = exitThreadFactory.newThread(() -> System.exit(code)); + exitThread.start(); + } +} \ No newline at end of file diff --git a/framework/build.gradle b/framework/build.gradle index 10477fb71b3..83b6df6d95e 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -39,7 +39,6 @@ dependencies { implementation fileTree(dir: 'libs', include: '*.jar') // end local libraries testImplementation group: 'org.hamcrest', name: 'hamcrest-junit', version: '1.0.0.1' - testImplementation group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.16.0' implementation group: 'com.google.inject', name: 'guice', version: '4.1.0' implementation group: 'io.dropwizard.metrics', name: 'metrics-core', version: '3.1.2' diff --git a/framework/src/main/java/org/tron/core/config/DefaultConfig.java b/framework/src/main/java/org/tron/core/config/DefaultConfig.java index 7cc32d9a581..d01820626c3 100755 --- a/framework/src/main/java/org/tron/core/config/DefaultConfig.java +++ b/framework/src/main/java/org/tron/core/config/DefaultConfig.java @@ -37,7 +37,6 @@ public class DefaultConfig { public CommonConfig commonConfig; public DefaultConfig() { - Thread.setDefaultUncaughtExceptionHandler((t, e) -> logger.error("Uncaught exception", e)); } @Bean(destroyMethod = "") diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 2ac3e69eced..852d271497d 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -66,6 +66,7 @@ import org.tron.core.config.Parameter.NetConstants; import org.tron.core.config.Parameter.NodeConstant; import org.tron.core.exception.CipherException; +import org.tron.core.exception.TronError; import org.tron.core.store.AccountStore; import org.tron.keystore.Credentials; import org.tron.keystore.WalletUtils; @@ -433,9 +434,8 @@ public static void setParam(final Config config) { String prikey = ByteArray.toHexString(sign.getPrivateKey()); privateKeys.add(prikey); } catch (IOException | CipherException e) { - logger.error(e.getMessage()); logger.error("Witness node start failed!"); - exit(-1); + throw new TronError(e, TronError.ErrCode.WITNESS_KEYSTORE_LOAD); } } } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 908e248bdee..cfd12fffce2 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -123,6 +123,7 @@ import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; import org.tron.core.exception.TransactionExpirationException; +import org.tron.core.exception.TronError; import org.tron.core.exception.UnLinkedBlockException; import org.tron.core.exception.VMIllegalException; import org.tron.core.exception.ValidateScheduleException; @@ -498,13 +499,13 @@ public void init() { logger.error( "Please delete database directory({}) and restart", Args.getInstance().getOutputDirectory()); - System.exit(1); + throw new TronError(e, TronError.ErrCode.KHAOS_DB_INIT); } catch (BadItemException e) { logger.error("DB data broken {}.", e.getMessage()); logger.error( "Please delete database directory({}) and restart.", Args.getInstance().getOutputDirectory()); - System.exit(1); + throw new TronError(e, TronError.ErrCode.KHAOS_DB_INIT); } getChainBaseManager().getForkController().init(this.chainBaseManager); @@ -569,7 +570,7 @@ public void init() { initAutoStop(); } catch (IllegalArgumentException e) { logger.error("Auto-stop params error: {}", e.getMessage()); - System.exit(1); + throw new TronError(e, TronError.ErrCode.AUTO_STOP_PARAMS); } maxFlushCount = CommonParameter.getInstance().getStorage().getMaxFlushCount(); @@ -586,10 +587,9 @@ public void initGenesis() { Args.getInstance().setChainId(genesisBlock.getBlockId().toString()); } else { if (chainBaseManager.hasBlocks()) { - logger.error( - "Genesis block modify, please delete database directory({}) and restart.", - Args.getInstance().getOutputDirectory()); - System.exit(1); + String msg = String.format("Genesis block modify, please delete database directory(%s) and " + + "restart.", Args.getInstance().getOutputDirectory()); + throw new TronError(msg, TronError.ErrCode.GENESIS_BLOCK_INIT); } else { logger.info("Create genesis block."); Args.getInstance().setChainId(genesisBlock.getBlockId().toString()); @@ -1370,7 +1370,7 @@ void blockTrigger(final BlockCapsule block, long oldSolid, long newSolid) { } catch (Exception e) { logger.error("Block trigger failed. head: {}, oldSolid: {}, newSolid: {}", block.getNum(), oldSolid, newSolid, e); - System.exit(1); + throw new TronError(e, TronError.ErrCode.EVENT_SUBSCRIBE_ERROR); } } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index b7adf0ffe1a..7fc72e6ba88 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -10,6 +10,7 @@ import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; +import org.tron.common.exit.ExitManager; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.Metrics; import org.tron.core.Constant; @@ -40,6 +41,7 @@ public static void load(String path) { * Start the FullNode. */ public static void main(String[] args) { + ExitManager.initExceptionHandler(); logger.info("Full node running."); Args.setParam(args, Constant.TESTNET_CONF); CommonParameter parameter = Args.getInstance(); diff --git a/framework/src/main/java/org/tron/program/SolidityNode.java b/framework/src/main/java/org/tron/program/SolidityNode.java index 8def8ed7ebc..b774ab03aaa 100644 --- a/framework/src/main/java/org/tron/program/SolidityNode.java +++ b/framework/src/main/java/org/tron/program/SolidityNode.java @@ -12,6 +12,7 @@ import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.client.DatabaseGrpcClient; +import org.tron.common.exit.ExitManager; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.Metrics; import org.tron.core.ChainBaseManager; @@ -20,6 +21,7 @@ import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.Manager; +import org.tron.core.exception.TronError; import org.tron.protos.Protocol.Block; @Slf4j(topic = "app") @@ -54,6 +56,7 @@ public SolidityNode(Manager dbManager) { * Start the SolidityNode. */ public static void main(String[] args) { + ExitManager.initExceptionHandler(); logger.info("Solidity node is running."); Args.setParam(args, Constant.TESTNET_CONF); CommonParameter parameter = CommonParameter.getInstance(); @@ -98,7 +101,7 @@ private void start() { } catch (Exception e) { logger.error("Failed to start solid node, address: {}.", CommonParameter.getInstance().getTrustNodeAddr()); - System.exit(0); + throw new TronError(e, TronError.ErrCode.SOLID_NODE_INIT); } } diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java index 50a55d24a0f..03bf7b21956 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java @@ -43,7 +43,7 @@ import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; -import org.junit.contrib.java.lang.system.ExpectedSystemExit; +import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.utils.ByteArray; import org.tron.common.utils.FileUtil; @@ -51,6 +51,7 @@ import org.tron.core.Constant; import org.tron.core.config.args.Args; import org.tron.core.db2.common.WrappedByteArray; +import org.tron.core.exception.TronError; @Slf4j public class LevelDbDataSourceImplTest { @@ -74,7 +75,7 @@ public class LevelDbDataSourceImplTest { private byte[] key6 = "00000006aa".getBytes(); @Rule - public final ExpectedSystemExit exit = ExpectedSystemExit.none(); + public final ExpectedException exception = ExpectedException.none(); /** * Release resources. @@ -350,7 +351,7 @@ public void prefixQueryTest() { @Test public void initDbTest() { - exit.expectSystemExitWithStatus(1); + exception.expect(TronError.class); makeExceptionDb("test_initDb"); LevelDbDataSourceImpl dataSource = new LevelDbDataSourceImpl( Args.getInstance().getOutputDirectory(), "test_initDb"); diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java index ed37c1e4bcd..b7846ac2d70 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java @@ -25,7 +25,7 @@ import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; -import org.junit.contrib.java.lang.system.ExpectedSystemExit; +import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.storage.rocksdb.RocksDbDataSourceImpl; import org.tron.common.utils.ByteArray; @@ -34,6 +34,7 @@ import org.tron.common.utils.PublicMethod; import org.tron.core.config.args.Args; import org.tron.core.db2.common.WrappedByteArray; +import org.tron.core.exception.TronError; @Slf4j public class RocksDbDataSourceImplTest { @@ -56,7 +57,7 @@ public class RocksDbDataSourceImplTest { private byte[] key6 = "00000006aa".getBytes(); @Rule - public final ExpectedSystemExit exit = ExpectedSystemExit.none(); + public final ExpectedException exception = ExpectedException.none(); /** * Release resources. @@ -392,7 +393,7 @@ public void prefixQueryTest() { @Test public void initDbTest() { - exit.expectSystemExitWithStatus(1); + exception.expect(TronError.class); makeExceptionDb("test_initDb"); RocksDbDataSourceImpl dataSource = new RocksDbDataSourceImpl( Args.getInstance().getOutputDirectory(), "test_initDb"); diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 70aba258594..e9b79487204 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -30,7 +30,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.contrib.java.lang.system.ExpectedSystemExit; +import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.application.TronApplicationContext; import org.tron.common.crypto.ECKey; @@ -76,6 +76,7 @@ import org.tron.core.exception.TooBigTransactionException; import org.tron.core.exception.TooBigTransactionResultException; import org.tron.core.exception.TransactionExpirationException; +import org.tron.core.exception.TronError; import org.tron.core.exception.UnLinkedBlockException; import org.tron.core.exception.VMIllegalException; import org.tron.core.exception.ValidateScheduleException; @@ -92,7 +93,6 @@ import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.Protocol.Transaction.raw; import org.tron.protos.contract.AccountContract; import org.tron.protos.contract.AssetIssueContractOuterClass; import org.tron.protos.contract.BalanceContract.TransferContract; @@ -112,7 +112,7 @@ public class ManagerTest extends BlockGenerate { @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Rule - public final ExpectedSystemExit exit = ExpectedSystemExit.none(); + public final ExpectedException exception = ExpectedException.none(); private static AtomicInteger port = new AtomicInteger(0); private static String accountAddress = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -1162,7 +1162,7 @@ public void testTooBigTransaction() { @Test public void blockTrigger() { - exit.expectSystemExitWithStatus(1); + exception.expect(TronError.class); Manager manager = spy(new Manager()); doThrow(new RuntimeException("postBlockTrigger mock")).when(manager).postBlockTrigger(any()); manager.blockTrigger(new BlockCapsule(Block.newBuilder().build()), 1, 1); diff --git a/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java b/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java index 966e947d828..87834246fba 100644 --- a/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java +++ b/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java @@ -1,11 +1,13 @@ package org.tron.core.db2; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + import com.google.common.collect.Maps; -import com.google.common.primitives.Bytes; import com.google.common.primitives.Longs; import com.google.protobuf.ByteString; import java.io.File; -import java.util.Iterator; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -13,7 +15,9 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -29,6 +33,7 @@ import org.tron.core.db2.core.SnapshotManager; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.TronError; @Slf4j public class SnapshotManagerTest { @@ -38,6 +43,9 @@ public class SnapshotManagerTest { private Application appT; private TestRevokingTronStore tronDatabase; + @Rule + public ExpectedException thrown = ExpectedException.none(); + @Before public void init() { Args.setParam(new String[]{"-d", "output_SnapshotManager_test"}, @@ -111,4 +119,22 @@ public synchronized void testClose() { tronDatabase.get(protoCapsule.getData())); } + + @Test + public void testCheckError() { + thrown.expect(TronError.class); + SnapshotManager manager = spy(new SnapshotManager("")); + when(manager.getCheckpointList()).thenReturn(Arrays.asList("check1", "check2")); + manager.check(); + } + + @Test + public void testFlushError() { + thrown.expect(TronError.class); + SnapshotManager manager = spy(new SnapshotManager("")); + manager.setUnChecked(false); + when(manager.getCheckpointList()).thenReturn(Arrays.asList("check1", "check2")); + when(manager.shouldBeRefreshed()).thenReturn(true); + manager.flush(); + } } diff --git a/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java b/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java index 0082c8728da..8ff6b62d7ef 100644 --- a/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java +++ b/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java @@ -17,7 +17,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.contrib.java.lang.system.ExpectedSystemExit; +import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.application.TronApplicationContext; import org.tron.common.error.TronDBException; @@ -30,6 +30,7 @@ import org.tron.core.capsule.WitnessCapsule; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; +import org.tron.core.exception.TronError; import org.tron.core.service.MortgageService; import org.tron.core.service.RewardViCalService; import org.tron.core.store.AccountStore; @@ -115,7 +116,7 @@ public class ComputeRewardTest { public final TemporaryFolder temporaryFolder = new TemporaryFolder(); @Rule - public final ExpectedSystemExit exit = ExpectedSystemExit.none(); + public final ExpectedException exception = ExpectedException.none(); @After public void destroy() { @@ -263,7 +264,7 @@ private void setUp() { @Test public void query() { - exit.expectSystemExitWithStatus(1); + exception.expect(TronError.class); Assert.assertEquals(3189, mortgageService.queryReward(OWNER_ADDRESS)); // mock root is error rewardViStore.put("test".getBytes(), "test".getBytes()); From b5a53afa2061218f264549d3ea327682cf997a33 Mon Sep 17 00:00:00 2001 From: Liulei Date: Wed, 26 Jun 2024 18:31:56 +0800 Subject: [PATCH 034/107] feat(tvm): cancun opcodes TLOAD, TSORE, MCOPY --- .../org/tron/core/utils/ProposalUtil.java | 16 +++++++ .../java/org/tron/core/vm/EnergyCost.java | 22 +++++++++ .../src/main/java/org/tron/core/vm/Op.java | 6 +++ .../org/tron/core/vm/OperationActions.java | 31 ++++++++++++ .../org/tron/core/vm/OperationRegistry.java | 32 ++++++++++++- .../org/tron/core/vm/config/ConfigLoader.java | 1 + .../org/tron/core/vm/config/VMConfig.java | 10 ++++ .../tron/core/vm/program/ContractState.java | 15 ++++++ .../java/org/tron/core/vm/program/Memory.java | 8 ++++ .../org/tron/core/vm/program/Program.java | 4 ++ .../tron/core/vm/repository/Repository.java | 6 +++ .../core/vm/repository/RepositoryImpl.java | 45 ++++++++++++++++++ .../core/store/DynamicPropertiesStore.java | 14 ++++++ .../common/parameter/CommonParameter.java | 4 ++ .../src/main/java/org/tron/core/Constant.java | 2 + .../src/main/java/org/tron/core/Wallet.java | 5 ++ .../java/org/tron/core/config/args/Args.java | 5 ++ .../tron/core/consensus/ProposalService.java | 4 ++ .../common/runtime/vm/OperationsTest.java | 47 +++++++++++++++++++ 19 files changed, 276 insertions(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index 081b91dfd6c..6b558011c73 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -809,6 +809,21 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } break; } + case ALLOW_TVM_CANCUN: { + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_0)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_CANCUN]"); + } + if (dynamicPropertiesStore.getAllowTvmCancun() == 1) { + throw new ContractValidateException( + "[ALLOW_TVM_CANCUN] has been valid, no need to propose again"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_CANCUN] is only allowed to be 1"); + } + break; + } default: break; } @@ -888,6 +903,7 @@ public enum ProposalType { // current value, value range ALLOW_OLD_REWARD_OPT(79), // 0, 1 ALLOW_ENERGY_ADJUSTMENT(81), // 0, 1 MAX_CREATE_ACCOUNT_TX_SIZE(82), // [500, 10000] + ALLOW_TVM_CANCUN(83), // 0, 1 ALLOW_STRICT_MATH(87), // 0, 1 CONSENSUS_LOGIC_OPTIMIZATION(88); // 0, 1 diff --git a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java index 6638b22d47f..5c78fb89ffb 100644 --- a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java +++ b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java @@ -57,6 +57,8 @@ public class EnergyCost { private static final long SUICIDE = 0; private static final long STOP = 0; private static final long CREATE_DATA = 200; + private static final long TLOAD = 100; + private static final long TSTORE = 100; public static long getZeroTierCost(Program ignored) { return ZERO_TIER; @@ -232,6 +234,26 @@ public static long getSstoreCost(Program program) { } + public static long getTLoadCost(Program ignored) { + return TLOAD; + } + + public static long getTStoreCost(Program ignored) { + return TSTORE; + } + + public static long getMCopyCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + + int dstOffset = stack.peek().intValue(); + int srcOffset = stack.get(stack.size() - 2).intValue(); + DataWord maxOffset = new DataWord(Math.max(dstOffset, srcOffset)); + return VERY_LOW_TIER + calcMemEnergy(oldMemSize, + memNeeded(maxOffset, stack.get(stack.size() - 3)), + stack.get(stack.size() - 3).longValueSafe(), Op.MCOPY); + } + public static long getLogCost(Program program) { Stack stack = program.getStack(); long oldMemSize = program.getMemSize(); diff --git a/actuator/src/main/java/org/tron/core/vm/Op.java b/actuator/src/main/java/org/tron/core/vm/Op.java index f6987c12942..4b4488ef427 100644 --- a/actuator/src/main/java/org/tron/core/vm/Op.java +++ b/actuator/src/main/java/org/tron/core/vm/Op.java @@ -145,6 +145,12 @@ public class Op { // (0x5a) Get the amount of available gas public static final int GAS = 0x5a; public static final int JUMPDEST = 0x5b; + // (0x5c) Load word from transient memory + public static final int TLOAD = 0x5c; + // (0x5d) Save word to transient memory + public static final int TSTORE = 0x5d; + // (0x5e) Copy word from memory + public static final int MCOPY = 0x5e; /* Push Operations */ // Place item on stack diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index e8e5eb86b98..713c43851a0 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -643,6 +643,37 @@ public static void jumpDestAction(Program program) { program.step(); } + public static void tLoadAction(Program program) { + DataWord key = program.stackPop(); + DataWord address = program.getContractAddress(); + + byte[] data = + program.getContractState().getTransientStorageValue(address.getData(), key.getData()); + DataWord value = data != null ? new DataWord(data) : DataWord.ZERO; + + program.stackPush(value); + program.step(); + } + + public static void tStoreAction(Program program) { + DataWord key = program.stackPop(); + DataWord value = program.stackPop(); + DataWord address = program.getContractAddress(); + + program.getContractState() + .updateTransientStorageValue(address.getData(), key.getData(), value.getData()); + program.step(); + } + + public static void mCopyAction(Program program) { + int dstOffset = program.stackPop().intValueSafe(); + int srcOffset = program.stackPop().intValueSafe(); + int length = program.stackPop().intValueSafe(); + + program.memoryCopy(dstOffset, srcOffset, length); + program.step(); + } + public static void push0Action(Program program) { program.stackPush(DataWord.ZERO()); program.step(); diff --git a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java index a2d3259ba89..da1c9b38e9e 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java @@ -12,6 +12,7 @@ public enum Version { TRON_V1_1, TRON_V1_2, TRON_V1_3, + TRON_V1_4, // add more // TRON_V2, // ETH @@ -24,6 +25,7 @@ public enum Version { tableMap.put(Version.TRON_V1_1, newTronV11OperationSet()); tableMap.put(Version.TRON_V1_2, newTronV12OperationSet()); tableMap.put(Version.TRON_V1_3, newTronV13OperationSet()); + tableMap.put(Version.TRON_V1_4, newTronV14OperationSet()); } public static JumpTable newTronV10OperationSet() { @@ -55,12 +57,18 @@ public static JumpTable newTronV13OperationSet() { return table; } + public static JumpTable newTronV14OperationSet() { + JumpTable table = newTronV13OperationSet(); + appendCancunOperations(table); + return table; + } + // Just for warming up class to avoid out_of_time public static void init() {} public static JumpTable getTable() { // always get the table which has the newest version - JumpTable table = tableMap.get(Version.TRON_V1_3); + JumpTable table = tableMap.get(Version.TRON_V1_4); // next make the corresponding changes, exclude activating opcode if (VMConfig.allowHigherLimitForMaxCpuTimeOfOneTx()) { @@ -652,4 +660,26 @@ public static void adjustForFairEnergy(JumpTable table) { EnergyCost::getSuicideCost2, OperationActions::suicideAction)); } + + public static void appendCancunOperations(JumpTable table) { + BooleanSupplier proposal = VMConfig::allowTvmCancun; + + table.set(new Operation( + Op.TLOAD, 1, 1, + EnergyCost::getTLoadCost, + OperationActions::tLoadAction, + proposal)); + + table.set(new Operation( + Op.TSTORE, 2, 0, + EnergyCost::getTStoreCost, + OperationActions::tStoreAction, + proposal)); + + table.set(new Operation( + Op.MCOPY, 3, 0, + EnergyCost::getMCopyCost, + OperationActions::mCopyAction, + proposal)); + } } diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index 79a536f4cbf..5c4acb31bae 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -41,6 +41,7 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowTvmShangHai(ds.getAllowTvmShangHai()); VMConfig.initAllowEnergyAdjustment(ds.getAllowEnergyAdjustment()); VMConfig.initAllowStrictMath(ds.getAllowStrictMath()); + VMConfig.initAllowTvmCancun(ds.getAllowTvmCancun()); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java index 90a2c6335f6..9f567344337 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -53,6 +53,8 @@ public class VMConfig { private static boolean ALLOW_STRICT_MATH = false; + private static boolean ALLOW_TVM_CANCUN = false; + private VMConfig() { } @@ -148,6 +150,10 @@ public static void initAllowStrictMath(long allow) { ALLOW_STRICT_MATH = allow == 1; } + public static void initAllowTvmCancun(long allow) { + ALLOW_TVM_CANCUN = allow == 1; + } + public static boolean getEnergyLimitHardFork() { return CommonParameter.ENERGY_LIMIT_HARD_FORK; } @@ -231,4 +237,8 @@ public static boolean allowEnergyAdjustment() { public static boolean allowStrictMath() { return ALLOW_STRICT_MATH; } + + public static boolean allowTvmCancun() { + return ALLOW_TVM_CANCUN; + } } diff --git a/actuator/src/main/java/org/tron/core/vm/program/ContractState.java b/actuator/src/main/java/org/tron/core/vm/program/ContractState.java index 657558b3725..e095201e393 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/ContractState.java +++ b/actuator/src/main/java/org/tron/core/vm/program/ContractState.java @@ -229,6 +229,11 @@ public void putDelegatedResourceAccountIndex(Key key, Value value) { repository.putDelegatedResourceAccountIndex(key, value); } + @Override + public void putTransientStorageValue(Key address, Key key, Value value) { + repository.putTransientStorageValue(address, key, value); + } + @Override public long addTokenBalance(byte[] address, byte[] tokenId, long value) { return repository.addTokenBalance(address, tokenId, value); @@ -314,6 +319,11 @@ public DelegatedResourceAccountIndexCapsule getDelegatedResourceAccountIndex(byt return repository.getDelegatedResourceAccountIndex(key); } + @Override + public byte[] getTransientStorageValue(byte[] address, byte[] key) { + return repository.getTransientStorageValue(address, key); + } + @Override public void updateDynamicProperty(byte[] word, BytesCapsule bytesCapsule) { repository.updateDynamicProperty(word, bytesCapsule); @@ -354,6 +364,11 @@ public void updateDelegatedResourceAccountIndex(byte[] word, DelegatedResourceAc repository.updateDelegatedResourceAccountIndex(word, delegatedResourceAccountIndexCapsule); } + @Override + public void updateTransientStorageValue(byte[] address, byte[] key, byte[] value) { + repository.updateTransientStorageValue(address, key, value); + } + @Override public void putDynamicProperty(Key key, Value value) { repository.putDynamicProperty(key, value); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Memory.java b/actuator/src/main/java/org/tron/core/vm/program/Memory.java index e5cbebad2b9..8f263ca7344 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Memory.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Memory.java @@ -181,6 +181,14 @@ public List getChunks() { return new LinkedList<>(chunks); } + public void copy(int destPos, int srcPos, int size) { + if (size <= 0) { + return; + } + byte[] data = read(srcPos, size); + write(destPos, data, size, false); + } + private int captureMax(int chunkIndex, int chunkOffset, int size, byte[] src, int srcPos) { byte[] chunk = chunks.get(chunkIndex); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 4273778a7d6..9dda3ed6b7f 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -429,6 +429,10 @@ public byte[] memoryChunk(int offset, int size) { return memory.read(offset, size); } + public void memoryCopy(int dst, int src, int size) { + memory.copy(dst, src, size); + } + /** * . Allocates extra memory in the program for a specified size, calculated from a given offset * diff --git a/actuator/src/main/java/org/tron/core/vm/repository/Repository.java b/actuator/src/main/java/org/tron/core/vm/repository/Repository.java index b4324bb8d18..664ee26ee92 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/Repository.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/Repository.java @@ -41,6 +41,8 @@ public interface Repository { DelegatedResourceAccountIndexCapsule getDelegatedResourceAccountIndex(byte[] key); + byte[] getTransientStorageValue(byte[] address, byte[] key); + void deleteContract(byte[] address); void createContract(byte[] address, ContractCapsule contractCapsule); @@ -71,6 +73,8 @@ public interface Repository { void updateDelegatedResourceAccountIndex(byte[] word, DelegatedResourceAccountIndexCapsule delegatedResourceAccountIndexCapsule); + void updateTransientStorageValue(byte[] address, byte[] key, byte[] value); + void saveCode(byte[] address, byte[] code); byte[] getCode(byte[] address); @@ -113,6 +117,8 @@ public interface Repository { void putDelegatedResourceAccountIndex(Key key, Value value); + void putTransientStorageValue(Key address, Key key, Value value); + long addTokenBalance(byte[] address, byte[] tokenId, long value); long getTokenBalance(byte[] address, byte[] tokenId); diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index 50fa5385c23..7fcfbe8ef78 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -4,6 +4,7 @@ import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import com.google.common.collect.HashBasedTable; import com.google.protobuf.ByteString; import java.util.HashMap; import java.util.Optional; @@ -131,6 +132,7 @@ public class RepositoryImpl implements Repository { private final HashMap> votesCache = new HashMap<>(); private final HashMap> delegationCache = new HashMap<>(); private final HashMap> delegatedResourceAccountIndexCache = new HashMap<>(); + private final HashBasedTable> transientStorage = HashBasedTable.create(); public static void removeLruCache(byte[] address) { } @@ -442,6 +444,27 @@ public DelegatedResourceAccountIndexCapsule getDelegatedResourceAccountIndex(byt return delegatedResourceAccountIndexCapsule; } + public byte[] getTransientStorageValue(byte[] address, byte[] key) { + Key cacheAddress = new Key(address); + Key cacheKey = new Key(key); + if (transientStorage.contains(cacheAddress, cacheKey)) { + return transientStorage.get(cacheAddress, cacheKey).getValue(); + } + + byte[] value; + if (parent != null) { + value = parent.getTransientStorageValue(address, key); + } else{ + value = null; + } + + if (value != null) { + transientStorage.put(cacheAddress, cacheKey, Value.create(value)); + } + + return value; + } + @Override public void deleteContract(byte[] address) { @@ -565,6 +588,11 @@ public void updateDelegatedResourceAccountIndex( Key.create(word), Value.create(delegatedResourceAccountIndexCapsule, Type.DIRTY)); } + @Override + public void updateTransientStorageValue(byte[] address, byte[] key, byte[] value) { + transientStorage.put(Key.create(address), Key.create(key), Value.create(value, Type.DIRTY)); + } + @Override public void saveCode(byte[] address, byte[] code) { codeCache.put(Key.create(address), Value.create(code, Type.CREATE)); @@ -709,6 +737,7 @@ public void commit() { commitVotesCache(repository); commitDelegationCache(repository); commitDelegatedResourceAccountIndexCache(repository); + commitTransientStorage(repository); } @Override @@ -767,6 +796,11 @@ public void putDelegatedResourceAccountIndex(Key key, Value value) { delegatedResourceAccountIndexCache.put(key, value); } + @Override + public void putTransientStorageValue(Key address, Key key, Value value) { + transientStorage.put(address, key, value); + } + @Override public long addTokenBalance(byte[] address, byte[] tokenId, long value) { byte[] tokenIdWithoutLeadingZero = ByteUtil.stripLeadingZeroes(tokenId); @@ -1013,6 +1047,17 @@ private void commitDelegatedResourceAccountIndexCache(Repository deposit) { })); } + public void commitTransientStorage(Repository deposit) { + if (deposit != null) { + transientStorage.cellSet().forEach(cell -> { + if (cell.getValue().getType().isDirty() || cell.getValue().getType().isCreate()) { + deposit.putTransientStorageValue( + cell.getRowKey(), cell.getColumnKey(), cell.getValue()); + } + }); + } + } + /** * Get the block id from the number. */ diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 6fe29a7a136..399c3a6b292 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -227,6 +227,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] CONSENSUS_LOGIC_OPTIMIZATION = "CONSENSUS_LOGIC_OPTIMIZATION".getBytes(); + private static final byte[] ALLOW_TVM_CANCUN = "ALLOW_TVM_CANCUN".getBytes(); + @Autowired private DynamicPropertiesStore(@Value("properties") String dbName) { super(dbName); @@ -2914,6 +2916,18 @@ public boolean allowWitnessSortOptimization() { return this.allowConsensusLogicOptimization(); } + public void saveAllowTvmCancun(long allowTvmCancun) { + this.put(ALLOW_TVM_CANCUN, + new BytesCapsule(ByteArray.fromLong(allowTvmCancun))); + } + + public long getAllowTvmCancun() { + return Optional.ofNullable(getUnchecked(ALLOW_TVM_CANCUN)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElse(CommonParameter.getInstance().getAllowTvmCancun()); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 8b599035f64..ae03372ea48 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -703,6 +703,10 @@ public class CommonParameter { @Setter public long consensusLogicOptimization; + @Getter + @Setter + public long allowTvmCancun; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 2043ba7fcdc..f18a7c055f3 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -396,4 +396,6 @@ public class Constant { public static final String COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION = "committee.consensusLogicOptimization"; + + public static final String COMMITTEE_ALLOW_TVM_CANCUN = "committee.allowTvmCancun"; } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index e2eea8700d1..ce70d8b4cb7 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -1353,6 +1353,11 @@ public Protocol.ChainParameters getChainParameters() { .setValue(dbManager.getDynamicPropertiesStore().getConsensusLogicOptimization()) .build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() + .setKey("getAllowTvmCancun") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCancun()) + .build()); + return builder.build(); } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 2ac3e69eced..f53a0125466 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -241,6 +241,7 @@ public static void clearParam() { PARAMETER.allowEnergyAdjustment = 0; PARAMETER.allowStrictMath = 0; PARAMETER.consensusLogicOptimization = 0; + PARAMETER.allowTvmCancun = 0; } /** @@ -1255,6 +1256,10 @@ public static void setParam(final Config config) { config.hasPath(Constant.COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION) ? config .getInt(Constant.COMMITTEE_CONSENSUS_LOGIC_OPTIMIZATION) : 0; + PARAMETER.allowTvmCancun = + config.hasPath(Constant.COMMITTEE_ALLOW_TVM_CANCUN) ? config + .getInt(Constant.COMMITTEE_ALLOW_TVM_CANCUN) : 0; + logConfig(); } diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalService.java b/framework/src/main/java/org/tron/core/consensus/ProposalService.java index 120394de1be..1a95fd5064d 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalService.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalService.java @@ -376,6 +376,10 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule) .saveConsensusLogicOptimization(entry.getValue()); break; } + case ALLOW_TVM_CANCUN: { + manager.getDynamicPropertiesStore().saveAllowTvmCancun(entry.getValue()); + break; + } default: find = false; break; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index 2a70364b8d1..ed4c8c47a2c 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -934,6 +934,53 @@ public void testVoteWitnessCost() throws ContractValidateException { Assert.assertEquals(30000 + memoryExpandEnergy, EnergyCost.getVoteWitnessCost2(program)); } + @Test + public void testTransientStorageOperations() throws ContractValidateException { + VMConfig.initAllowTvmCancun(1); + + invoke = new ProgramInvokeMockImpl(); + invoke.setEnergyLimit(20000); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // TLOAD = 0x5c; + byte[] op = new byte[] {0x60, 0x01, 0x5c}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(103, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // TSTORE = 0x5d; + op = new byte[] {0x60, 0x01, 0x60, 0x01, 0x5d}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(106, program.getResult().getEnergyUsed()); + Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000001", + Hex.toHexString(program.getContractState().getTransientStorageValue( + program.getContractAddress().getData(), new DataWord(0x01).getData()))); + VMConfig.initAllowTvmCancun(0); + } + + @Test + public void testMCOPY() throws ContractValidateException { + VMConfig.initAllowTvmCancun(1); + + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // MCOPY = 0x5e + byte[] op = new byte[] {0x60, 0x20, 0x60, 0x01, 0x60, 0x20, 0x5e}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(21, program.getResult().getEnergyUsed()); + Assert.assertEquals(64, program.getMemSize()); + + VMConfig.initAllowTvmCancun(0); + } + private void testOperations(Program program) { try { while (!program.isStopped()) { From 2d2195c9f99e90372ba1af179cd067327de2d474 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Fri, 14 Feb 2025 12:01:30 +0800 Subject: [PATCH 035/107] fix(test): update test case --- .../src/test/java/org/tron/common/config/args/ArgsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index 0b66064f663..01a49f6df40 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -36,7 +36,7 @@ public void testConfig() { Args.logConfig(); Assert.assertEquals(Args.getInstance().getMaxTransactionPendingSize(), 2000); Assert.assertEquals(Args.getInstance().getPendingTransactionTimeout(), 60_000); - Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); + Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 4); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); Assert.assertEquals(Args.getInstance().isNodeDetectEnable(), false); Assert.assertFalse(Args.getInstance().isNodeEffectiveCheckEnable()); From 60364ab9f546c3a0cd5d4b3217284a96ac623350 Mon Sep 17 00:00:00 2001 From: Liulei Date: Thu, 27 Jun 2024 17:05:50 +0800 Subject: [PATCH 036/107] feat(tvm): update comments and tests --- .../src/main/java/org/tron/core/vm/Op.java | 4 ++-- .../org/tron/core/vm/OperationActions.java | 2 +- .../common/runtime/vm/OperationsTest.java | 21 ++++++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/Op.java b/actuator/src/main/java/org/tron/core/vm/Op.java index 4b4488ef427..5125f067d31 100644 --- a/actuator/src/main/java/org/tron/core/vm/Op.java +++ b/actuator/src/main/java/org/tron/core/vm/Op.java @@ -145,9 +145,9 @@ public class Op { // (0x5a) Get the amount of available gas public static final int GAS = 0x5a; public static final int JUMPDEST = 0x5b; - // (0x5c) Load word from transient memory + // (0x5c) Load word from transient storage public static final int TLOAD = 0x5c; - // (0x5d) Save word to transient memory + // (0x5d) Save word to transient storage public static final int TSTORE = 0x5d; // (0x5e) Copy word from memory public static final int MCOPY = 0x5e; diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index 713c43851a0..1208a94b61b 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -649,7 +649,7 @@ public static void tLoadAction(Program program) { byte[] data = program.getContractState().getTransientStorageValue(address.getData(), key.getData()); - DataWord value = data != null ? new DataWord(data) : DataWord.ZERO; + DataWord value = data != null ? new DataWord(data) : DataWord.ZERO(); program.stackPush(value); program.step(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index ed4c8c47a2c..0eb00244d21 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -956,9 +956,17 @@ public void testTransientStorageOperations() throws ContractValidateException { program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(106, program.getResult().getEnergyUsed()); - Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000001", - Hex.toHexString(program.getContractState().getTransientStorageValue( - program.getContractAddress().getData(), new DataWord(0x01).getData()))); + Assert.assertArrayEquals(new DataWord(0x01).getData(), + program.getContractState().getTransientStorageValue( + program.getContractAddress().getData(), new DataWord(0x01).getData())); + + // TLOAD = 0x5c; + op = new byte[] {0x60, 0x01, 0x5c}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(103, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + VMConfig.initAllowTvmCancun(0); } @@ -978,6 +986,13 @@ public void testMCOPY() throws ContractValidateException { Assert.assertEquals(21, program.getResult().getEnergyUsed()); Assert.assertEquals(64, program.getMemSize()); + op = + new byte[] { + 0x60, 0x01, 0x60, 0x01, 0x52, 0x60, 0x20, 0x60, 0x01, 0x60, 0x20, 0x5e, 0x60, 0x20, 0x51}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + VMConfig.initAllowTvmCancun(0); } From 2d2200c771f8673a0ae5aa6fcfd7214fd678bc2d Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 14 Feb 2025 13:54:19 +0800 Subject: [PATCH 037/107] feat(consensus): check block header time is an integer multiple of 3s --- .../org/tron/consensus/dpos/DposService.java | 7 +++ .../tron/core/consensus/DposServiceTest.java | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/consensus/DposServiceTest.java diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java index 5ec6c7c554b..e8e162bd0a8 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java @@ -1,5 +1,6 @@ package org.tron.consensus.dpos; +import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.MAX_ACTIVE_WITNESS_NUM; import static org.tron.core.config.Parameter.ChainConstant.SOLIDIFIED_THRESHOLD; @@ -116,6 +117,12 @@ public boolean validBlock(BlockCapsule blockCapsule) { } ByteString witnessAddress = blockCapsule.getWitnessAddress(); long timeStamp = blockCapsule.getTimeStamp(); + if (timeStamp % BLOCK_PRODUCED_INTERVAL != 0 + && consensusDelegate.getDynamicPropertiesStore().allowConsensusLogicOptimization()) { + logger.warn("ValidBlock failed: witness: {}, timeStamp: {}", + ByteArray.toHexString(witnessAddress.toByteArray()), timeStamp); + return false; + } long bSlot = dposSlot.getAbSlot(timeStamp); long hSlot = dposSlot.getAbSlot(consensusDelegate.getLatestBlockHeaderTimestamp()); if (bSlot <= hSlot) { diff --git a/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java new file mode 100644 index 00000000000..6f1a14e5c2d --- /dev/null +++ b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java @@ -0,0 +1,47 @@ +package org.tron.core.consensus; + +import static org.mockito.Mockito.mock; + +import java.lang.reflect.Field; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.consensus.ConsensusDelegate; +import org.tron.consensus.dpos.DposService; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.protos.Protocol; + +public class DposServiceTest { + DposService service = new DposService(); + + @Test + public void test() throws Exception { + long headTime = 1724036757000L; + + ConsensusDelegate consensusDelegate = mock(ConsensusDelegate.class); + Field field = service.getClass().getDeclaredField("consensusDelegate"); + field.setAccessible(true); + field.set(service, consensusDelegate); + + DynamicPropertiesStore store = mock(DynamicPropertiesStore.class); + Mockito.when(consensusDelegate.getDynamicPropertiesStore()).thenReturn(store); + + Mockito.when(consensusDelegate.getLatestBlockHeaderNumber()).thenReturn(0L); + boolean f = service.validBlock(null); + Assert.assertTrue(f); + + Protocol.BlockHeader.raw raw = Protocol.BlockHeader.raw.newBuilder() + .setTimestamp(headTime + 3001).build(); + Protocol.BlockHeader header = Protocol.BlockHeader.newBuilder().setRawData(raw).build(); + Protocol.Block block = Protocol.Block.newBuilder().setBlockHeader(header).build(); + + Mockito.when(consensusDelegate.getLatestBlockHeaderNumber()).thenReturn(100L); + Mockito.when(store.allowConsensusLogicOptimization()).thenReturn(true); + + Mockito.when(consensusDelegate.getLatestBlockHeaderTimestamp()).thenReturn(headTime + 3000); + f = service.validBlock(new BlockCapsule(block)); + Assert.assertTrue(!f); + + } +} \ No newline at end of file From e90c3213a0b9b64143018fc15315c2d4820eafad Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 14 Feb 2025 14:13:17 +0800 Subject: [PATCH 038/107] feat(consensus): verify the slot to avoid block generation during maintenance period --- .../org/tron/consensus/dpos/DposService.java | 6 ++ .../tron/core/consensus/DposServiceTest.java | 82 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/consensus/DposServiceTest.java diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java index 292294b2c2d..4ab9f8ea26e 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposService.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposService.java @@ -124,6 +124,12 @@ public boolean validBlock(BlockCapsule blockCapsule) { } long slot = dposSlot.getSlot(timeStamp); + if (slot == 0 + && consensusDelegate.getDynamicPropertiesStore().allowConsensusLogicOptimization()) { + logger.warn("ValidBlock failed: slot error, witness: {}, timeStamp: {}", + ByteArray.toHexString(witnessAddress.toByteArray()), new DateTime(timeStamp)); + return false; + } final ByteString scheduledWitness = dposSlot.getScheduledWitness(slot); if (!scheduledWitness.equals(witnessAddress)) { logger.warn("ValidBlock failed: sWitness: {}, bWitness: {}, bTimeStamp: {}, slot: {}", diff --git a/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java new file mode 100644 index 00000000000..02e8dc6b809 --- /dev/null +++ b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java @@ -0,0 +1,82 @@ +package org.tron.core.consensus; + +import static org.mockito.Mockito.mock; + +import com.google.protobuf.ByteString; +import java.lang.reflect.Field; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.parameter.CommonParameter; +import org.tron.consensus.ConsensusDelegate; +import org.tron.consensus.dpos.DposService; +import org.tron.consensus.dpos.DposSlot; +import org.tron.core.Constant; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.config.args.Args; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.p2p.utils.NetUtil; +import org.tron.protos.Protocol; + +public class DposServiceTest { + DposService service = new DposService(); + + @Test + public void testValiedSlot() throws Exception { + Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); + CommonParameter parameter = Args.getInstance(); + long headTime = 1724036757000L; + ByteString witness = ByteString.copyFrom(NetUtil.getNodeId()); + ByteString witness2 = ByteString.copyFrom(NetUtil.getNodeId()); + + ConsensusDelegate consensusDelegate = mock(ConsensusDelegate.class); + Field field = service.getClass().getDeclaredField("consensusDelegate"); + field.setAccessible(true); + field.set(service, consensusDelegate); + + + DposSlot dposSlot = mock(DposSlot.class); + field = service.getClass().getDeclaredField("dposSlot"); + field.setAccessible(true); + field.set(service, dposSlot); + + Mockito.when(dposSlot.getAbSlot(headTime)).thenReturn(headTime / 3000); + Mockito.when(dposSlot.getAbSlot(headTime + 3000)).thenReturn((headTime + 3000) / 3000); + + DynamicPropertiesStore store = mock(DynamicPropertiesStore.class); + Mockito.when(consensusDelegate.getDynamicPropertiesStore()).thenReturn(store); + + Mockito.when(consensusDelegate.getLatestBlockHeaderNumber()).thenReturn(0L); + boolean f = service.validBlock(null); + Assert.assertTrue(f); + + Mockito.when(consensusDelegate.getLatestBlockHeaderNumber()).thenReturn(100L); + + Protocol.BlockHeader.raw raw = Protocol.BlockHeader.raw.newBuilder() + .setTimestamp(headTime + 3000) + .setWitnessAddress(witness).build(); + Protocol.BlockHeader header = Protocol.BlockHeader.newBuilder().setRawData(raw).build(); + Protocol.Block block = Protocol.Block.newBuilder().setBlockHeader(header).build(); + + Mockito.when(consensusDelegate.getLatestBlockHeaderTimestamp()).thenReturn(headTime + 3000); + f = service.validBlock(new BlockCapsule(block)); + Assert.assertTrue(!f); + + Mockito.when(consensusDelegate.getLatestBlockHeaderTimestamp()).thenReturn(headTime); + + Mockito.when(dposSlot.getSlot(headTime + 3000)).thenReturn(0L); + + Mockito.when(dposSlot.getScheduledWitness(0L)).thenReturn(witness2); + f = service.validBlock(new BlockCapsule(block)); + Assert.assertTrue(!f); + + Mockito.when(dposSlot.getScheduledWitness(0L)).thenReturn(witness); + f = service.validBlock(new BlockCapsule(block)); + Assert.assertTrue(f); + + Mockito.when(store.allowConsensusLogicOptimization()).thenReturn(true); + f = service.validBlock(new BlockCapsule(block)); + Assert.assertTrue(!f); + } + +} From bdea53ff0e25f2af16bc357e638018791ead79f3 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 14 Feb 2025 14:19:10 +0800 Subject: [PATCH 039/107] feat(net): change the MAX_PEER_COUNT_PER_ADDRESS value to 5 --- .../main/java/org/tron/core/net/service/relay/RelayService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index 107d086c1b7..fa5df2e5edc 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -40,7 +40,7 @@ @Component public class RelayService { - private static final int MAX_PEER_COUNT_PER_ADDRESS = 2; + private static final int MAX_PEER_COUNT_PER_ADDRESS = 5; @Autowired private ChainBaseManager chainBaseManager; From 00d994b01deaefed7b2e719e08620e36000c12f1 Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 14 Feb 2025 17:17:56 +0800 Subject: [PATCH 040/107] test(vm): enable saving details for cancelcallunfreeze opcode test --- .../src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java index 9558c701109..d8f7570b213 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java @@ -22,6 +22,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.tron.common.application.TronApplicationContext; +import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.Runtime; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TVMTestResult; @@ -274,6 +275,7 @@ private TVMTestResult triggerWithdrawExpireUnfreeze( private TVMTestResult triggerCancelAllUnfreezeV2( byte[] callerAddr, byte[] contractAddr, contractResult expectedResult, Consumer check) throws Exception { + CommonParameter.getInstance().saveCancelAllUnfreezeV2Details = true; return triggerContract( callerAddr, contractAddr, fee, expectedResult, check, "cancelAllUnfreezeBalanceV2()"); } From 878dffcf455f6805e2f9e064c41d4675dc80550b Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Fri, 14 Feb 2025 17:24:28 +0800 Subject: [PATCH 041/107] fix(test): update test case --- .../test/java/org/tron/core/net/services/SyncServiceTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java index 89c081eaab5..c2883fb349d 100644 --- a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java @@ -85,9 +85,11 @@ public void testStartSync() { peer.setChannel(c1); + ReflectUtils.setFieldValue(peer, "tronState", TronState.SYNCING); + service.startSync(peer); - ReflectUtils.setFieldValue(peer, "tronState", TronState.SYNCING); + ReflectUtils.setFieldValue(peer, "tronState", TronState.INIT); service.startSync(peer); } catch (Exception e) { From 0640dd6a35b1d23b656b344e00e15ea531d4103a Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Wed, 5 Feb 2025 17:32:02 +0800 Subject: [PATCH 042/107] feat(event): optimize the event service --- .../common/logsfilter/EventPluginConfig.java | 8 + .../logsfilter/trigger/BlockLogTrigger.java | 2 +- .../logsfilter/trigger/SolidityTrigger.java | 2 +- .../src/main/java/org/tron/core/Constant.java | 2 + .../common/application/ApplicationImpl.java | 6 + .../common/logsfilter/EventPluginLoader.java | 17 + .../java/org/tron/core/config/args/Args.java | 9 + .../main/java/org/tron/core/db/Manager.java | 37 +- .../core/services/event/BlockEventCache.java | 96 +++++ .../core/services/event/BlockEventGet.java | 387 ++++++++++++++++++ .../core/services/event/BlockEventLoad.java | 86 ++++ .../core/services/event/EventService.java | 61 +++ .../services/event/HistoryEventService.java | 76 ++++ .../services/event/RealtimeEventService.java | 120 ++++++ .../services/event/SolidEventService.java | 110 +++++ .../core/services/event/bo/BlockEvent.java | 28 ++ .../tron/core/services/event/bo/Event.java | 14 + .../event/bo/SmartContractTrigger.java | 14 + .../event/exception/EventException.java | 7 + .../tron/core/event/BlockEventCacheTest.java | 90 ++++ .../tron/core/event/BlockEventGetTest.java | 185 +++++++++ .../tron/core/event/BlockEventLoadTest.java | 124 ++++++ .../org/tron/core/event/EventServiceTest.java | 34 ++ .../core/event/HistoryEventServiceTest.java | 85 ++++ .../core/event/RealtimeEventServiceTest.java | 118 ++++++ .../core/event/SolidEventServiceTest.java | 116 ++++++ 26 files changed, 1818 insertions(+), 16 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/event/BlockEventCache.java create mode 100644 framework/src/main/java/org/tron/core/services/event/BlockEventGet.java create mode 100644 framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java create mode 100644 framework/src/main/java/org/tron/core/services/event/EventService.java create mode 100644 framework/src/main/java/org/tron/core/services/event/HistoryEventService.java create mode 100644 framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java create mode 100644 framework/src/main/java/org/tron/core/services/event/SolidEventService.java create mode 100644 framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java create mode 100644 framework/src/main/java/org/tron/core/services/event/bo/Event.java create mode 100644 framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java create mode 100644 framework/src/main/java/org/tron/core/services/event/exception/EventException.java create mode 100644 framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java create mode 100644 framework/src/test/java/org/tron/core/event/BlockEventGetTest.java create mode 100644 framework/src/test/java/org/tron/core/event/BlockEventLoadTest.java create mode 100644 framework/src/test/java/org/tron/core/event/EventServiceTest.java create mode 100644 framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java create mode 100644 framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java create mode 100644 framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java diff --git a/common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java b/common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java index 050499b6123..e2aa0950d72 100644 --- a/common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java +++ b/common/src/main/java/org/tron/common/logsfilter/EventPluginConfig.java @@ -15,6 +15,14 @@ public class EventPluginConfig { public static final String SOLIDITY_EVENT_NAME = "solidityevent"; public static final String SOLIDITY_LOG_NAME = "soliditylog"; + @Getter + @Setter + private int version; + + @Getter + @Setter + private long startSyncBlockNum; + @Getter @Setter private String pluginPath; diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/BlockLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/BlockLogTrigger.java index 5e64c5a1050..b878597045d 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/BlockLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/BlockLogTrigger.java @@ -34,7 +34,7 @@ public BlockLogTrigger() { @Override public String toString() { return new StringBuilder().append("triggerName: ").append(getTriggerName()) - .append("timestamp: ") + .append(", timestamp: ") .append(timeStamp) .append(", blockNumber: ") .append(blockNumber) diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/SolidityTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/SolidityTrigger.java index d9745f4724a..230544a91ff 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/SolidityTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/SolidityTrigger.java @@ -16,7 +16,7 @@ public SolidityTrigger() { @Override public String toString() { return new StringBuilder().append("triggerName: ").append(getTriggerName()) - .append("timestamp: ") + .append(", timestamp: ") .append(timeStamp) .append(", latestSolidifiedBlockNumber: ") .append(latestSolidifiedBlockNumber).toString(); diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 3bdbf2113af..00f9723abed 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -280,6 +280,8 @@ public class Constant { public static final String NATIVE_QUEUE_SEND_LENGTH = "event.subscribe.native.sendqueuelength"; + public static final String EVENT_SUBSCRIBE_VERSION = "event.subscribe.version"; + public static final String EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM = "event.subscribe.startSyncBlockNum"; public static final String EVENT_SUBSCRIBE_PATH = "event.subscribe.path"; public static final String EVENT_SUBSCRIBE_SERVER = "event.subscribe.server"; public static final String EVENT_SUBSCRIBE_DB_CONFIG = "event.subscribe.dbconfig"; diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index 3cb75cb1e24..443f93e446d 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -10,6 +10,7 @@ import org.tron.core.db.Manager; import org.tron.core.metrics.MetricsUtil; import org.tron.core.net.TronNetService; +import org.tron.core.services.event.EventService; @Slf4j(topic = "app") @Component @@ -17,6 +18,9 @@ public class ApplicationImpl implements Application { private ServiceContainer services; + @Autowired + private EventService eventService; + @Autowired private TronNetService tronNetService; @@ -56,6 +60,7 @@ public void initServices(CommonParameter parameter) { public void startup() { this.initServices(Args.getInstance()); this.startServices(); + eventService.init(); if ((!Args.getInstance().isSolidityNode()) && (!Args.getInstance().isP2pDisable())) { tronNetService.start(); } @@ -66,6 +71,7 @@ public void startup() { @Override public void shutdown() { this.shutdownServices(); + eventService.close(); consensusService.stop(); if (!Args.getInstance().isSolidityNode() && (!Args.getInstance().p2pDisable)) { tronNetService.close(); diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index c8019dac93a..7896eeffae4 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -24,6 +24,7 @@ import org.tron.common.logsfilter.trigger.SolidityTrigger; import org.tron.common.logsfilter.trigger.TransactionLogTrigger; import org.tron.common.logsfilter.trigger.Trigger; +import org.tron.common.utils.JsonUtil; @Slf4j public class EventPluginLoader { @@ -42,6 +43,10 @@ public class EventPluginLoader { private List triggerConfigList; + private int version = 0; + + private long startSyncBlockNum = 0; + private boolean blockLogTriggerEnable = false; private boolean blockLogTriggerSolidified = false; @@ -219,6 +224,10 @@ public boolean start(EventPluginConfig config) { return false; } + this.version = config.getVersion(); + + this.startSyncBlockNum = config.getStartSyncBlockNum(); + this.triggerConfigList = config.getTriggerConfigList(); useNativeQueue = config.isUseNativeQueue(); @@ -358,6 +367,14 @@ public void postSolidityTrigger(SolidityTrigger trigger) { } } + public synchronized int getVersion() { + return version; + } + + public synchronized long getStartSyncBlockNum() { + return startSyncBlockNum; + } + public synchronized boolean isBlockLogTriggerEnable() { return blockLogTriggerEnable; } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 7397b69cde3..2dbfc04e8d5 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -1323,6 +1323,15 @@ private static EventPluginConfig getEventPluginConfig( final com.typesafe.config.Config config) { EventPluginConfig eventPluginConfig = new EventPluginConfig(); + if (config.hasPath(Constant.EVENT_SUBSCRIBE_VERSION)) { + eventPluginConfig.setVersion(config.getInt(Constant.EVENT_SUBSCRIBE_VERSION)); + } + + if (config.hasPath(Constant.EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM)) { + eventPluginConfig.setStartSyncBlockNum(config + .getLong(Constant.EVENT_SUBSCRIBE_START_SYNC_BLOCK_NUM)); + } + boolean useNativeQueue = false; int bindPort = 0; int sendQueueLength = 0; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 908e248bdee..f6076c1f292 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -237,6 +237,7 @@ public class Manager { Collections.synchronizedList(Lists.newArrayList()); // the capacity is equal to Integer.MAX_VALUE default private BlockingQueue rePushTransactions; + @Getter private BlockingQueue triggerCapsuleQueue; // log filter private boolean isRunFilterProcessThread = true; @@ -1100,7 +1101,9 @@ private void switchFork(BlockCapsule newHead) while (!getDynamicPropertiesStore() .getLatestBlockHeaderHash() .equals(binaryTree.getValue().peekLast().getParentHash())) { - reOrgContractTrigger(); + if (EventPluginLoader.getInstance().getVersion() == 0) { + reOrgContractTrigger(); + } reOrgLogsFilter(); eraseBlock(); } @@ -1362,11 +1365,26 @@ public void pushBlock(final BlockCapsule block) } void blockTrigger(final BlockCapsule block, long oldSolid, long newSolid) { + // post block and logs for jsonrpc try { + if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { + postBlockFilter(block, false); + postLogsFilter(block, false, false); + } + + if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) { + postSolidityFilter(oldSolid, newSolid); + } + + if (EventPluginLoader.getInstance().getVersion() != 0) { + lastUsedSolidityNum = newSolid; + return; + } + // if event subscribe is enabled, post block trigger to queue postBlockTrigger(block); // if event subscribe is enabled, post solidity trigger to queue - postSolidityTrigger(oldSolid, newSolid); + postSolidityTrigger(newSolid); } catch (Exception e) { logger.error("Block trigger failed. head: {}, oldSolid: {}, newSolid: {}", block.getNum(), oldSolid, newSolid, e); @@ -1506,7 +1524,8 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block // if event subscribe is enabled, post contract triggers to queue // only trigger when process block - if (Objects.nonNull(blockCap) && !blockCap.isMerkleRootEmpty()) { + if (Objects.nonNull(blockCap) && !blockCap.isMerkleRootEmpty() + && EventPluginLoader.getInstance().getVersion() == 0) { String blockHash = blockCap.getBlockId().toString(); postContractTrigger(trace, false, blockHash); } @@ -2083,7 +2102,7 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif } } - private void postSolidityTrigger(final long oldSolidNum, final long latestSolidifiedBlockNumber) { + private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) { for (Long i : Args.getSolidityContractLogTriggerMap().keySet()) { postSolidityLogContractTrigger(i, latestSolidifiedBlockNumber); @@ -2109,10 +2128,6 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi } } } - - if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) { - postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber); - } lastUsedSolidityNum = latestSolidifiedBlockNumber; } @@ -2224,12 +2239,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified, } void postBlockTrigger(final BlockCapsule blockCapsule) { - // post block and logs for jsonrpc - if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { - postBlockFilter(blockCapsule, false); - postLogsFilter(blockCapsule, false, false); - } - // process block trigger long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java new file mode 100644 index 00000000000..40abae07946 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java @@ -0,0 +1,96 @@ +package org.tron.core.services.event; + +import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.exception.EventException; + +@Slf4j(topic = "event") +public class BlockEventCache { + @Getter + private static volatile long solidNum; + + @Getter + private static volatile BlockEvent head; + + @Getter + private static volatile BlockCapsule.BlockId solidId; + + private static Map blockEventMap = new ConcurrentHashMap<>(); + + private static Map> numMap = new ConcurrentHashMap<>(); + + public static BlockEvent getBlockEvent(BlockCapsule.BlockId blockId) { + return blockEventMap.get(blockId); + } + + public static void init(BlockCapsule.BlockId blockId) { + blockEventMap.clear(); + numMap.clear(); + solidNum = blockId.getNum(); + head = new BlockEvent(blockId); + solidId = blockId; + List list = new ArrayList<>(); + list.add(head); + numMap.put(blockId.getNum(), list); + blockEventMap.put(blockId, head); + } + + public static void add(BlockEvent blockEvent) throws EventException { + logger.info("Add block event, {}", blockEvent.getBlockId().getString(), + blockEvent.getParentId().getString()); + if (blockEventMap.get(blockEvent.getParentId()) == null) { + throw new EventException("unlink BlockEvent, " + + blockEvent.getBlockId().getString() + ", " + + blockEvent.getParentId().getString()); + } + + long num = blockEvent.getBlockId().getNum(); + List list = numMap.get(num); + if (list == null) { + list = new ArrayList<>(); + numMap.put(num, list); + } + list.add(blockEvent); + + blockEventMap.put(blockEvent.getBlockId(), blockEvent); + + if (num > head.getBlockId().getNum()) { + head = blockEvent; + } + + if (blockEvent.getSolidId().getNum() > solidId.getNum()) { + solidId = blockEvent.getSolidId(); + } + } + + public static void remove(BlockCapsule.BlockId solidId) { + logger.info("Remove solidId {}, solidNum {}, {}, {}", + solidId.getString(), solidNum, numMap.size(), blockEventMap.size()); + numMap.forEach((k, v) -> { + if (k < solidId.getNum()) { + v.forEach(value -> blockEventMap.remove(value.getBlockId())); + numMap.remove(k); + } + }); + solidNum = solidId.getNum(); + } + + public static List getSolidBlockEvents(BlockCapsule.BlockId solidId) { + List blockEvents = new ArrayList<>(); + BlockCapsule.BlockId tmp = solidId; + while (tmp.getNum() > solidNum) { + BlockEvent blockEvent = blockEventMap.get(tmp); + blockEvents.add(blockEvent); + tmp = blockEvent.getParentId(); + } + + return Lists.reverse(blockEvents); + } +} diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java new file mode 100644 index 00000000000..8ffc333eda4 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java @@ -0,0 +1,387 @@ +package org.tron.core.services.event; + +import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI; +import org.tron.common.crypto.Hash; +import org.tron.common.logsfilter.ContractEventParserAbi; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.RawData; +import org.tron.common.logsfilter.capsule.SolidityTriggerCapsule; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; +import org.tron.common.logsfilter.trigger.ContractEventTrigger; +import org.tron.common.logsfilter.trigger.ContractLogTrigger; +import org.tron.common.logsfilter.trigger.ContractTrigger; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.runtime.vm.LogInfo; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.StringUtil; +import org.tron.core.capsule.AbiCapsule; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.core.db.TransactionTrace; +import org.tron.core.exception.BadItemException; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.SmartContractTrigger; +import org.tron.core.store.StoreFactory; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; + +@Slf4j(topic = "event") +@Component +public class BlockEventGet { + + private EventPluginLoader instance = EventPluginLoader.getInstance(); + + @Autowired + private Manager manager; + + public BlockEvent getBlockEvent(long blockNum) throws Exception { + BlockCapsule block = manager.getChainBaseManager().getBlockByNum(blockNum); + long solidNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + BlockEvent blockEvent = new BlockEvent(); + blockEvent.setBlockId(block.getBlockId()); + blockEvent.setParentId(block.getParentBlockId()); + blockEvent.setSolidId(manager.getChainBaseManager().getBlockIdByNum(solidNum)); + blockEvent.setBlockTime(block.getTimeStamp()); + if (instance.isBlockLogTriggerEnable()) { + blockEvent.setBlockLogTriggerCapsule(getBlockLogTrigger(block, solidNum)); + } + + if (instance.isTransactionLogTriggerEnable()) { + blockEvent.setTransactionLogTriggerCapsules(getTransactionLogTrigger(block, solidNum)); + } + + if (instance.isContractLogTriggerEnable() + || instance.isContractEventTriggerEnable() + || instance.isSolidityLogTriggerEnable() + || instance.isSolidityEventTriggerEnable()) { + blockEvent.setSmartContractTrigger(getContractTrigger(block, solidNum)); + } + + if (instance.isSolidityTriggerEnable()) { + SolidityTriggerCapsule capsule = new SolidityTriggerCapsule(block.getNum()); + capsule.setTimeStamp(block.getTimeStamp()); + blockEvent.setSolidityTriggerCapsule(capsule); + } + + return blockEvent; + } + + public SmartContractTrigger getContractTrigger(BlockCapsule block, long solidNum) { + TransactionRetCapsule result; + try { + result = manager.getChainBaseManager().getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum())); + } catch (BadItemException e) { + throw new RuntimeException(e); + } + + SmartContractTrigger contractTrigger = new SmartContractTrigger(); + for (int i = 0; i < block.getTransactions().size(); i++) { + Protocol.Transaction tx = block.getInstance().getTransactions(i); + Protocol.TransactionInfo txInfo = result.getInstance().getTransactioninfo(i); + + List triggers = parseLogs(tx, txInfo); + for (ContractTrigger trigger : triggers) { + if (!EventPluginLoader.matchFilter(trigger)) { + continue; + } + ContractTrigger eventOrLog = processTrigger(trigger); + eventOrLog.setBlockHash(Hex.toHexString(block.getBlockId().getBytes())); + eventOrLog.setLatestSolidifiedBlockNumber(solidNum); + if (eventOrLog instanceof ContractEventTrigger) { + ContractEventTrigger event = (ContractEventTrigger) eventOrLog; + if (instance.isContractEventTriggerEnable() || instance.isSolidityEventTriggerEnable()) { + contractTrigger.getContractEventTriggers().add(event); + } + if ((instance.isContractLogTriggerEnable() + && instance.isContractLogTriggerRedundancy()) + || (instance.isSolidityLogTriggerEnable() + && instance.isSolidityLogTriggerRedundancy())) { + ContractLogTrigger logTrigger = new ContractLogTrigger(event); + logTrigger.setTopicList(trigger.getLogInfo().getHexTopics()); + logTrigger.setData(trigger.getLogInfo().getHexData()); + contractTrigger.getRedundancies().add(logTrigger); + } + } else if (eventOrLog instanceof ContractLogTrigger) { + ContractLogTrigger log = (ContractLogTrigger) eventOrLog; + if (instance.isContractLogTriggerEnable() || instance.isSolidityLogTriggerEnable()) { + contractTrigger.getContractLogTriggers().add(log); + } + } + } + } + + return contractTrigger; + } + + private List parseLogs(Protocol.Transaction tx, + Protocol.TransactionInfo txInfo) { + String originAddress = StringUtil + .encode58Check(TransactionCapsule.getOwner(tx.getRawData().getContract(0))); + + List logs = txInfo.getLogList(); + List list = new LinkedList<>(); + if (logs.isEmpty()) { + return list; + } + + Map addrMap = new HashMap<>(); + Map abiMap = new HashMap<>(); + + for (Protocol.TransactionInfo.Log log : logs) { + + byte[] contractAddress = TransactionTrace + .convertToTronAddress(log.getAddress().toByteArray()); + String strContractAddr = + ArrayUtils.isEmpty(contractAddress) ? "" : StringUtil.encode58Check(contractAddress); + if (addrMap.get(strContractAddr) != null) { + continue; + } + ContractCapsule contract = manager.getContractStore().get(contractAddress); + if (contract == null) { + // never + addrMap.put(strContractAddr, originAddress); + abiMap.put(strContractAddr, SmartContractOuterClass.SmartContract.ABI.getDefaultInstance()); + continue; + } + AbiCapsule abiCapsule = StoreFactory.getInstance().getChainBaseManager() + .getAbiStore().get(contractAddress); + SmartContractOuterClass.SmartContract.ABI abi; + if (abiCapsule == null || abiCapsule.getInstance() == null) { + abi = SmartContractOuterClass.SmartContract.ABI.getDefaultInstance(); + } else { + abi = abiCapsule.getInstance(); + } + String creatorAddr = StringUtil.encode58Check(TransactionTrace + .convertToTronAddress(contract.getInstance().getOriginAddress().toByteArray())); + addrMap.put(strContractAddr, creatorAddr); + abiMap.put(strContractAddr, abi); + } + + int index = 1; + for (Protocol.TransactionInfo.Log log : logs) { + + byte[] contractAddress = TransactionTrace + .convertToTronAddress(log.getAddress().toByteArray()); + String strContractAddress = + ArrayUtils.isEmpty(contractAddress) ? "" : StringUtil.encode58Check(contractAddress); + SmartContractOuterClass.SmartContract.ABI abi = abiMap.get(strContractAddress); + ContractTrigger event = new ContractTrigger(); + String creatorAddr = addrMap.get(strContractAddress); + String txId = Hex.toHexString(txInfo.getId().toByteArray()); + event.setUniqueId(txId + "_" + index); + event.setTransactionId(txId); + event.setContractAddress(strContractAddress); + event.setOriginAddress(originAddress); + event.setCallerAddress(""); + event.setCreatorAddress(StringUtils.isEmpty(creatorAddr) ? "" : creatorAddr); + event.setBlockNumber(txInfo.getBlockNumber()); + event.setTimeStamp(txInfo.getBlockTimeStamp()); + event.setLogInfo(buildLogInfo(log)); + event.setAbi(abi); + + list.add(event); + index++; + } + + return list; + } + + private LogInfo buildLogInfo(Protocol.TransactionInfo.Log log) { + List topics = Lists.newArrayList(); + log.getTopicsList().forEach(topic -> + topics.add(new DataWord(topic.toByteArray())) + ); + byte[] address = log.getAddress().toByteArray(); + byte[] data = log.getData().toByteArray(); + return new LogInfo(address, topics, data); + } + + private ContractTrigger processTrigger(ContractTrigger contractTrigger) { + ContractTrigger event; + boolean isEvent = false; + LogInfo logInfo = contractTrigger.getLogInfo(); + SmartContractOuterClass.SmartContract.ABI abi = contractTrigger.getAbi(); + List topics = logInfo.getTopics(); + + String eventSignature = ""; + String eventSignatureFull = "fallback()"; + String entryName = ""; + SmartContractOuterClass.SmartContract.ABI.Entry eventEntry = null; + + if (abi != null && abi.getEntrysCount() > 0 && topics != null && !topics.isEmpty() + && !ArrayUtils.isEmpty(topics.get(0).getData()) + && Args.getInstance().getStorage().isContractParseSwitch()) { + String logHash = topics.get(0).toString(); + + for (SmartContractOuterClass.SmartContract.ABI.Entry entry : abi.getEntrysList()) { + if (entry.getType() != SmartContractOuterClass.SmartContract.ABI.Entry.EntryType.Event + || entry.getAnonymous()) { + continue; + } + + String signature = entry.getName() + "("; + String signatureFull = entry.getName() + "("; + StringBuilder signBuilder = new StringBuilder(); + StringBuilder signFullBuilder = new StringBuilder(); + for (SmartContractOuterClass.SmartContract.ABI.Entry.Param param : entry.getInputsList()) { + if (signBuilder.length() > 0) { + signBuilder.append(","); + signFullBuilder.append(","); + } + String type = param.getType(); + String name = param.getName(); + signBuilder.append(type); + signFullBuilder.append(type); + if (org.pf4j.util.StringUtils.isNotNullOrEmpty(name)) { + signFullBuilder.append(" ").append(name); + } + } + signature += signBuilder + ")"; + signatureFull += signFullBuilder + ")"; + String sha3 = Hex.toHexString(Hash.sha3(signature.getBytes())); + if (sha3.equals(logHash)) { + eventSignature = signature; + eventSignatureFull = signatureFull; + entryName = entry.getName(); + eventEntry = entry; + isEvent = true; + break; + } + } + } + + if (isEvent) { + event = new ContractEventTrigger(); + ((ContractEventTrigger) event).setEventSignature(eventSignature); + ((ContractEventTrigger) event).setEventSignatureFull(eventSignatureFull); + ((ContractEventTrigger) event).setEventName(entryName); + + List topicList = logInfo.getClonedTopics(); + byte[] data = logInfo.getClonedData(); + + ((ContractEventTrigger) event) + .setTopicMap(ContractEventParserAbi.parseTopics(topicList, eventEntry)); + ((ContractEventTrigger) event) + .setDataMap(ContractEventParserAbi.parseEventData(data, topicList, eventEntry)); + } else { + event = new ContractLogTrigger(); + ((ContractLogTrigger) event).setTopicList(logInfo.getHexTopics()); + ((ContractLogTrigger) event).setData(logInfo.getHexData()); + } + + RawData rawData = new RawData(logInfo.getAddress(), logInfo.getTopics(), logInfo.getData()); + + event.setRawData(rawData); + + event.setLatestSolidifiedBlockNumber(contractTrigger.getLatestSolidifiedBlockNumber()); + event.setRemoved(contractTrigger.isRemoved()); + event.setUniqueId(contractTrigger.getUniqueId()); + event.setTransactionId(contractTrigger.getTransactionId()); + event.setContractAddress(contractTrigger.getContractAddress()); + event.setOriginAddress(contractTrigger.getOriginAddress()); + event.setCallerAddress(""); + event.setCreatorAddress(contractTrigger.getCreatorAddress()); + event.setBlockNumber(contractTrigger.getBlockNumber()); + event.setTimeStamp(contractTrigger.getTimeStamp()); + event.setBlockHash(contractTrigger.getBlockHash()); + + return event; + } + + public BlockLogTriggerCapsule getBlockLogTrigger(BlockCapsule block, long solidNum) { + BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(block); + blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(solidNum); + return blockLogTriggerCapsule; + } + + public List getTransactionLogTrigger(BlockCapsule block, + long solidNum) { + List transactionLogTriggerCapsules = new ArrayList<>(); + if (!EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { + for (TransactionCapsule t : block.getTransactions()) { + TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(t, block); + trx.setLatestSolidifiedBlockNumber(solidNum); + transactionLogTriggerCapsules.add(trx); + } + return transactionLogTriggerCapsules; + } + List transactionCapsuleList = block.getTransactions(); + GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI + .TransactionInfoList.newBuilder().build(); + GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI + .TransactionInfoList.newBuilder(); + try { + TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum())); + if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { + result.getInstance().getTransactioninfoList() + .forEach(transactionInfoListBuilder::addTransactionInfo); + transactionInfoList = transactionInfoListBuilder.build(); + } + } catch (BadItemException e) { + logger.error("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage()); + } + if (transactionCapsuleList.size() != transactionInfoList.getTransactionInfoCount()) { + logger.error("Get TransactionInfo size not eq, blockNum {}, {}, {}", + block.getNum(), transactionCapsuleList.size(), + transactionInfoList.getTransactionInfoCount()); + for (TransactionCapsule t : block.getTransactions()) { + TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(t, block); + trx.setLatestSolidifiedBlockNumber(solidNum); + transactionLogTriggerCapsules.add(trx); + } + return transactionLogTriggerCapsules; + } + long cumulativeEnergyUsed = 0; + long cumulativeLogCount = 0; + long energyUnitPrice = getEnergyPrice(block.getTimeStamp()); + for (int i = 0; i < transactionCapsuleList.size(); i++) { + Protocol.TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); + TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); + transactionCapsule.setBlockNum(block.getNum()); + TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(transactionCapsule, block, + i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); + trx.setLatestSolidifiedBlockNumber(solidNum); + cumulativeEnergyUsed += trx.getTransactionLogTrigger().getEnergyUsageTotal(); + cumulativeLogCount += transactionInfo.getLogCount(); + transactionLogTriggerCapsules.add(trx); + } + return transactionLogTriggerCapsules; + } + + public long getEnergyPrice(long blockTime) { + String energyPriceHistory = manager.getDynamicPropertiesStore().getEnergyPriceHistory(); + + String[] energyPrices = energyPriceHistory.split(","); + String[] lastPrice = energyPrices[energyPrices.length - 1].split(":"); + long energyPrice = Long.parseLong(lastPrice[1]); + + for (int i = 1; i < energyPrices.length; i++) { + long effectiveTime = Long.parseLong(energyPrices[i].split(":")[0]); + if (blockTime < effectiveTime) { + energyPrice = Long.parseLong(energyPrices[i - 1].split(":")[1]); + break; + } + } + return energyPrice; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java new file mode 100644 index 00000000000..1af9d768c19 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java @@ -0,0 +1,86 @@ +package org.tron.core.services.event; + +import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.tron.common.es.ExecutorServiceManager; +import org.tron.core.db.Manager; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.Event; + +@Service +@Slf4j(topic = "event") +public class BlockEventLoad { + + @Autowired + private Manager manager; + + @Autowired + private RealtimeEventService realtimeEventService; + + @Autowired + private BlockEventGet blockEventGet; + + private final ScheduledExecutorService executor = ExecutorServiceManager + .newSingleThreadScheduledExecutor("event-load"); + + public void init() { + executor.scheduleWithFixedDelay(() -> { + try { + load(); + } catch (Exception exception) { + close(); + logger.error("Spread thread error", exception); + } + }, 100, 100, TimeUnit.MILLISECONDS); + logger.info("Event load service start."); + } + + public void close() { + executor.shutdown(); + logger.info("Event load service close."); + } + + public void load() throws Exception { + long cacheHeadNum = BlockEventCache.getHead().getBlockId().getNum(); + long tmpNum = manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); + if (cacheHeadNum >= tmpNum) { + return; + } + synchronized (manager) { + tmpNum = manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); + if (cacheHeadNum >= tmpNum) { + return; + } + List l1 = new ArrayList<>(); + List l2 = new ArrayList<>(); + BlockEvent tmp = BlockEventCache.getHead(); + + BlockEvent blockEvent = blockEventGet.getBlockEvent(tmpNum); + l1.add(blockEvent); + while (!blockEvent.getParentId().equals(tmp.getBlockId())) { + tmpNum--; + if (tmpNum == tmp.getBlockId().getNum()) { + l2.add(tmp); + tmp = BlockEventCache.getBlockEvent(tmp.getParentId()); + } + blockEvent = blockEventGet.getBlockEvent(tmpNum); + l1.add(blockEvent); + } + + l2.forEach(e -> realtimeEventService.add(new Event(e, true))); + + List l = Lists.reverse(l1); + for (BlockEvent e: l) { + BlockEventCache.add(e); + realtimeEventService.add(new Event(e, false)); + } + } + } + +} diff --git a/framework/src/main/java/org/tron/core/services/event/EventService.java b/framework/src/main/java/org/tron/core/services/event/EventService.java new file mode 100644 index 00000000000..b2e01ab3a9d --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/EventService.java @@ -0,0 +1,61 @@ +package org.tron.core.services.event; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.core.db.Manager; + +@Slf4j(topic = "event") +@Component +public class EventService { + @Autowired + private RealtimeEventService realtimeEventService; + + @Autowired + private BlockEventLoad blockEventLoad; + + @Autowired + private HistoryEventService historyEventService; + + @Autowired + private Manager manager; + + public void init() { + logger.info("Start to load eventPlugin. {}, {}, {} " + + "block: {}, {} trx: {}, {}, {} event: {}, {} log: {}, {}, {}, {} solid: {}", + manager.isEventPluginLoaded(), + + EventPluginLoader.getInstance().getVersion(), + EventPluginLoader.getInstance().getStartSyncBlockNum(), + + EventPluginLoader.getInstance().isBlockLogTriggerEnable(), + EventPluginLoader.getInstance().isBlockLogTriggerSolidified(), + + EventPluginLoader.getInstance().isTransactionLogTriggerEnable(), + EventPluginLoader.getInstance().isTransactionLogTriggerSolidified(), + EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible(), + + EventPluginLoader.getInstance().isContractEventTriggerEnable(), + EventPluginLoader.getInstance().isSolidityEventTriggerEnable(), + + EventPluginLoader.getInstance().isContractLogTriggerEnable(), + EventPluginLoader.getInstance().isContractLogTriggerRedundancy(), + EventPluginLoader.getInstance().isSolidityLogTriggerEnable(), + EventPluginLoader.getInstance().isSolidityLogTriggerRedundancy(), + + EventPluginLoader.getInstance().isSolidityTriggerEnable()); + + if (!manager.isEventPluginLoaded() || EventPluginLoader.getInstance().getVersion() != 1) { + return; + } + + historyEventService.init(); + } + + public void close() { + realtimeEventService.close(); + blockEventLoad.close(); + historyEventService.close(); + } +} diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java new file mode 100644 index 00000000000..0f26490d16b --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -0,0 +1,76 @@ +package org.tron.core.services.event; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.bo.BlockEvent; + +@Slf4j(topic = "event") +@Component +public class HistoryEventService { + + private EventPluginLoader instance = EventPluginLoader.getInstance(); + + @Autowired + private BlockEventGet blockEventGet; + + @Autowired + private SolidEventService solidEventService; + + @Autowired + private RealtimeEventService realtimeEventService; + + @Autowired + private BlockEventLoad blockEventLoad; + + @Autowired + private Manager manager; + + private volatile boolean isRunning; + + public void init() { + if (instance.getStartSyncBlockNum() <= 0) { + initEventService(manager.getChainBaseManager().getHeadBlockId()); + return; + } + + isRunning = true; + + new Thread(() -> syncEvent()).start(); + + logger.info("History event service start."); + } + + public void close() { + isRunning = false; + } + + private void syncEvent() { + try { + long tmp = instance.getStartSyncBlockNum(); + long endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + while (tmp <= endNum && isRunning) { + BlockEvent blockEvent = blockEventGet.getBlockEvent(tmp); + realtimeEventService.flush(blockEvent, false); + solidEventService.flush(blockEvent); + tmp++; + endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + Thread.sleep(30); + } + initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum)); + } catch (Exception e) { + logger.error("Sync event failed.", e); + } + } + + private void initEventService(BlockCapsule.BlockId blockId) { + logger.info("Init event service, {}", blockId.getString()); + BlockEventCache.init(blockId); + realtimeEventService.init(); + blockEventLoad.init(); + solidEventService.init(); + } +} diff --git a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java new file mode 100644 index 00000000000..8375b2fd114 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java @@ -0,0 +1,120 @@ +package org.tron.core.services.event; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.trigger.Trigger; +import org.tron.core.db.Manager; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.Event; + +@Slf4j(topic = "event") +@Component +public class RealtimeEventService { + + private EventPluginLoader instance = EventPluginLoader.getInstance(); + + @Autowired + private Manager manager; + + @Autowired + private SolidEventService solidEventService; + + private static BlockingQueue queue = new LinkedBlockingQueue<>(); + + private int maxEventSize = 10000; + + private final ScheduledExecutorService executor = ExecutorServiceManager + .newSingleThreadScheduledExecutor("realtime-event"); + + public void init() { + executor.scheduleWithFixedDelay(() -> { + try { + work(); + } catch (Exception e) { + logger.info("Real-time event service fail. {}", e); + } + }, 1, 1, TimeUnit.SECONDS); + logger.info("Realtime event service start."); + } + + public void close() { + executor.shutdown(); + logger.info("Realtime event service close."); + } + + public void add(Event event) { + if (queue.size() >= maxEventSize) { + logger.warn("Add event failed, blockId {}.", event.getBlockEvent().getBlockId().getString()); + return; + } + queue.offer(event); + } + + public void work() { + while (queue.size() > 0) { + Event event = queue.poll(); + flush(event.getBlockEvent(), event.isRemove()); + } + } + + public void flush(BlockEvent blockEvent, boolean isRemove) { + logger.info("Flush realtime event {}", blockEvent.getBlockId().getString()); + + if (instance.isBlockLogTriggerEnable() + && !instance.isBlockLogTriggerSolidified() + && !isRemove) { + if (blockEvent.getBlockLogTriggerCapsule() == null) { + logger.warn("BlockLogTriggerCapsule is null. {}", blockEvent.getBlockId().getString()); + } else { + manager.getTriggerCapsuleQueue().offer(blockEvent.getBlockLogTriggerCapsule()); + } + } + + if (instance.isTransactionLogTriggerEnable() + && !instance.isTransactionLogTriggerSolidified() + && !isRemove) { + if (blockEvent.getTransactionLogTriggerCapsules() == null) { + logger.info("TransactionLogTriggerCapsules is null. {}", + blockEvent.getBlockId().getString()); + } else { + blockEvent.getTransactionLogTriggerCapsules().forEach(v -> + manager.getTriggerCapsuleQueue().offer(v)); + } + } + + if (instance.isContractEventTriggerEnable()) { + if (blockEvent.getSmartContractTrigger() == null) { + logger.info("SmartContractTrigger is null. {}", blockEvent.getBlockId().getString()); + } else { + blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { + v.setTriggerName(Trigger.CONTRACTEVENT_TRIGGER_NAME); + v.setRemoved(isRemove); + EventPluginLoader.getInstance().postContractEventTrigger(v); + }); + } + } + + if (instance.isContractLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { + blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { + v.setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); + v.setRemoved(isRemove); + EventPluginLoader.getInstance().postContractLogTrigger(v); + }); + if (instance.isContractLogTriggerRedundancy()) { + blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + v.setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); + v.setRemoved(isRemove); + EventPluginLoader.getInstance().postContractLogTrigger(v); + }); + } + } + } + +} diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java new file mode 100644 index 00000000000..5bf83ea0da9 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -0,0 +1,110 @@ +package org.tron.core.services.event; + +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.trigger.Trigger; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.bo.BlockEvent; + +@Slf4j(topic = "event") +@Component +public class SolidEventService { + + private EventPluginLoader instance = EventPluginLoader.getInstance(); + + @Autowired + private Manager manager; + + private final ScheduledExecutorService executor = ExecutorServiceManager + .newSingleThreadScheduledExecutor("solid-event"); + + public void init() { + executor.scheduleWithFixedDelay(() -> { + try { + work(); + } catch (Exception exception) { + logger.error("Spread thread error", exception); + } + }, 1, 1, TimeUnit.SECONDS); + logger.info("Solid event service start."); + } + + public void close() { + executor.shutdown(); + logger.info("Solid event service close."); + } + + public void work() { + BlockCapsule.BlockId solidId = BlockEventCache.getSolidId(); + if (solidId.getNum() <= BlockEventCache.getSolidNum()) { + return; + } + + List blockEvents = BlockEventCache.getSolidBlockEvents(solidId); + + blockEvents.forEach(v -> flush(v)); + + BlockEventCache.remove(solidId); + } + + public void flush(BlockEvent blockEvent) { + logger.info("Flush solid event {}", blockEvent.getBlockId().getString()); + + if (instance.isBlockLogTriggerEnable() && instance.isBlockLogTriggerSolidified()) { + if (blockEvent.getBlockLogTriggerCapsule() == null) { + logger.warn("BlockLogTrigger is null. {}", blockEvent.getBlockId()); + } else { + manager.getTriggerCapsuleQueue().offer(blockEvent.getBlockLogTriggerCapsule()); + } + } + + if (instance.isTransactionLogTriggerEnable() && instance.isTransactionLogTriggerSolidified()) { + if (blockEvent.getTransactionLogTriggerCapsules() == null) { + logger.info("TransactionLogTrigger is null. {}", blockEvent.getBlockId()); + } else { + blockEvent.getTransactionLogTriggerCapsules().forEach(v -> + manager.getTriggerCapsuleQueue().offer(v)); + } + } + + if (instance.isSolidityEventTriggerEnable()) { + if (blockEvent.getSmartContractTrigger() == null) { + logger.info("SmartContractTrigger is null. {}", blockEvent.getBlockId()); + } else { + blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { + v.setTriggerName(Trigger.SOLIDITYEVENT_TRIGGER_NAME); + EventPluginLoader.getInstance().postSolidityEventTrigger(v); + }); + } + } + + if (instance.isSolidityLogTriggerEnable() && blockEvent.getSmartContractTrigger() != null) { + blockEvent.getSmartContractTrigger().getContractLogTriggers().forEach(v -> { + v.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); + EventPluginLoader.getInstance().postSolidityLogTrigger(v); + }); + if (instance.isSolidityLogTriggerRedundancy()) { + blockEvent.getSmartContractTrigger().getRedundancies().forEach(v -> { + v.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); + EventPluginLoader.getInstance().postSolidityLogTrigger(v); + }); + } + } + + if (instance.isSolidityTriggerEnable()) { + if (blockEvent.getSolidityTriggerCapsule() == null) { + logger.info("SolidityTrigger is null. {}", blockEvent.getBlockId()); + } else { + manager.getTriggerCapsuleQueue().offer(blockEvent.getSolidityTriggerCapsule()); + } + } + } + +} diff --git a/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java b/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java new file mode 100644 index 00000000000..9e314bc7d5a --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java @@ -0,0 +1,28 @@ +package org.tron.core.services.event.bo; + +import java.util.List; +import lombok.Data; +import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.SolidityTriggerCapsule; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; +import org.tron.core.capsule.BlockCapsule; + +@Data +public class BlockEvent { + private BlockCapsule.BlockId blockId; + private BlockCapsule.BlockId parentId; + private BlockCapsule.BlockId solidId; + private long blockTime; + + private BlockLogTriggerCapsule blockLogTriggerCapsule; + private List transactionLogTriggerCapsules; + private SolidityTriggerCapsule solidityTriggerCapsule; + private SmartContractTrigger smartContractTrigger; + + public BlockEvent() {} + + public BlockEvent(BlockCapsule.BlockId blockId) { + this.blockId = blockId; + } +} + diff --git a/framework/src/main/java/org/tron/core/services/event/bo/Event.java b/framework/src/main/java/org/tron/core/services/event/bo/Event.java new file mode 100644 index 00000000000..142e1be3c22 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/bo/Event.java @@ -0,0 +1,14 @@ +package org.tron.core.services.event.bo; + +import lombok.Data; + +@Data +public class Event { + private boolean isRemove; + private BlockEvent blockEvent; + + public Event(BlockEvent blockEvent, boolean isRemove) { + this.blockEvent = blockEvent; + this.isRemove = isRemove; + } +} diff --git a/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java b/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java new file mode 100644 index 00000000000..7413c309169 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java @@ -0,0 +1,14 @@ +package org.tron.core.services.event.bo; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; +import org.tron.common.logsfilter.trigger.ContractEventTrigger; +import org.tron.common.logsfilter.trigger.ContractLogTrigger; + +@Data +public class SmartContractTrigger { + private List contractLogTriggers = new ArrayList<>(); + private List contractEventTriggers = new ArrayList<>(); + private List redundancies = new ArrayList<>(); +} diff --git a/framework/src/main/java/org/tron/core/services/event/exception/EventException.java b/framework/src/main/java/org/tron/core/services/event/exception/EventException.java new file mode 100644 index 00000000000..09df1d832f4 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/event/exception/EventException.java @@ -0,0 +1,7 @@ +package org.tron.core.services.event.exception; + +public class EventException extends Exception { + public EventException(String errMsg) { + super(errMsg); + } +} diff --git a/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java b/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java new file mode 100644 index 00000000000..a23c4b5c9c8 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java @@ -0,0 +1,90 @@ +package org.tron.core.event; + +import java.util.List; +import java.util.Random; +import org.junit.Assert; +import org.junit.Test; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.services.event.BlockEventCache; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.exception.EventException; + +public class BlockEventCacheTest { + + @Test + public void test() throws Exception { + BlockEvent be1 = new BlockEvent(); + BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(getBlockId(), 1); + be1.setBlockId(b1); + be1.setParentId(b1); + try { + BlockEventCache.add(be1); + Assert.fail(); + } catch (Exception e) { + Assert.assertTrue(e instanceof EventException); + } + + BlockEventCache.init(new BlockCapsule.BlockId(getBlockId(), 100)); + + try { + BlockEventCache.add(be1); + Assert.fail(); + } catch (Exception e) { + Assert.assertTrue(e instanceof EventException); + } + + BlockEventCache.init(b1); + + BlockEvent be2 = new BlockEvent(); + BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(getBlockId(), 2); + be2.setBlockId(b2); + be2.setParentId(b1); + be2.setSolidId(b1); + BlockEventCache.add(be2); + Assert.assertEquals(be2, BlockEventCache.getHead()); + Assert.assertEquals(be2, BlockEventCache.getBlockEvent(b2)); + + BlockEvent be22 = new BlockEvent(); + BlockCapsule.BlockId b22 = new BlockCapsule.BlockId(getBlockId(), 2); + be22.setBlockId(b22); + be22.setParentId(b1); + be22.setSolidId(b22); + BlockEventCache.add(be22); + Assert.assertEquals(be2, BlockEventCache.getHead()); + Assert.assertEquals(be22, BlockEventCache.getBlockEvent(b22)); + Assert.assertEquals(b22, BlockEventCache.getSolidId()); + + BlockEvent be3 = new BlockEvent(); + BlockCapsule.BlockId b3 = new BlockCapsule.BlockId(getBlockId(), 3); + be3.setBlockId(b3); + be3.setParentId(b22); + be3.setSolidId(b22); + BlockEventCache.add(be3); + Assert.assertEquals(be3, BlockEventCache.getHead()); + + List list = BlockEventCache.getSolidBlockEvents(b2); + Assert.assertEquals(1, list.size()); + list = BlockEventCache.getSolidBlockEvents(b22); + Assert.assertEquals(1, list.size()); + + list = BlockEventCache.getSolidBlockEvents(b3); + Assert.assertEquals(2, list.size()); + + BlockEventCache.remove(b22); + Assert.assertEquals(2, BlockEventCache.getSolidNum()); + + list = BlockEventCache.getSolidBlockEvents(b2); + Assert.assertEquals(0, list.size()); + list = BlockEventCache.getSolidBlockEvents(b22); + Assert.assertEquals(0, list.size()); + + list = BlockEventCache.getSolidBlockEvents(b3); + Assert.assertEquals(1, list.size()); + } + + public static byte[] getBlockId() { + byte[] id = new byte[32]; + new Random().nextBytes(id); + return id; + } +} diff --git a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java new file mode 100644 index 00000000000..db959d9a0fd --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java @@ -0,0 +1,185 @@ +package org.tron.core.event; + +import com.google.protobuf.ByteString; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.logsfilter.EventPluginConfig; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.TriggerConfig; +import org.tron.common.runtime.TvmTestUtils; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.PublicMethod; +import org.tron.core.ChainBaseManager; +import org.tron.core.Constant; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.WitnessCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.consensus.ConsensusService; +import org.tron.core.db.BlockGenerate; +import org.tron.core.db.Manager; +import org.tron.core.net.TronNetDelegate; +import org.tron.core.services.event.BlockEventGet; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.protos.Protocol; + +@Slf4j +public class BlockEventGetTest extends BlockGenerate { + + @ClassRule + public static final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + static ChainBaseManager chainManager; + + private final String key = PublicMethod.getRandomPrivateKey(); + private final byte[] privateKey = ByteArray.fromHexString(key); + private final byte[] address = PublicMethod.getAddressByteByPrivateKey(key); + + private final AtomicInteger port = new AtomicInteger(0); + protected String dbPath; + protected Manager dbManager; + long currentHeader = -1; + private TronNetDelegate tronNetDelegate; + private TronApplicationContext context; + + + static LocalDateTime localDateTime = LocalDateTime.now(); + private long time = ZonedDateTime.of(localDateTime, + ZoneId.systemDefault()).toInstant().toEpochMilli(); + + protected void initDbPath() throws IOException { + dbPath = temporaryFolder.newFolder().toString(); + } + + @Before + public void before() throws IOException { + initDbPath(); + logger.info("Full node running."); + Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); + Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); + + context = new TronApplicationContext(DefaultConfig.class); + + dbManager = context.getBean(Manager.class); + setManager(dbManager); + + context.getBean(ConsensusService.class).start(); + chainManager = dbManager.getChainBaseManager(); + tronNetDelegate = context.getBean(TronNetDelegate.class); + tronNetDelegate.setExit(false); + currentHeader = dbManager.getDynamicPropertiesStore() + .getLatestBlockHeaderNumberFromDB(); + + ByteString addressBS = ByteString.copyFrom(address); + WitnessCapsule witnessCapsule = new WitnessCapsule(addressBS); + chainManager.getWitnessStore().put(address, witnessCapsule); + chainManager.addWitness(addressBS); + + AccountCapsule accountCapsule = new AccountCapsule(Protocol.Account.newBuilder() + .setAddress(addressBS).setBalance((long) 1e10).build()); + chainManager.getAccountStore().put(address, accountCapsule); + + DynamicPropertiesStore dps = dbManager.getDynamicPropertiesStore(); + dps.saveAllowTvmTransferTrc10(1); + dps.saveAllowTvmConstantinople(1); + dps.saveAllowTvmShangHai(1); + } + + @After + public void after() throws IOException { + } + + @Test + public void test() throws Exception { + BlockEventGet blockEventGet = context.getBean(BlockEventGet.class); + Manager manager = context.getBean(Manager.class); + + WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address)); + ChainBaseManager.getChainBaseManager() + .getWitnessScheduleStore().saveActiveWitnesses(new ArrayList<>()); + ChainBaseManager.getChainBaseManager().addWitness(ByteString.copyFrom(address)); + + String code = "608060405234801561000f575f80fd5b50d3801561001b575f80fd5b50d28015610027575f" + + "80fd5b503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffff" + + "ffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3" + + "ef6402540be40060405161008a91906100e2565b60405180910390a36100fb565b5f81905091905056" + + "5b5f819050919050565b5f819050919050565b5f6100cc6100c76100c284610097565b6100a9565b61" + + "00a0565b9050919050565b6100dc816100b2565b82525050565b5f6020820190506100f55f83018461" + + "00d3565b92915050565b603e806101075f395ff3fe60806040525f80fdfea26474726f6e582212200c" + + "57c973388f044038eff0e6474425b38037e75e66d6b3047647290605449c7764736f6c63430008140033"; + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + "TestTRC20", address, "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\"" + + ":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"}" + + ",{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\"," + + "\"type\":\"event\"}]", code, 0, (long) 1e9, 100, null, 1); + trx = trx.toBuilder().addRet( + Protocol.Transaction.Result.newBuilder() + .setContractRetValue(Protocol.Transaction.Result.contractResult.SUCCESS_VALUE) + .build()).build(); + + Protocol.Block block = getSignedBlock(witnessCapsule.getAddress(), time, privateKey); + BlockCapsule blockCapsule = new BlockCapsule(block.toBuilder().addTransactions(trx).build()); + blockCapsule.generatedByMyself = true; + blockCapsule.getTransactions().forEach(txCap -> { + txCap.setVerified(true); + chainManager.setBlockReference(txCap); + txCap.setExpiration(3000); + }); + manager.pushBlock(blockCapsule); + + EventPluginConfig config = new EventPluginConfig(); + config.setSendQueueLength(1000); + config.setBindPort(5555); + config.setUseNativeQueue(true); + config.setTriggerConfigList(new ArrayList<>()); + + TriggerConfig blockTriggerConfig = new TriggerConfig(); + blockTriggerConfig.setTriggerName("block"); + blockTriggerConfig.setEnabled(true); + config.getTriggerConfigList().add(blockTriggerConfig); + + TriggerConfig txTriggerConfig = new TriggerConfig(); + txTriggerConfig.setTriggerName("transaction"); + txTriggerConfig.setEnabled(true); + txTriggerConfig.setEthCompatible(true); + config.getTriggerConfigList().add(txTriggerConfig); + + TriggerConfig solidityTriggerConfig = new TriggerConfig(); + solidityTriggerConfig.setTriggerName("solidity"); + solidityTriggerConfig.setEnabled(true); + config.getTriggerConfigList().add(solidityTriggerConfig); + + TriggerConfig contracteventTriggerConfig = new TriggerConfig(); + contracteventTriggerConfig.setTriggerName("contractevent"); + contracteventTriggerConfig.setEnabled(true); + config.getTriggerConfigList().add(contracteventTriggerConfig); + + TriggerConfig contractlogTriggerConfig = new TriggerConfig(); + contractlogTriggerConfig.setTriggerName("contractlog"); + contractlogTriggerConfig.setEnabled(true); + contractlogTriggerConfig.setRedundancy(true); + config.getTriggerConfigList().add(contractlogTriggerConfig); + + EventPluginLoader.getInstance().start(config); + try { + BlockEvent blockEvent = blockEventGet.getBlockEvent(1); + Assert.assertNotNull(blockEvent); + } catch (Exception e) { + Assert.fail(); + } + } +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/event/BlockEventLoadTest.java b/framework/src/test/java/org/tron/core/event/BlockEventLoadTest.java new file mode 100644 index 00000000000..991133fee78 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/BlockEventLoadTest.java @@ -0,0 +1,124 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.concurrent.BlockingQueue; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventCache; +import org.tron.core.services.event.BlockEventGet; +import org.tron.core.services.event.BlockEventLoad; +import org.tron.core.services.event.RealtimeEventService; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.Event; +import org.tron.core.store.DynamicPropertiesStore; + +public class BlockEventLoadTest { + BlockEventLoad blockEventLoad = new BlockEventLoad(); + + @Test + public void test() throws Exception { + Method method = blockEventLoad.getClass().getDeclaredMethod("load"); + method.setAccessible(true); + + RealtimeEventService realtimeEventService = new RealtimeEventService(); + Field field = realtimeEventService.getClass().getDeclaredField("queue"); + field.setAccessible(true); + BlockingQueue queue = (BlockingQueue)field.get(BlockingQueue.class); + + BlockEventGet blockEventGet = mock(BlockEventGet.class); + Manager manager = mock(Manager.class); + ReflectUtils.setFieldValue(blockEventLoad, "realtimeEventService", realtimeEventService); + ReflectUtils.setFieldValue(blockEventLoad, "blockEventGet", blockEventGet); + ReflectUtils.setFieldValue(blockEventLoad, "manager", manager); + + DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class); + ChainBaseManager chainBaseManager = mock(ChainBaseManager.class); + Mockito.when(manager.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore); + Mockito.when(manager.getChainBaseManager()).thenReturn(chainBaseManager); + + BlockCapsule.BlockId b0 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 0); + BlockEventCache.init(b0); + + /********** 1 ***********/ + Mockito.when(dynamicPropertiesStore.getLatestBlockHeaderNumber()).thenReturn(0L); + method.invoke(blockEventLoad); + Assert.assertEquals(0, queue.size()); + + /********** 2 ***********/ + BlockEvent be1 = new BlockEvent(); + BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); + be1.setBlockId(b1); + be1.setParentId(b0); + be1.setSolidId(b0); + + Mockito.when(dynamicPropertiesStore.getLatestBlockHeaderNumber()).thenReturn(1L); + Mockito.when(blockEventGet.getBlockEvent(1L)).thenReturn(be1); + method.invoke(blockEventLoad); + Assert.assertEquals(1, queue.size()); + Assert.assertEquals(b1, BlockEventCache.getHead().getBlockId()); + + /********** 3 ***********/ + BlockEventCache.init(b0); + queue.clear(); + + BlockEvent be2 = new BlockEvent(); + BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2L); + be2.setBlockId(b2); + be2.setParentId(b1); + be2.setSolidId(b0); + + Mockito.when(dynamicPropertiesStore.getLatestBlockHeaderNumber()).thenReturn(2L); + Mockito.when(blockEventGet.getBlockEvent(2L)).thenReturn(be2); + method.invoke(blockEventLoad); + Assert.assertEquals(2, queue.size()); + Assert.assertEquals(b2, BlockEventCache.getHead().getBlockId()); + + /********** 4 ***********/ + BlockEventCache.init(b0); + queue.clear(); + + Mockito.when(dynamicPropertiesStore.getLatestBlockHeaderNumber()).thenReturn(1L); + method.invoke(blockEventLoad); + Assert.assertEquals(1, queue.size()); + queue.clear(); + + BlockEvent be21 = new BlockEvent(); + BlockCapsule.BlockId b21 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1L); + be21.setBlockId(b21); + be21.setParentId(b0); + be21.setSolidId(b0); + + BlockEvent be22 = new BlockEvent(); + BlockCapsule.BlockId b22 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2L); + be22.setBlockId(b22); + be22.setParentId(b21); + be22.setSolidId(b21); + + Mockito.when(dynamicPropertiesStore.getLatestBlockHeaderNumber()).thenReturn(2L); + Mockito.when(blockEventGet.getBlockEvent(1L)).thenReturn(be21); + Mockito.when(blockEventGet.getBlockEvent(2L)).thenReturn(be22); + method.invoke(blockEventLoad); + Assert.assertEquals(3, queue.size()); + Assert.assertEquals(b22, BlockEventCache.getHead().getBlockId()); + + Event event = queue.poll(); + Assert.assertEquals(b1, event.getBlockEvent().getBlockId()); + Assert.assertEquals(true, event.isRemove()); + + event = queue.poll(); + Assert.assertEquals(b21, event.getBlockEvent().getBlockId()); + Assert.assertEquals(false, event.isRemove()); + + event = queue.poll(); + Assert.assertEquals(b22, event.getBlockEvent().getBlockId()); + Assert.assertEquals(false, event.isRemove()); + } +} diff --git a/framework/src/test/java/org/tron/core/event/EventServiceTest.java b/framework/src/test/java/org/tron/core/event/EventServiceTest.java new file mode 100644 index 00000000000..b20e33404fd --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/EventServiceTest.java @@ -0,0 +1,34 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventLoad; +import org.tron.core.services.event.EventService; +import org.tron.core.services.event.HistoryEventService; +import org.tron.core.services.event.RealtimeEventService; + +public class EventServiceTest { + + @Test + public void test() { + EventService eventService = new EventService(); + HistoryEventService historyEventService = new HistoryEventService(); + RealtimeEventService realtimeEventService = new RealtimeEventService(); + BlockEventLoad blockEventLoad = new BlockEventLoad(); + + ReflectUtils.setFieldValue(eventService, "historyEventService", historyEventService); + ReflectUtils.setFieldValue(eventService, "realtimeEventService", realtimeEventService); + ReflectUtils.setFieldValue(eventService, "blockEventLoad", blockEventLoad); + + Manager manager = mock(Manager.class); + ReflectUtils.setFieldValue(eventService, "manager", manager); + Mockito.when(manager.isEventPluginLoaded()).thenReturn(true); + + eventService.init(); + eventService.close(); + } +} diff --git a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java new file mode 100644 index 00000000000..f51d2dbe490 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java @@ -0,0 +1,85 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import java.lang.reflect.Method; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.utils.ReflectUtils; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventGet; +import org.tron.core.services.event.BlockEventLoad; +import org.tron.core.services.event.HistoryEventService; +import org.tron.core.services.event.RealtimeEventService; +import org.tron.core.services.event.SolidEventService; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.store.DynamicPropertiesStore; + +public class HistoryEventServiceTest { + + HistoryEventService historyEventService = new HistoryEventService(); + + @Test + public void test() throws Exception { + EventPluginLoader instance = mock(EventPluginLoader.class); + ReflectUtils.setFieldValue(historyEventService, "instance", instance); + + DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class); + ChainBaseManager chainBaseManager = mock(ChainBaseManager.class); + Manager manager = mock(Manager.class); + ReflectUtils.setFieldValue(historyEventService, "manager", manager); + Mockito.when(manager.getChainBaseManager()).thenReturn(chainBaseManager); + Mockito.when(manager.getDynamicPropertiesStore()).thenReturn(dynamicPropertiesStore); + Mockito.when(chainBaseManager.getHeadBlockId()).thenReturn(new BlockCapsule.BlockId()); + + SolidEventService solidEventService = new SolidEventService(); + RealtimeEventService realtimeEventService = new RealtimeEventService(); + BlockEventLoad blockEventLoad = new BlockEventLoad(); + + ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService); + ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService); + ReflectUtils.setFieldValue(historyEventService, "blockEventLoad", blockEventLoad); + historyEventService.init(); + solidEventService.close(); + realtimeEventService.close(); + blockEventLoad.close(); + + solidEventService = mock(SolidEventService.class); + ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService); + realtimeEventService = mock(RealtimeEventService.class); + ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService); + blockEventLoad = mock(BlockEventLoad.class); + ReflectUtils.setFieldValue(historyEventService, "blockEventLoad", blockEventLoad); + + Mockito.when(instance.getStartSyncBlockNum()).thenReturn(0L); + + Mockito.when(dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(0L); + Mockito.when(chainBaseManager.getBlockIdByNum(0L)) + .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 0)); + historyEventService.init(); + + BlockEvent be2 = new BlockEvent(); + BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2); + be2.setBlockId(b2); + + BlockEventGet blockEventGet = mock(BlockEventGet.class); + ReflectUtils.setFieldValue(historyEventService, "blockEventGet", blockEventGet); + Mockito.when(blockEventGet.getBlockEvent(1)).thenReturn(be2); + + Mockito.when(instance.getStartSyncBlockNum()).thenReturn(1L); + ReflectUtils.setFieldValue(historyEventService, "isRunning", true); + Mockito.when(dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(1L); + + Mockito.when(chainBaseManager.getBlockIdByNum(1L)) + .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1)); + + Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent"); + method1.setAccessible(true); + method1.invoke(historyEventService); + + } +} diff --git a/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java b/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java new file mode 100644 index 00000000000..91dcea71322 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/RealtimeEventServiceTest.java @@ -0,0 +1,118 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import com.google.protobuf.ByteString; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import org.eclipse.jetty.util.BlockingArrayQueue; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.TriggerCapsule; +import org.tron.common.logsfilter.trigger.ContractEventTrigger; +import org.tron.common.logsfilter.trigger.ContractLogTrigger; +import org.tron.common.utils.ReflectUtils; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventCache; +import org.tron.core.services.event.RealtimeEventService; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.Event; +import org.tron.core.services.event.bo.SmartContractTrigger; + +public class RealtimeEventServiceTest { + + RealtimeEventService realtimeEventService = new RealtimeEventService(); + + @Test + public void test() throws Exception { + BlockEvent be1 = new BlockEvent(); + BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); + be1.setBlockId(b1); + be1.setParentId(b1); + be1.setSolidId(b1); + BlockEventCache.init(b1); + + BlockEvent be2 = new BlockEvent(); + BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2); + be2.setBlockId(b2); + be2.setParentId(b1); + be2.setSolidId(b1); + BlockEventCache.add(be2); + Assert.assertEquals(be2, BlockEventCache.getHead()); + Assert.assertEquals(be2, BlockEventCache.getBlockEvent(b2)); + + Event event = new Event(be2, true); + + realtimeEventService.add(event); + realtimeEventService.work(); + + EventPluginLoader instance = mock(EventPluginLoader.class); + ReflectUtils.setFieldValue(realtimeEventService, "instance", instance); + + BlockingQueue queue = new BlockingArrayQueue<>(); + Manager manager = mock(Manager.class); + Mockito.when(manager.getTriggerCapsuleQueue()).thenReturn(queue); + ReflectUtils.setFieldValue(realtimeEventService, "manager", manager); + + BlockCapsule blockCapsule = new BlockCapsule(0L, Sha256Hash.ZERO_HASH, 0L, + ByteString.copyFrom(BlockEventCacheTest.getBlockId())); + be2.setBlockLogTriggerCapsule(new BlockLogTriggerCapsule(blockCapsule)); + Mockito.when(instance.isBlockLogTriggerEnable()).thenReturn(true); + Mockito.when(instance.isBlockLogTriggerSolidified()).thenReturn(false); + + realtimeEventService.add(event); + realtimeEventService.work(); + + Assert.assertEquals(0, queue.size()); + + event = new Event(be2, false); + realtimeEventService.add(event); + realtimeEventService.work(); + + Assert.assertEquals(1, queue.size()); + + be2.setBlockLogTriggerCapsule(null); + queue.poll(); + + List list = new ArrayList<>(); + list.add(mock(TransactionLogTriggerCapsule.class)); + be2.setTransactionLogTriggerCapsules(list); + + Mockito.when(instance.isTransactionLogTriggerEnable()).thenReturn(true); + Mockito.when(instance.isTransactionLogTriggerSolidified()).thenReturn(false); + realtimeEventService.flush(be2, event.isRemove()); + Assert.assertEquals(1, queue.size()); + + be2.setTransactionLogTriggerCapsules(null); + + SmartContractTrigger contractTrigger = new SmartContractTrigger(); + be2.setSmartContractTrigger(contractTrigger); + + contractTrigger.getContractEventTriggers().add(mock(ContractEventTrigger.class)); + Mockito.when(instance.isContractLogTriggerEnable()).thenReturn(true); + try { + realtimeEventService.flush(be2, event.isRemove()); + } catch (Exception e) { + Assert.assertTrue(e instanceof NullPointerException); + } + + contractTrigger.getContractEventTriggers().clear(); + + realtimeEventService.flush(be2, event.isRemove()); + + contractTrigger.getContractLogTriggers().add(mock(ContractLogTrigger.class)); + Mockito.when(instance.isContractEventTriggerEnable()).thenReturn(true); + try { + realtimeEventService.flush(be2, event.isRemove()); + } catch (Exception e) { + Assert.assertTrue(e instanceof NullPointerException); + } + } +} diff --git a/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java new file mode 100644 index 00000000000..ef71a3d39a9 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java @@ -0,0 +1,116 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import com.google.protobuf.ByteString; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import org.eclipse.jetty.util.BlockingArrayQueue; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.SolidityTriggerCapsule; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; +import org.tron.common.logsfilter.capsule.TriggerCapsule; +import org.tron.common.logsfilter.trigger.ContractEventTrigger; +import org.tron.common.logsfilter.trigger.ContractLogTrigger; +import org.tron.common.utils.ReflectUtils; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventCache; +import org.tron.core.services.event.SolidEventService; +import org.tron.core.services.event.bo.BlockEvent; +import org.tron.core.services.event.bo.SmartContractTrigger; + +public class SolidEventServiceTest { + + SolidEventService solidEventService = new SolidEventService(); + + @Test + public void test() throws Exception { + BlockEvent be1 = new BlockEvent(); + BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); + be1.setBlockId(b1); + be1.setParentId(b1); + be1.setSolidId(b1); + BlockEventCache.init(b1); + + BlockEvent be2 = new BlockEvent(); + BlockCapsule.BlockId b2 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 2); + be2.setBlockId(b2); + be2.setParentId(b1); + be2.setSolidId(b1); + BlockEventCache.add(be2); + Assert.assertEquals(be2, BlockEventCache.getHead()); + Assert.assertEquals(be2, BlockEventCache.getBlockEvent(b2)); + + solidEventService.flush(be2); + + EventPluginLoader instance = mock(EventPluginLoader.class); + ReflectUtils.setFieldValue(solidEventService, "instance", instance); + + BlockingQueue queue = new BlockingArrayQueue<>(); + Manager manager = mock(Manager.class); + Mockito.when(manager.getTriggerCapsuleQueue()).thenReturn(queue); + ReflectUtils.setFieldValue(solidEventService, "manager", manager); + + BlockCapsule blockCapsule = new BlockCapsule(0L, Sha256Hash.ZERO_HASH, 0L, + ByteString.copyFrom(BlockEventCacheTest.getBlockId())); + be2.setBlockLogTriggerCapsule(new BlockLogTriggerCapsule(blockCapsule)); + Mockito.when(instance.isBlockLogTriggerEnable()).thenReturn(true); + Mockito.when(instance.isBlockLogTriggerSolidified()).thenReturn(true); + + solidEventService.flush(be2); + + Assert.assertEquals(1, queue.size()); + + be2.setBlockLogTriggerCapsule(null); + queue.poll(); + + List list = new ArrayList<>(); + list.add(mock(TransactionLogTriggerCapsule.class)); + be2.setTransactionLogTriggerCapsules(list); + + Mockito.when(instance.isTransactionLogTriggerEnable()).thenReturn(true); + Mockito.when(instance.isTransactionLogTriggerSolidified()).thenReturn(true); + solidEventService.flush(be2); + Assert.assertEquals(1, queue.size()); + + be2.setTransactionLogTriggerCapsules(null); + + SmartContractTrigger contractTrigger = new SmartContractTrigger(); + be2.setSmartContractTrigger(contractTrigger); + + contractTrigger.getContractEventTriggers().add(mock(ContractEventTrigger.class)); + Mockito.when(instance.isSolidityLogTriggerEnable()).thenReturn(true); + try { + solidEventService.flush(be2); + } catch (Exception e) { + Assert.assertTrue(e instanceof NullPointerException); + } + + contractTrigger.getContractEventTriggers().clear(); + + solidEventService.flush(be2); + + contractTrigger.getContractLogTriggers().add(mock(ContractLogTrigger.class)); + Mockito.when(instance.isSolidityEventTriggerEnable()).thenReturn(true); + try { + solidEventService.flush(be2); + } catch (Exception e) { + Assert.assertTrue(e instanceof NullPointerException); + } + + be2.setSmartContractTrigger(null); + + Mockito.when(instance.isSolidityTriggerEnable()).thenReturn(true); + be2.setSolidityTriggerCapsule(new SolidityTriggerCapsule(1)); + queue.clear(); + solidEventService.flush(be2); + Assert.assertEquals(1, queue.size()); + } +} From f7a371103792ba1d8b89b0bc7337b99e74bbcf28 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 13 Feb 2025 18:33:06 +0800 Subject: [PATCH 043/107] bump jcommander from 1.72 to 1.78 --- common/build.gradle | 2 +- .../main/java/org/tron/core/config/args/Args.java | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index efd966897a4..a7393d2d739 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -34,7 +34,7 @@ dependencies { api "com.cedarsoftware:java-util:1.8.0" api group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.1' api group: 'commons-codec', name: 'commons-codec', version: '1.11' - api group: 'com.beust', name: 'jcommander', version: '1.72' + api group: 'com.beust', name: 'jcommander', version: '1.78' api group: 'com.typesafe', name: 'config', version: '1.3.2' api group: leveldbGroup, name: leveldbName, version: leveldbVersion api group: 'org.rocksdb', name: 'rocksdbjni', version: '5.15.10' diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 852d271497d..a4752351625 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -260,14 +260,15 @@ private static void printVersion() { } catch (IOException e) { logger.error(e.getMessage()); } - JCommander.getConsole().println("OS : " + System.getProperty("os.name")); - JCommander.getConsole().println("JVM : " + System.getProperty("java.vendor") + " " + JCommander jCommander = new JCommander(); + jCommander.getConsole().println("OS : " + System.getProperty("os.name")); + jCommander.getConsole().println("JVM : " + System.getProperty("java.vendor") + " " + System.getProperty("java.version") + " " + System.getProperty("os.arch")); if (!noGitProperties) { - JCommander.getConsole().println("Git : " + properties.getProperty("git.commit.id")); + jCommander.getConsole().println("Git : " + properties.getProperty("git.commit.id")); } - JCommander.getConsole().println("Version : " + Version.getVersion()); - JCommander.getConsole().println("Code : " + Version.VERSION_CODE); + jCommander.getConsole().println("Version : " + Version.getVersion()); + jCommander.getConsole().println("Code : " + Version.VERSION_CODE); } public static void printHelp(JCommander jCommander) { @@ -311,7 +312,7 @@ public static void printHelp(JCommander jCommander) { helpStr.append(tmpOptionDesc); } } - JCommander.getConsole().println(helpStr.toString()); + jCommander.getConsole().println(helpStr.toString()); } public static String upperFirst(String name) { From 7149763f749bd380af94ec41cd777c64ac9a4f74 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 13 Feb 2025 18:33:47 +0800 Subject: [PATCH 044/107] bump pf4j from 2.5.0 to 3.10.0 --- framework/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/build.gradle b/framework/build.gradle index 83b6df6d95e..fb4f2278294 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -57,7 +57,9 @@ dependencies { compileOnly group: 'javax.portlet', name: 'portlet-api', version: '3.0.1' implementation "io.vavr:vavr:0.9.2" - implementation group: 'org.pf4j', name: 'pf4j', version: '2.5.0' + implementation (group: 'org.pf4j', name: 'pf4j', version: '3.10.0') { + exclude group: "org.slf4j", module: "slf4j-api" + } testImplementation group: 'org.springframework', name: 'spring-test', version: '5.2.0.RELEASE' testImplementation group: 'org.springframework', name: 'spring-web', version: '5.2.0.RELEASE' From f9f592ebfa7635f4afb988031cadc22e9a416c91 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 13 Feb 2025 18:34:25 +0800 Subject: [PATCH 045/107] bump grpc from 1.52.1 to 1.60.0 --- .../java/org/tron/common/client/DatabaseGrpcClient.java | 8 ++++++++ protocol/build.gradle | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java index f3650bfd2be..0c22c264188 100644 --- a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java @@ -1,7 +1,9 @@ package org.tron.common.client; +import io.grpc.LoadBalancerRegistry; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; +import io.grpc.internal.PickFirstLoadBalancerProvider; import org.tron.api.DatabaseGrpc; import org.tron.api.GrpcAPI.EmptyMessage; import org.tron.api.GrpcAPI.NumberMessage; @@ -13,6 +15,12 @@ public class DatabaseGrpcClient { private final ManagedChannel channel; private final DatabaseGrpc.DatabaseBlockingStub databaseBlockingStub; + static { + LoadBalancerRegistry + .getDefaultRegistry() + .register(new PickFirstLoadBalancerProvider()); + } + public DatabaseGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() diff --git a/protocol/build.gradle b/protocol/build.gradle index ce4091afff1..02158f9fdd4 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.google.protobuf' def protobufVersion = '3.25.5' -def grpcVersion = '1.52.1' +def grpcVersion = '1.60.0' dependencies { api group: 'com.google.protobuf', name: 'protobuf-java', version: protobufVersion From f500778a17688506c288e42f88eb7b3f648ad8f1 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 13 Feb 2025 18:35:25 +0800 Subject: [PATCH 046/107] bump libp2p from 2.2.4 to 2.2.5 --- common/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index a7393d2d739..25709c9b7a6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -46,7 +46,7 @@ dependencies { api 'org.aspectj:aspectjrt:1.8.13' api 'org.aspectj:aspectjweaver:1.8.13' api 'org.aspectj:aspectjtools:1.8.13' - api group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.4',{ + api group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.5',{ exclude group: 'io.grpc', module: 'grpc-context' exclude group: 'io.grpc', module: 'grpc-core' exclude group: 'io.grpc', module: 'grpc-netty' @@ -60,6 +60,8 @@ dependencies { exclude group: 'net.java.dev.msv', module: 'xsdlib' exclude group: 'pull-parser', module: 'pull-parser' exclude group: 'xpp3', module: 'xpp3' + exclude group: 'org.bouncycastle', module: 'bcprov-jdk18on' + exclude group: 'org.bouncycastle', module: 'bcutil-jdk18on' } api project(":protocol") } From 9485e85e708477d83ef8ea12c8e1ac2f70107b29 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Feb 2025 19:20:13 +0800 Subject: [PATCH 047/107] add test case ApiUtilTest --- .../org/tron/core/jsonrpc/ApiUtilTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java diff --git a/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java new file mode 100644 index 00000000000..84aba180138 --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java @@ -0,0 +1,47 @@ +package org.tron.core.jsonrpc; + + +import static org.tron.common.utils.Commons.decodeFromBase58Check; +import static org.tron.keystore.Wallet.generateRandomBytes; + +import com.google.protobuf.ByteString; +import org.junit.Assert; +import org.junit.Test; +import org.tron.common.utils.ByteArray; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.services.jsonrpc.JsonRpcApiUtil; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.BlockHeader; +import org.tron.protos.Protocol.BlockHeader.raw; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; + +public class ApiUtilTest { + + @Test + public void testGetBlockID() { + byte[] mockedHash = generateRandomBytes(128); + // common parent block + BlockCapsule blockCapsule = new BlockCapsule(Block.newBuilder().setBlockHeader( + BlockHeader.newBuilder().setRawData( + raw.newBuilder().setParentHash(ByteString.copyFrom(mockedHash)) + .setNumber(0))).build()); + String blockIdStr = JsonRpcApiUtil.getBlockID(blockCapsule.getInstance()); + Assert.assertEquals(2 + 64, blockIdStr.length()); + } + + @Test + public void testTriggerCallContract() { + byte[] address = decodeFromBase58Check("TEPRbQxXQEpHpeEx8tK5xHVs7NWudAAZgu"); + //nile usdt + byte[] contractAddress = decodeFromBase58Check("TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"); + long callValue = 100; + //transfer to address TVjsyZ7fYF3qLF6BQgPmTEZy1xrNNyVAAA with 10*10^6 + byte[] data = ByteArray.fromHexString("a9059cbb000000000000000000000000d8dd39e2dea27a4000" + + "1884901735e3940829bb440000000000000000000000000000000000000000000000000000000000989680"); + long tokenValue = 10; + String tokenId = "1000001"; + TriggerSmartContract triggerSmartContract = JsonRpcApiUtil.triggerCallContract(address, + contractAddress, callValue, data, tokenValue, tokenId); + Assert.assertNotNull(triggerSmartContract); + } +} From 61eb74632154b3dec41ce6dc095ffe6511989fa5 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Sat, 8 Feb 2025 16:01:42 +0800 Subject: [PATCH 048/107] feat(math): migrate all operations from java.lang.Math to java.lang.StrictMath --- .github/workflows/math-check.yml | 93 ++++++++++++ .../tron/core/actuator/AbstractActuator.java | 62 ++++++++ .../AccountPermissionUpdateActuator.java | 7 +- .../core/actuator/AssetIssueActuator.java | 5 +- .../core/actuator/CreateAccountActuator.java | 6 +- .../actuator/DelegateResourceActuator.java | 6 +- .../core/actuator/ExchangeCreateActuator.java | 3 +- .../core/actuator/ExchangeInjectActuator.java | 8 +- .../actuator/ExchangeWithdrawActuator.java | 8 -- .../actuator/MarketCancelOrderActuator.java | 3 +- .../actuator/MarketSellAssetActuator.java | 25 ++-- .../ParticipateAssetIssueActuator.java | 16 +-- .../actuator/ShieldedTransferActuator.java | 14 +- .../tron/core/actuator/TransferActuator.java | 11 +- .../core/actuator/TransferAssetActuator.java | 6 +- .../actuator/UnDelegateResourceActuator.java | 4 +- .../org/tron/core/actuator/VMActuator.java | 60 +++++--- .../core/actuator/WitnessCreateActuator.java | 6 +- .../org/tron/core/utils/TransactionUtil.java | 3 +- .../java/org/tron/core/vm/EnergyCost.java | 4 +- .../tron/core/vm/PrecompiledContracts.java | 11 +- .../main/java/org/tron/core/vm/VMUtils.java | 6 +- .../org/tron/core/vm/config/ConfigLoader.java | 1 + .../DelegateResourceProcessor.java | 5 +- .../UnDelegateResourceProcessor.java | 6 +- .../UnfreezeBalanceProcessor.java | 6 +- .../java/org/tron/core/vm/program/Memory.java | 20 +-- .../org/tron/core/vm/program/Program.java | 29 ++-- .../core/vm/repository/RepositoryImpl.java | 10 +- .../org/tron/core/vm/utils/FreezeV2Util.java | 27 ++-- .../main/java/org/tron/common/math/Maths.java | 20 --- .../java/org/tron/common/utils/Commons.java | 18 ++- .../org/tron/common/utils/ForkController.java | 5 +- .../org/tron/core/capsule/AccountCapsule.java | 75 +++++----- .../tron/core/capsule/ContractCapsule.java | 8 +- .../core/capsule/ContractStateCapsule.java | 22 +-- .../org/tron/core/capsule/ReceiptCapsule.java | 19 ++- .../tron/core/capsule/utils/MarketUtils.java | 38 ++--- .../org/tron/core/db/EnergyProcessor.java | 14 +- .../org/tron/core/db/ResourceProcessor.java | 29 ++-- .../org/tron/core/db/TransactionTrace.java | 14 +- .../tron/core/service/MortgageService.java | 5 +- .../org/tron/core/store/AssetIssueStore.java | 7 - .../core/store/DynamicPropertiesStore.java | 11 +- .../org/tron/common/math/MathWrapper.java | 64 +++++++++ .../main/java/org/tron/common/math/Maths.java | 92 ++++++++++++ .../tron/common/math/StrictMathWrapper.java | 136 ++++++++++++++++++ .../org/tron/common/runtime/vm/DataWord.java | 8 +- .../java/org/tron/common/utils/ByteUtil.java | 6 +- .../org/tron/core/vm/config/VMConfig.java | 10 ++ .../logsfilter/ContractEventParser.java | 4 +- .../src/main/java/org/tron/core/Wallet.java | 25 ++-- .../java/org/tron/core/capsule/utils/RLP.java | 3 +- .../java/org/tron/core/config/args/Args.java | 29 ++-- .../main/java/org/tron/core/db/Manager.java | 37 +++-- .../SyncBlockChainMsgHandler.java | 4 +- .../service/effective/ResilienceService.java | 7 +- .../jsonrpc/filters/LogFilterWrapper.java | 4 +- .../main/java/org/tron/program/DBConvert.java | 3 +- .../test/java/org/tron/common/BaseTest.java | 9 ++ .../runtime/vm/BandWidthRuntimeTest.java | 5 +- .../tron/common/runtime/vm/FreezeV2Test.java | 4 +- .../tron/common/runtime/vm/MemoryTest.java | 4 +- .../PrecompiledContractsVerifyProofTest.java | 4 +- .../org/tron/common/runtime/vm/VoteTest.java | 4 +- .../common/utils/client/utils/AbiUtil.java | 4 +- .../common/utils/client/utils/DataWord.java | 4 +- .../actuator/ExchangeCreateActuatorTest.java | 68 ++++----- .../actuator/ExchangeInjectActuatorTest.java | 44 +++--- .../ExchangeTransactionActuatorTest.java | 24 ++-- .../ExchangeWithdrawActuatorTest.java | 18 +-- .../ParticipateAssetIssueActuatorTest.java | 2 +- .../UpdateSettingContractActuatorTest.java | 12 +- .../actuator/utils/TransactionUtilTest.java | 21 +-- .../tron/core/capsule/AccountCapsuleTest.java | 4 +- .../capsule/ContractStateCapsuleTest.java | 24 ++-- .../core/capsule/utils/MerkleTreeTest.java | 4 +- .../java/org/tron/core/db/ManagerTest.java | 9 +- .../db/MarketPairPriceToOrderStoreTest.java | 5 +- .../core/jsonrpc/ConcurrentHashMapTest.java | 5 +- .../core/services/ProposalServiceTest.java | 2 + .../tron/core/zksnark/LibrustzcashTest.java | 4 +- .../tron/core/zksnark/SaplingNoteTest.java | 5 +- .../org/tron/plugins/utils/ByteArray.java | 2 +- .../java/org/tron/plugins/utils/DBUtils.java | 3 +- .../org/tron/plugins/utils/MarketUtils.java | 4 +- 86 files changed, 1036 insertions(+), 450 deletions(-) create mode 100644 .github/workflows/math-check.yml delete mode 100644 chainbase/src/main/java/org/tron/common/math/Maths.java create mode 100644 common/src/main/java/org/tron/common/math/Maths.java rename {actuator => common}/src/main/java/org/tron/core/vm/config/VMConfig.java (96%) diff --git a/.github/workflows/math-check.yml b/.github/workflows/math-check.yml new file mode 100644 index 00000000000..0f0255815d5 --- /dev/null +++ b/.github/workflows/math-check.yml @@ -0,0 +1,93 @@ +name: Check Math Usage + +on: + push: + branches: [ 'master', 'release_**' ] + pull_request: + branches: [ 'develop', 'release_**' ] + workflow_dispatch: + +jobs: + check-math: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Check for java.lang.Math usage + id: check-math + shell: bash + run: | + echo "Checking for java.lang.Math usage..." + + touch math_usage.txt + + while IFS= read -r file; do + filename=$(basename "$file") + if [[ "$filename" == "StrictMathWrapper.java" || "$filename" == "MathWrapper.java" ]]; then + continue + fi + + perl -0777 -ne ' + s/"([^"\\]|\\.)*"//g; + s/'\''([^'\''\\]|\\.)*'\''//g; + s!/\*([^*]|\*[^/])*\*/!!g; + s!//[^\n]*!!g; + $hasMath = 0; + $hasMath = 1 if /^[\s]*import[\s]+java\.lang\.Math\b/m; + $hasMath = 1 if /\bjava\s*\.\s*lang\s*\.\s*Math\s*\./; + $hasMath = 1 if /(?> math_usage.txt + done < <(find . -type f -name "*.java") + + sort -u math_usage.txt -o math_usage.txt + + if [ -s math_usage.txt ]; then + echo "❌ Error: Forbidden Math usage found in the following files:" + cat math_usage.txt + echo "math_found=true" >> $GITHUB_OUTPUT + echo "Please use org.tron.common.math.StrictMathWrapper instead of direct Math usage." + else + echo "✅ No forbidden Math usage found" + echo "math_found=false" >> $GITHUB_OUTPUT + fi + + - name: Upload findings + if: steps.check-math.outputs.math_found == 'true' + uses: actions/upload-artifact@v4 + with: + name: math-usage-report + path: math_usage.txt + + - name: Create comment + if: github.event_name == 'pull_request' && steps.check-math.outputs.math_found == 'true' + uses: actions/github-script@v6 + with: + script: | + const fs = require('fs'); + const findings = fs.readFileSync('math_usage.txt', 'utf8'); + const body = `### ❌ Math Usage Detection Results + + Found forbidden usage of \`java.lang.Math\` in the following files: + + \`\`\` + ${findings} + \`\`\` + + **Please review if this usage is intended.** + > [!CAUTION] + > Note: You should use \`org.tron.common.math.StrictMathWrapper\`. + > If you need to use \`java.lang.Math\`, please provide a justification. + `; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + + - name: Fail if Math usage found + if: steps.check-math.outputs.math_found == 'true' + run: exit 1 diff --git a/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java b/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java index c88baf9b3ca..2f1bb450d1b 100644 --- a/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java @@ -2,9 +2,14 @@ import com.google.protobuf.Any; import com.google.protobuf.GeneratedMessageV3; +import org.tron.common.math.Maths; +import org.tron.common.utils.Commons; import org.tron.common.utils.ForkController; import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.exception.BalanceInsufficientException; +import org.tron.core.store.AccountStore; import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.Transaction.Contract.ContractType; @@ -63,4 +68,61 @@ public AbstractActuator setForkUtils(ForkController forkController) { return this; } + public long addExact(long x, long y) { + return Maths.addExact(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long addExact(int x, int y) { + return Maths.addExact(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long floorDiv(long x, long y) { + return Maths.floorDiv(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long floorDiv(long x, int y) { + return this.floorDiv(x, (long) y); + } + + public long multiplyExact(long x, long y) { + return Maths.multiplyExact(x, y, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long multiplyExact(long x, int y) { + return this.multiplyExact(x, (long) y); + } + + public int multiplyExact(int x, int y) { + return Maths.multiplyExact(x, y, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long subtractExact(long x, long y) { + return Maths.subtractExact(x, y, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public int min(int a, int b) { + return Maths.min(a, b, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public long min(long a, long b) { + return Maths.min(a, b, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } + + public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) + throws BalanceInsufficientException { + AccountCapsule account = accountStore.getUnchecked(accountAddress); + this.adjustBalance(accountStore, account, amount); + } + + /** + * judge balance. + */ + public void adjustBalance(AccountStore accountStore, AccountCapsule account, long amount) + throws BalanceInsufficientException { + Commons.adjustBalance(accountStore, account, amount, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } } diff --git a/actuator/src/main/java/org/tron/core/actuator/AccountPermissionUpdateActuator.java b/actuator/src/main/java/org/tron/core/actuator/AccountPermissionUpdateActuator.java index fcc4d775d43..f2eafb20a5e 100644 --- a/actuator/src/main/java/org/tron/core/actuator/AccountPermissionUpdateActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/AccountPermissionUpdateActuator.java @@ -8,7 +8,6 @@ import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; @@ -52,11 +51,11 @@ public boolean execute(Object object) throws ContractExeException { accountPermissionUpdateContract.getActivesList()); accountStore.put(ownerAddress, account); - Commons.adjustBalance(accountStore, ownerAddress, -fee); + adjustBalance(accountStore, ownerAddress, -fee); if (chainBaseManager.getDynamicPropertiesStore().supportBlackHoleOptimization()) { chainBaseManager.getDynamicPropertiesStore().burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } result.setStatus(fee, code.SUCESS); @@ -111,7 +110,7 @@ private boolean checkPermission(Permission permission) throws ContractValidateEx throw new ContractValidateException("key's weight should be greater than 0"); } try { - weightSum = Math.addExact(weightSum, key.getWeight()); + weightSum = addExact(weightSum, key.getWeight()); } catch (ArithmeticException e) { throw new ContractValidateException(e.getMessage()); } diff --git a/actuator/src/main/java/org/tron/core/actuator/AssetIssueActuator.java b/actuator/src/main/java/org/tron/core/actuator/AssetIssueActuator.java index 55218897c5d..331b45f106a 100644 --- a/actuator/src/main/java/org/tron/core/actuator/AssetIssueActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/AssetIssueActuator.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; @@ -84,11 +83,11 @@ public boolean execute(Object result) throws ContractExeException { .put(assetIssueCapsuleV2.createDbV2Key(), assetIssueCapsuleV2); } - Commons.adjustBalance(accountStore, ownerAddress, -fee); + adjustBalance(accountStore, ownerAddress, -fee); if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee);//send to blackhole + adjustBalance(accountStore, accountStore.getBlackhole(), fee);//send to blackhole } AccountCapsule accountCapsule = accountStore.get(ownerAddress); List frozenSupplyList = assetIssueContract.getFrozenSupplyList(); diff --git a/actuator/src/main/java/org/tron/core/actuator/CreateAccountActuator.java b/actuator/src/main/java/org/tron/core/actuator/CreateAccountActuator.java index 1c6aca4d7d7..352f394d6cb 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CreateAccountActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CreateAccountActuator.java @@ -6,7 +6,6 @@ import com.google.protobuf.InvalidProtocolBufferException; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -48,13 +47,12 @@ public boolean execute(Object result) accountStore .put(accountCreateContract.getAccountAddress().toByteArray(), accountCapsule); - Commons - .adjustBalance(accountStore, accountCreateContract.getOwnerAddress().toByteArray(), -fee); + adjustBalance(accountStore, accountCreateContract.getOwnerAddress().toByteArray(), -fee); // Add to blackhole address if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } ret.setStatus(fee, code.SUCESS); } catch (BalanceInsufficientException | InvalidProtocolBufferException e) { diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 161f22cfb17..90e91d8d3b2 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -162,7 +162,8 @@ public boolean validate() throws ContractValidateException { } long netUsage = (long) (accountNetUsage * TRX_PRECISION * ((double) (dynamicStore.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, + dynamicStore.allowStrictMath2()); if (ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage < delegateBalance) { throw new ContractValidateException( "delegateBalance must be less than or equal to available FreezeBandwidthV2 balance"); @@ -175,7 +176,8 @@ public boolean validate() throws ContractValidateException { long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (dynamicStore.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); - long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage); + long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage, + dynamicStore.allowStrictMath2()); if (ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage < delegateBalance) { throw new ContractValidateException( "delegateBalance must be less than or equal to available FreezeEnergyV2 balance"); diff --git a/actuator/src/main/java/org/tron/core/actuator/ExchangeCreateActuator.java b/actuator/src/main/java/org/tron/core/actuator/ExchangeCreateActuator.java index b7f5b90da45..27d3da509b4 100755 --- a/actuator/src/main/java/org/tron/core/actuator/ExchangeCreateActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/ExchangeCreateActuator.java @@ -9,7 +9,6 @@ import java.util.Arrays; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -121,7 +120,7 @@ public boolean execute(Object object) throws ContractExeException { if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } ret.setExchangeId(id); ret.setStatus(fee, code.SUCESS); diff --git a/actuator/src/main/java/org/tron/core/actuator/ExchangeInjectActuator.java b/actuator/src/main/java/org/tron/core/actuator/ExchangeInjectActuator.java index 7848f898ced..482f5bdf081 100755 --- a/actuator/src/main/java/org/tron/core/actuator/ExchangeInjectActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/ExchangeInjectActuator.java @@ -71,14 +71,14 @@ public boolean execute(Object object) throws ContractExeException { if (Arrays.equals(tokenID, firstTokenID)) { anotherTokenID = secondTokenID; - anotherTokenQuant = Math - .floorDiv(Math.multiplyExact(secondTokenBalance, tokenQuant), firstTokenBalance); + anotherTokenQuant = floorDiv(multiplyExact( + secondTokenBalance, tokenQuant), firstTokenBalance); exchangeCapsule.setBalance(firstTokenBalance + tokenQuant, secondTokenBalance + anotherTokenQuant); } else { anotherTokenID = firstTokenID; - anotherTokenQuant = Math - .floorDiv(Math.multiplyExact(firstTokenBalance, tokenQuant), secondTokenBalance); + anotherTokenQuant = floorDiv(multiplyExact( + firstTokenBalance, tokenQuant), secondTokenBalance); exchangeCapsule.setBalance(firstTokenBalance + anotherTokenQuant, secondTokenBalance + tokenQuant); } diff --git a/actuator/src/main/java/org/tron/core/actuator/ExchangeWithdrawActuator.java b/actuator/src/main/java/org/tron/core/actuator/ExchangeWithdrawActuator.java index 8929305d68c..fb8fe9384d3 100755 --- a/actuator/src/main/java/org/tron/core/actuator/ExchangeWithdrawActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/ExchangeWithdrawActuator.java @@ -76,16 +76,12 @@ public boolean execute(Object object) throws ContractExeException { BigInteger bigTokenQuant = new BigInteger(String.valueOf(tokenQuant)); if (Arrays.equals(tokenID, firstTokenID)) { anotherTokenID = secondTokenID; -// anotherTokenQuant = Math -// .floorDiv(Math.multiplyExact(secondTokenBalance, tokenQuant), firstTokenBalance); anotherTokenQuant = bigSecondTokenBalance.multiply(bigTokenQuant) .divide(bigFirstTokenBalance).longValueExact(); exchangeCapsule.setBalance(firstTokenBalance - tokenQuant, secondTokenBalance - anotherTokenQuant); } else { anotherTokenID = firstTokenID; -// anotherTokenQuant = Math -// .floorDiv(Math.multiplyExact(firstTokenBalance, tokenQuant), secondTokenBalance); anotherTokenQuant = bigFirstTokenBalance.multiply(bigTokenQuant) .divide(bigSecondTokenBalance).longValueExact(); exchangeCapsule.setBalance(firstTokenBalance - anotherTokenQuant, @@ -210,8 +206,6 @@ public boolean validate() throws ContractValidateException { BigDecimal bigSecondTokenBalance = new BigDecimal(String.valueOf(secondTokenBalance)); BigDecimal bigTokenQuant = new BigDecimal(String.valueOf(tokenQuant)); if (Arrays.equals(tokenID, firstTokenID)) { -// anotherTokenQuant = Math -// .floorDiv(Math.multiplyExact(secondTokenBalance, tokenQuant), firstTokenBalance); anotherTokenQuant = bigSecondTokenBalance.multiply(bigTokenQuant) .divideToIntegralValue(bigFirstTokenBalance).longValueExact(); if (firstTokenBalance < tokenQuant || secondTokenBalance < anotherTokenQuant) { @@ -230,8 +224,6 @@ public boolean validate() throws ContractValidateException { } } else { -// anotherTokenQuant = Math -// .floorDiv(Math.multiplyExact(firstTokenBalance, tokenQuant), secondTokenBalance); anotherTokenQuant = bigFirstTokenBalance.multiply(bigTokenQuant) .divideToIntegralValue(bigSecondTokenBalance).longValueExact(); if (secondTokenBalance < tokenQuant || firstTokenBalance < anotherTokenQuant) { diff --git a/actuator/src/main/java/org/tron/core/actuator/MarketCancelOrderActuator.java b/actuator/src/main/java/org/tron/core/actuator/MarketCancelOrderActuator.java index f859e580253..31b5e87e12d 100644 --- a/actuator/src/main/java/org/tron/core/actuator/MarketCancelOrderActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/MarketCancelOrderActuator.java @@ -23,7 +23,6 @@ import com.google.protobuf.InvalidProtocolBufferException; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.MarketOrderCapsule; @@ -100,7 +99,7 @@ public boolean execute(Object object) throws ContractExeException { if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } // 1. return balance and token MarketUtils diff --git a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java index 15e5a98f86a..43f21b716d8 100644 --- a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java @@ -129,7 +129,7 @@ public boolean execute(Object object) throws ContractExeException { if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } // 1. transfer of balance transferBalanceOrToken(accountCapsule); @@ -244,7 +244,7 @@ public boolean validate() throws ContractValidateException { long fee = calcFee(); if (Arrays.equals(sellTokenID, "_".getBytes())) { - if (ownerAccount.getBalance() < Math.addExact(sellTokenQuantity, fee)) { + if (ownerAccount.getBalance() < addExact(sellTokenQuantity, fee)) { throw new ContractValidateException("No enough balance !"); } } else { @@ -400,8 +400,10 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, // => takerBuyTokenQuantityCurrent_A = takerSellTokenQuantityRemain_TRX * // makerSellTokenQuantity_A/makerBuyTokenQuantity_TRX + boolean useStrictMath2 = dynamicStore.allowStrictMath2(); long takerBuyTokenQuantityRemain = MarketUtils - .multiplyAndDivide(takerSellRemainQuantity, makerSellQuantity, makerBuyQuantity); + .multiplyAndDivide(takerSellRemainQuantity, makerSellQuantity, makerBuyQuantity, + useStrictMath2); if (takerBuyTokenQuantityRemain == 0) { // quantity too small, return sellToken to user @@ -424,7 +426,8 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, // makerBuyTokenQuantity_TRX / makerSellTokenQuantity_A makerBuyTokenQuantityReceive = MarketUtils - .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity); + .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); takerBuyTokenQuantityReceive = makerOrderCapsule.getSellTokenQuantityRemain(); long takerSellTokenLeft = @@ -447,7 +450,7 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, takerOrderCapsule.setSellTokenQuantityRemain(0); MarketUtils.updateOrderState(takerOrderCapsule, State.INACTIVE, marketAccountStore); - makerOrderCapsule.setSellTokenQuantityRemain(Math.subtractExact( + makerOrderCapsule.setSellTokenQuantityRemain(subtractExact( makerOrderCapsule.getSellTokenQuantityRemain(), takerBuyTokenQuantityRemain)); } else { // taker > maker @@ -458,7 +461,8 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, // makerSellTokenQuantityRemain_A/makerBuyTokenQuantityCurrent_TRX = // makerSellTokenQuantity_A/makerBuyTokenQuantity_TRX makerBuyTokenQuantityReceive = MarketUtils - .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity); + .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); MarketUtils.updateOrderState(makerOrderCapsule, State.INACTIVE, marketAccountStore); if (makerBuyTokenQuantityReceive == 0) { @@ -475,7 +479,7 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, return; } else { makerOrderCapsule.setSellTokenQuantityRemain(0); - takerOrderCapsule.setSellTokenQuantityRemain(Math.subtractExact( + takerOrderCapsule.setSellTokenQuantityRemain(subtractExact( takerOrderCapsule.getSellTokenQuantityRemain(), makerBuyTokenQuantityReceive)); } } @@ -524,7 +528,8 @@ private MarketOrderCapsule createAndSaveOrder(AccountCapsule accountCapsule, private void transferBalanceOrToken(AccountCapsule accountCapsule) { if (Arrays.equals(sellTokenID, "_".getBytes())) { - accountCapsule.setBalance(Math.subtractExact(accountCapsule.getBalance(), sellTokenQuantity)); + accountCapsule.setBalance(subtractExact( + accountCapsule.getBalance(), sellTokenQuantity)); } else { accountCapsule .reduceAssetAmountV2(sellTokenID, sellTokenQuantity, dynamicStore, assetIssueStore); @@ -537,7 +542,7 @@ private void addTrxOrToken(MarketOrderCapsule orderCapsule, long num, byte[] buyTokenId = orderCapsule.getBuyTokenId(); if (Arrays.equals(buyTokenId, "_".getBytes())) { - accountCapsule.setBalance(Math.addExact(accountCapsule.getBalance(), num)); + accountCapsule.setBalance(addExact(accountCapsule.getBalance(), num)); } else { accountCapsule .addAssetAmountV2(buyTokenId, num, dynamicStore, assetIssueStore); @@ -550,7 +555,7 @@ private void addTrxOrToken(MarketOrderCapsule orderCapsule, long num) { byte[] buyTokenId = orderCapsule.getBuyTokenId(); if (Arrays.equals(buyTokenId, "_".getBytes())) { - accountCapsule.setBalance(Math.addExact(accountCapsule.getBalance(), num)); + accountCapsule.setBalance(addExact(accountCapsule.getBalance(), num)); } else { accountCapsule .addAssetAmountV2(buyTokenId, num, dynamicStore, assetIssueStore); diff --git a/actuator/src/main/java/org/tron/core/actuator/ParticipateAssetIssueActuator.java b/actuator/src/main/java/org/tron/core/actuator/ParticipateAssetIssueActuator.java index 77e345b2a92..7fdf15acd18 100755 --- a/actuator/src/main/java/org/tron/core/actuator/ParticipateAssetIssueActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/ParticipateAssetIssueActuator.java @@ -64,8 +64,8 @@ public boolean execute(Object object) throws ContractExeException { //subtract from owner address byte[] ownerAddress = participateAssetIssueContract.getOwnerAddress().toByteArray(); AccountCapsule ownerAccount = accountStore.get(ownerAddress); - long balance = Math.subtractExact(ownerAccount.getBalance(), cost); - balance = Math.subtractExact(balance, fee); + long balance = subtractExact(ownerAccount.getBalance(), cost); + balance = subtractExact(balance, fee); ownerAccount.setBalance(balance); byte[] key = participateAssetIssueContract.getAssetName().toByteArray(); @@ -74,14 +74,14 @@ public boolean execute(Object object) throws ContractExeException { assetIssueCapsule = Commons .getAssetIssueStoreFinal(dynamicStore, assetIssueStore, assetIssueV2Store).get(key); - long exchangeAmount = Math.multiplyExact(cost, assetIssueCapsule.getNum()); - exchangeAmount = Math.floorDiv(exchangeAmount, assetIssueCapsule.getTrxNum()); + long exchangeAmount = multiplyExact(cost, assetIssueCapsule.getNum()); + exchangeAmount = floorDiv(exchangeAmount, assetIssueCapsule.getTrxNum()); ownerAccount.addAssetAmountV2(key, exchangeAmount, dynamicStore, assetIssueStore); //add to to_address byte[] toAddress = participateAssetIssueContract.getToAddress().toByteArray(); AccountCapsule toAccount = accountStore.get(toAddress); - toAccount.setBalance(Math.addExact(toAccount.getBalance(), cost)); + toAccount.setBalance(addExact(toAccount.getBalance(), cost)); if (!toAccount.reduceAssetAmountV2(key, exchangeAmount, dynamicStore, assetIssueStore)) { throw new ContractExeException("reduceAssetAmount failed !"); } @@ -156,7 +156,7 @@ public boolean validate() throws ContractValidateException { try { //Whether the balance is enough long fee = calcFee(); - if (ownerAccount.getBalance() < Math.addExact(amount, fee)) { + if (ownerAccount.getBalance() < addExact(amount, fee)) { throw new ContractValidateException("No enough balance !"); } @@ -181,8 +181,8 @@ public boolean validate() throws ContractValidateException { int trxNum = assetIssueCapsule.getTrxNum(); int num = assetIssueCapsule.getNum(); - long exchangeAmount = Math.multiplyExact(amount, num); - exchangeAmount = Math.floorDiv(exchangeAmount, trxNum); + long exchangeAmount = multiplyExact(amount, num); + exchangeAmount = floorDiv(exchangeAmount, trxNum); if (exchangeAmount <= 0) { throw new ContractValidateException("Can not process the exchange!"); } diff --git a/actuator/src/main/java/org/tron/core/actuator/ShieldedTransferActuator.java b/actuator/src/main/java/org/tron/core/actuator/ShieldedTransferActuator.java index 284650f1ffb..2773dc07d26 100644 --- a/actuator/src/main/java/org/tron/core/actuator/ShieldedTransferActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/ShieldedTransferActuator.java @@ -96,9 +96,9 @@ public boolean execute(Object result) //adjust and verify total shielded pool value try { - Commons.adjustTotalShieldedPoolValue( - Math.addExact(Math.subtractExact(shieldedTransferContract.getToAmount(), - shieldedTransferContract.getFromAmount()), fee), dynamicStore); + Commons.adjustTotalShieldedPoolValue(addExact(subtractExact( + shieldedTransferContract.getToAmount(), + shieldedTransferContract.getFromAmount()), fee), dynamicStore); } catch (ArithmeticException | BalanceInsufficientException e) { logger.debug(e.getMessage(), e); ret.setStatus(0, code.FAILED); @@ -327,9 +327,11 @@ private void checkProof(List spendDescriptions, long totalShieldedPoolValue = dynamicStore .getTotalShieldedPoolValue(); try { - valueBalance = Math.addExact(Math.subtractExact(shieldedTransferContract.getToAmount(), + valueBalance = addExact(subtractExact( + shieldedTransferContract.getToAmount(), shieldedTransferContract.getFromAmount()), fee); - totalShieldedPoolValue = Math.subtractExact(totalShieldedPoolValue, valueBalance); + totalShieldedPoolValue = subtractExact( + totalShieldedPoolValue, valueBalance); } catch (ArithmeticException e) { logger.debug(e.getMessage(), e); throw new ZkProofValidateException(e.getMessage(), true); @@ -452,7 +454,7 @@ private void validateTransparent(ShieldedTransferContract shieldedTransferContra AccountCapsule toAccount = accountStore.get(toAddress); if (toAccount != null) { try { - Math.addExact(getZenBalance(toAccount), toAmount); + addExact(getZenBalance(toAccount), toAmount); } catch (ArithmeticException e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); diff --git a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java index 5e3d605aed7..a0deabf8f00 100755 --- a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java @@ -7,7 +7,6 @@ import java.util.Arrays; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -58,13 +57,13 @@ public boolean execute(Object object) throws ContractExeException { fee = fee + dynamicStore.getCreateNewAccountFeeInSystemContract(); } - Commons.adjustBalance(accountStore, ownerAddress, -(Math.addExact(fee, amount))); + adjustBalance(accountStore, ownerAddress, -(addExact(fee, amount))); if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } - Commons.adjustBalance(accountStore, toAddress, amount); + adjustBalance(accountStore, toAddress, amount); ret.setStatus(fee, code.SUCESS); } catch (BalanceInsufficientException | ArithmeticException | InvalidProtocolBufferException e) { logger.debug(e.getMessage(), e); @@ -156,7 +155,7 @@ public boolean validate() throws ContractValidateException { } } - if (balance < Math.addExact(amount, fee)) { + if (balance < addExact(amount, fee)) { logger.warn("Balance is not sufficient. Account: {}, balance: {}, amount: {}, fee: {}.", StringUtil.encode58Check(ownerAddress), balance, amount, fee); throw new ContractValidateException( @@ -164,7 +163,7 @@ public boolean validate() throws ContractValidateException { } if (toAccount != null) { - Math.addExact(toAccount.getBalance(), amount); + addExact(toAccount.getBalance(), amount); } } catch (ArithmeticException e) { logger.debug(e.getMessage(), e); diff --git a/actuator/src/main/java/org/tron/core/actuator/TransferAssetActuator.java b/actuator/src/main/java/org/tron/core/actuator/TransferAssetActuator.java index de2b2faec86..d93263055eb 100644 --- a/actuator/src/main/java/org/tron/core/actuator/TransferAssetActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/TransferAssetActuator.java @@ -83,11 +83,11 @@ public boolean execute(Object result) throws ContractExeException { .addAssetAmountV2(assetName.toByteArray(), amount, dynamicStore, assetIssueStore); accountStore.put(toAddress, toAccountCapsule); - Commons.adjustBalance(accountStore, ownerAccountCapsule, -fee); + adjustBalance(accountStore, ownerAccountCapsule, -fee); if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), fee); + adjustBalance(accountStore, accountStore.getBlackhole(), fee); } ret.setStatus(fee, code.SUCESS); } catch (BalanceInsufficientException e) { @@ -177,7 +177,7 @@ public boolean validate() throws ContractValidateException { assetBalance = toAccount.getAsset(dynamicStore, ByteArray.toStr(assetName)); if (assetBalance != null) { try { - assetBalance = Math.addExact(assetBalance, amount); //check if overflow + assetBalance = addExact(assetBalance, amount); //check if overflow } catch (Exception e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index 79a09664180..2f2eed7fded 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -82,7 +82,7 @@ public boolean execute(Object result) throws ContractExeException { * ((double) (dynamicStore.getTotalNetLimit()) / dynamicStore.getTotalNetWeight())); transferUsage = (long) (receiverCapsule.getNetUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForBandwidth())); - transferUsage = Math.min(unDelegateMaxUsage, transferUsage); + transferUsage = min(unDelegateMaxUsage, transferUsage); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForBandwidth(-unDelegateBalance); } @@ -105,7 +105,7 @@ public boolean execute(Object result) throws ContractExeException { * ((double) (dynamicStore.getTotalEnergyCurrentLimit()) / dynamicStore.getTotalEnergyWeight())); transferUsage = (long) (receiverCapsule.getEnergyUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForEnergy())); - transferUsage = Math.min(unDelegateMaxUsage, transferUsage); + transferUsage = min(unDelegateMaxUsage, transferUsage); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForEnergy(-unDelegateBalance); } diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 08d0f5a8da5..42ddc65c745 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -1,9 +1,11 @@ package org.tron.core.actuator; -import static java.lang.Math.max; -import static java.lang.Math.min; import static org.apache.commons.lang3.ArrayUtils.getLength; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.floorDiv; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.protos.contract.Common.ResourceCode.ENERGY; import com.google.protobuf.ByteString; @@ -124,9 +126,9 @@ public void validate(Object object) throws ContractValidateException { trx = context.getTrxCap().getInstance(); // If tx`s fee limit is set, use it to calc max energy limit for constant call if (isConstantCall && trx.getRawData().getFeeLimit() > 0) { - maxEnergyLimit = Math.min(maxEnergyLimit, trx.getRawData().getFeeLimit() + maxEnergyLimit = min(maxEnergyLimit, trx.getRawData().getFeeLimit() / context.getStoreFactory().getChainBaseManager() - .getDynamicPropertiesStore().getEnergyFee()); + .getDynamicPropertiesStore().getEnergyFee(), VMConfig.allowStrictMath2()); } blockCap = context.getBlockCap(); if ((VMConfig.allowTvmFreeze() || VMConfig.allowTvmFreezeV2()) @@ -563,8 +565,10 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi receipt.setCallerEnergyLeft(leftFrozenEnergy); } - long energyFromBalance = max(account.getBalance() - callValue, 0) / sunPerEnergy; - long availableEnergy = Math.addExact(leftFrozenEnergy, energyFromBalance); + long energyFromBalance = max(account.getBalance() - callValue, 0, + VMConfig.allowStrictMath2()) / sunPerEnergy; + long availableEnergy = addExact(leftFrozenEnergy, energyFromBalance, + VMConfig.allowStrictMath2()); long energyFromFeeLimit = feeLimit / sunPerEnergy; if (VMConfig.allowTvmFreezeV2()) { @@ -580,12 +584,13 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi receipt.setCallerEnergyWindowSizeV2(account.getWindowSizeV2(ENERGY)); account.setEnergyUsage( energyProcessor.increase(account, ENERGY, - account.getEnergyUsage(), min(leftFrozenEnergy, energyFromFeeLimit), now, now)); + account.getEnergyUsage(), min(leftFrozenEnergy, energyFromFeeLimit, + VMConfig.allowStrictMath2()), now, now)); receipt.setCallerEnergyMergedUsage(account.getEnergyUsage()); receipt.setCallerEnergyMergedWindowSize(account.getWindowSize(ENERGY)); rootRepository.updateAccount(account.createDbKey(), account); } - return min(availableEnergy, energyFromFeeLimit); + return min(availableEnergy, energyFromFeeLimit, VMConfig.allowStrictMath2()); } @@ -598,9 +603,10 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe } // can change the calc way long leftEnergyFromFreeze = rootRepository.getAccountLeftEnergyFromFreeze(account); - callValue = max(callValue, 0); - long energyFromBalance = Math - .floorDiv(max(account.getBalance() - callValue, 0), sunPerEnergy); + boolean isStrict2 = VMConfig.allowStrictMath2(); + callValue = max(callValue, 0, isStrict2); + long energyFromBalance = floorDiv(max( + account.getBalance() - callValue, 0, isStrict2), sunPerEnergy, isStrict2); long energyFromFeeLimit; long totalBalanceForEnergyFreeze = account.getAllFrozenBalanceForEnergy(); @@ -619,13 +625,14 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe .multiply(BigInteger.valueOf(feeLimit)) .divide(BigInteger.valueOf(totalBalanceForEnergyFreeze)).longValueExact(); } else { - energyFromFeeLimit = Math - .addExact(leftEnergyFromFreeze, - (feeLimit - leftBalanceForEnergyFreeze) / sunPerEnergy); + energyFromFeeLimit = addExact( + leftEnergyFromFreeze, (feeLimit - leftBalanceForEnergyFreeze) / sunPerEnergy, + VMConfig.allowStrictMath2()); } } - return min(Math.addExact(leftEnergyFromFreeze, energyFromBalance), energyFromFeeLimit); + return min(addExact(leftEnergyFromFreeze, energyFromBalance, + VMConfig.allowStrictMath2()), energyFromFeeLimit, VMConfig.allowStrictMath2()); } public long getTotalEnergyLimit(AccountCapsule creator, AccountCapsule caller, @@ -700,7 +707,8 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu long creatorEnergyLimit = 0; ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); - long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent(); + long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent( + VMConfig.allowStrictMath2()); long originEnergyLimit = contractCapsule.getOriginEnergyLimit(); if (originEnergyLimit < 0) { @@ -715,7 +723,8 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu } } if (consumeUserResourcePercent <= 0) { - creatorEnergyLimit = min(originEnergyLeft, originEnergyLimit); + creatorEnergyLimit = min(originEnergyLeft, originEnergyLimit, + VMConfig.allowStrictMath2()); } else { if (consumeUserResourcePercent < VMConstant.ONE_HUNDRED) { // creatorEnergyLimit = @@ -726,8 +735,8 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu BigInteger.valueOf(callerEnergyLimit) .multiply(BigInteger.valueOf(VMConstant.ONE_HUNDRED - consumeUserResourcePercent)) .divide(BigInteger.valueOf(consumeUserResourcePercent)).longValueExact(), - min(originEnergyLeft, originEnergyLimit) - ); + min(originEnergyLeft, originEnergyLimit, VMConfig.allowStrictMath2()), + VMConfig.allowStrictMath2()); } } if (VMConfig.allowTvmFreezeV2()) { @@ -748,7 +757,8 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu receipt.setOriginEnergyMergedWindowSize(creator.getWindowSize(ENERGY)); rootRepository.updateAccount(creator.createDbKey(), creator); } - return Math.addExact(callerEnergyLimit, creatorEnergyLimit); + return addExact(callerEnergyLimit, creatorEnergyLimit, + VMConfig.allowStrictMath2()); } private long getTotalEnergyLimitWithFloatRatio(AccountCapsule creator, AccountCapsule caller, @@ -764,13 +774,17 @@ private long getTotalEnergyLimitWithFloatRatio(AccountCapsule creator, AccountCa ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); - long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent(); + long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent( + VMConfig.allowStrictMath2()); if (creatorEnergyLimit * consumeUserResourcePercent > (VMConstant.ONE_HUNDRED - consumeUserResourcePercent) * callerEnergyLimit) { - return Math.floorDiv(callerEnergyLimit * VMConstant.ONE_HUNDRED, consumeUserResourcePercent); + return floorDiv( + callerEnergyLimit * VMConstant.ONE_HUNDRED, consumeUserResourcePercent, + VMConfig.allowStrictMath2()); } else { - return Math.addExact(callerEnergyLimit, creatorEnergyLimit); + return addExact(callerEnergyLimit, creatorEnergyLimit, + VMConfig.allowStrictMath2()); } } diff --git a/actuator/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java b/actuator/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java index ee223a32ffa..fc908a1713f 100755 --- a/actuator/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java @@ -6,7 +6,6 @@ import com.google.protobuf.InvalidProtocolBufferException; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -140,12 +139,11 @@ private void createWitness(final WitnessCreateContract witnessCreateContract) } accountStore.put(accountCapsule.createDbKey(), accountCapsule); long cost = dynamicStore.getAccountUpgradeCost(); - Commons - .adjustBalance(accountStore, witnessCreateContract.getOwnerAddress().toByteArray(), -cost); + adjustBalance(accountStore, witnessCreateContract.getOwnerAddress().toByteArray(), -cost); if (dynamicStore.supportBlackHoleOptimization()) { dynamicStore.burnTrx(cost); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole(), +cost); + adjustBalance(accountStore, accountStore.getBlackhole(), +cost); } dynamicStore.addTotalCreateWitnessCost(cost); } diff --git a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java index 7044564b1e1..a34afa9d32e 100644 --- a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java @@ -16,6 +16,7 @@ package org.tron.core.utils; import static org.tron.common.crypto.Hash.sha3omit12; +import static org.tron.common.math.Maths.max; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_COST_BASE_SIZE; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -270,7 +271,7 @@ public static long estimateConsumeBandWidthSize(DynamicPropertiesStore dps, long DelegateResourceContract.Builder builder2 = DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); long builder2Size = builder2.build().getSerializedSize(); - long addSize = Math.max(builderSize - builder2Size, 0L); + long addSize = max(builderSize - builder2Size, 0L, dps.allowStrictMath2()); return DELEGATE_COST_BASE_SIZE + addSize; } diff --git a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java index 5c78fb89ffb..74dbaa741c3 100644 --- a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java +++ b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java @@ -1,5 +1,7 @@ package org.tron.core.vm; +import static org.tron.common.math.Maths.max; + import java.math.BigInteger; import org.tron.common.runtime.vm.DataWord; import org.tron.core.vm.config.VMConfig; @@ -248,7 +250,7 @@ public static long getMCopyCost(Program program) { int dstOffset = stack.peek().intValue(); int srcOffset = stack.get(stack.size() - 2).intValue(); - DataWord maxOffset = new DataWord(Math.max(dstOffset, srcOffset)); + DataWord maxOffset = new DataWord(max(dstOffset, srcOffset, VMConfig.allowStrictMath2())); return VERY_LOW_TIER + calcMemEnergy(oldMemSize, memNeeded(maxOffset, stack.get(stack.size() - 3)), stack.get(stack.size() - 3).longValueSafe(), Op.MCOPY); diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 79d08af1aad..53e2cba90d4 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -1,6 +1,8 @@ package org.tron.core.vm; import static java.util.Arrays.copyOfRange; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.common.runtime.vm.DataWord.WORD_SIZE; import static org.tron.common.utils.BIUtil.addSafely; import static org.tron.common.utils.BIUtil.isLessThan; @@ -624,14 +626,17 @@ public long getEnergyForData(byte[] data) { int expLen = parseLen(data, 1); int modLen = parseLen(data, 2); - byte[] expHighBytes = parseBytes(data, addSafely(ARGS_OFFSET, baseLen), Math.min(expLen, 32)); + boolean allowStrictMath2 = VMConfig.allowStrictMath2(); - long multComplexity = getMultComplexity(Math.max(baseLen, modLen)); + byte[] expHighBytes = parseBytes(data, addSafely(ARGS_OFFSET, baseLen), min(expLen, 32, + allowStrictMath2)); + + long multComplexity = getMultComplexity(max(baseLen, modLen, allowStrictMath2)); long adjExpLen = getAdjustedExponentLength(expHighBytes, expLen); // use big numbers to stay safe in case of overflow BigInteger energy = BigInteger.valueOf(multComplexity) - .multiply(BigInteger.valueOf(Math.max(adjExpLen, 1))) + .multiply(BigInteger.valueOf(max(adjExpLen, 1, allowStrictMath2))) .divide(GQUAD_DIVISOR); return isLessThan(energy, BigInteger.valueOf(Long.MAX_VALUE)) ? energy.longValueExact() diff --git a/actuator/src/main/java/org/tron/core/vm/VMUtils.java b/actuator/src/main/java/org/tron/core/vm/VMUtils.java index 1df0e0e22f1..090c4c54898 100644 --- a/actuator/src/main/java/org/tron/core/vm/VMUtils.java +++ b/actuator/src/main/java/org/tron/core/vm/VMUtils.java @@ -2,6 +2,7 @@ import static java.lang.String.format; import static org.apache.commons.codec.binary.Base64.encodeBase64String; +import static org.tron.common.math.Maths.addExact; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -169,7 +170,7 @@ public static boolean validateForSmartContract(Repository deposit, byte[] ownerA "Validate InternalTransfer error, balance is not sufficient."); } - Math.addExact(toAccount.getBalance(), amount); + addExact(toAccount.getBalance(), amount, VMConfig.allowStrictMath2()); } catch (ArithmeticException e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); @@ -230,7 +231,8 @@ public static boolean validateForSmartContract(Repository deposit, byte[] ownerA ByteArray.toStr(tokenIdWithoutLeadingZero)); if (assetBalance != null) { try { - assetBalance = Math.addExact(assetBalance, amount); //check if overflow + addExact(assetBalance, amount, + VMConfig.allowStrictMath2()); //check if overflow } catch (Exception e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index 5c4acb31bae..508bedc34dc 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -42,6 +42,7 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowEnergyAdjustment(ds.getAllowEnergyAdjustment()); VMConfig.initAllowStrictMath(ds.getAllowStrictMath()); VMConfig.initAllowTvmCancun(ds.getAllowTvmCancun()); + VMConfig.initAllowStrictMath2(ds.getConsensusLogicOptimization()); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java index bb0d4e8297c..164f9711a20 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java @@ -54,6 +54,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra throw new ContractValidateException("delegateBalance must be greater than or equal to 1 TRX"); } + boolean allowStrictMath2 = dynamicStore.allowStrictMath2(); switch (param.getResourceType()) { case BANDWIDTH: { BandwidthProcessor processor = new BandwidthProcessor(ChainBaseManager.getInstance()); @@ -62,7 +63,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra long netUsage = (long) (ownerCapsule.getNetUsage() * TRX_PRECISION * ((double) (repo.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, allowStrictMath2); if (ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage < delegateBalance) { throw new ContractValidateException( @@ -78,7 +79,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (repo.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); - long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage); + long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage, allowStrictMath2); if (ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage < delegateBalance) { throw new ContractValidateException( diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java index d521e596e3e..fc95f23cc03 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java @@ -1,5 +1,6 @@ package org.tron.core.vm.nativecontract; +import static org.tron.common.math.Maths.min; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -21,6 +22,7 @@ import org.tron.core.exception.ContractValidateException; import org.tron.core.store.DelegatedResourceAccountIndexStore; import org.tron.core.store.DynamicPropertiesStore; +import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.nativecontract.param.UnDelegateResourceParam; import org.tron.core.vm.repository.Repository; @@ -115,7 +117,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) { * dynamicStore.getTotalNetLimit() / repo.getTotalNetWeight()); transferUsage = (long) (receiverCapsule.getNetUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForBandwidth())); - transferUsage = Math.min(unDelegateMaxUsage, transferUsage); + transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.allowStrictMath2()); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForBandwidth(-unDelegateBalance); } @@ -139,7 +141,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) { * dynamicStore.getTotalEnergyCurrentLimit() / repo.getTotalEnergyWeight()); transferUsage = (long) (receiverCapsule.getEnergyUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForEnergy())); - transferUsage = Math.min(unDelegateMaxUsage, transferUsage); + transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.allowStrictMath2()); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForEnergy(-unDelegateBalance); } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java index 211784d279b..2167635a28f 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java @@ -136,10 +136,12 @@ public long execute(UnfreezeBalanceParam param, Repository repo) { if (receiverCapsule != null) { switch (param.getResourceType()) { case BANDWIDTH: - receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForBandwidth(-unfreezeBalance); + receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForBandwidth(-unfreezeBalance, + VMConfig.allowStrictMath2()); break; case ENERGY: - receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForEnergy(-unfreezeBalance); + receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForEnergy(-unfreezeBalance, + VMConfig.allowStrictMath2()); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/vm/program/Memory.java b/actuator/src/main/java/org/tron/core/vm/program/Memory.java index 8f263ca7344..70e4005a54a 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Memory.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Memory.java @@ -1,14 +1,16 @@ package org.tron.core.vm.program; -import static java.lang.Math.ceil; -import static java.lang.Math.min; import static java.lang.String.format; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.ceil; +import static org.tron.common.math.Maths.min; import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; import static org.tron.common.utils.ByteUtil.oneByteToHexString; import java.util.LinkedList; import java.util.List; import org.tron.common.runtime.vm.DataWord; +import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.listener.ProgramListener; import org.tron.core.vm.program.listener.ProgramListenerAware; @@ -103,17 +105,17 @@ public void extend(int address, int size) { if (size <= 0) { return; } - - final int newSize = Math.addExact(address, size); + boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + final int newSize = addExact(address, size, allowStrictMath2); int toAllocate = newSize - internalSize(); if (toAllocate > 0) { - addChunks((int) ceil((double) toAllocate / CHUNK_SIZE)); + addChunks((int) ceil((double) toAllocate / CHUNK_SIZE, allowStrictMath2)); } toAllocate = newSize - softSize; if (toAllocate > 0) { - toAllocate = (int) ceil((double) toAllocate / WORD_SIZE) * WORD_SIZE; - softSize = Math.addExact(softSize, toAllocate); + toAllocate = (int) ceil((double) toAllocate / WORD_SIZE, allowStrictMath2) * WORD_SIZE; + softSize = addExact(softSize, toAllocate, allowStrictMath2); if (programListener != null) { programListener.onMemoryExtend(toAllocate); @@ -192,7 +194,7 @@ public void copy(int destPos, int srcPos, int size) { private int captureMax(int chunkIndex, int chunkOffset, int size, byte[] src, int srcPos) { byte[] chunk = chunks.get(chunkIndex); - int toCapture = min(size, chunk.length - chunkOffset); + int toCapture = min(size, chunk.length - chunkOffset, VMConfig.allowStrictMath2()); System.arraycopy(src, srcPos, chunk, chunkOffset, toCapture); return toCapture; @@ -201,7 +203,7 @@ private int captureMax(int chunkIndex, int chunkOffset, int size, byte[] src, in private int grabMax(int chunkIndex, int chunkOffset, int size, byte[] dest, int destPos) { byte[] chunk = chunks.get(chunkIndex); - int toGrab = min(size, chunk.length - chunkOffset); + int toGrab = min(size, chunk.length - chunkOffset, VMConfig.allowStrictMath2()); System.arraycopy(chunk, chunkOffset, dest, destPos, toGrab); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 9dda3ed6b7f..28e501feb78 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -1,12 +1,15 @@ package org.tron.core.vm.program; -import static java.lang.StrictMath.min; import static java.lang.String.format; import static org.apache.commons.lang3.ArrayUtils.EMPTY_BYTE_ARRAY; import static org.apache.commons.lang3.ArrayUtils.getLength; import static org.apache.commons.lang3.ArrayUtils.isEmpty; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; import static org.apache.commons.lang3.ArrayUtils.nullToEmpty; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; +import static org.tron.common.math.Maths.multiplyExact; import static org.tron.common.utils.ByteUtil.stripLeadingZeroes; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -159,11 +162,13 @@ public Program(byte[] ops, byte[] codeAddress, ProgramInvoke programInvoke, this.nonce = internalTransaction.getNonce(); } + @SuppressWarnings("unused") static String formatBinData(byte[] binData, int startPC) { StringBuilder ret = new StringBuilder(); for (int i = 0; i < binData.length; i += 16) { ret.append(Utils.align("" + Integer.toHexString(startPC + (i)) + ":", ' ', 8, false)); - ret.append(Hex.toHexString(binData, i, min(16, binData.length - i))).append('\n'); + ret.append(Hex.toHexString(binData, i, min(16, binData.length - i, + VMConfig.allowStrictMath2()))).append('\n'); } return ret.toString(); } @@ -633,7 +638,7 @@ private void withdrawRewardAndCancelVote(byte[] owner, Repository repo) { long balance = ownerCapsule.getBalance(); long allowance = ownerCapsule.getAllowance(); ownerCapsule.setInstance(ownerCapsule.getInstance().toBuilder() - .setBalance(Math.addExact(balance, allowance)) + .setBalance(addExact(balance, allowance, VMConfig.allowStrictMath2())) .setAllowance(0) .setLatestWithdrawTime(getTimestamp().longValue() * 1000) .build()); @@ -1231,7 +1236,8 @@ public DataWord getContractAddress() { public DataWord getBlockHash(int index) { if (index < this.getNumber().longValue() - && index >= Math.max(256, this.getNumber().longValue()) - 256) { + && index >= max(256, this.getNumber().longValue(), + VMConfig.allowStrictMath2()) - 256) { BlockCapsule blockCapsule = contractState.getBlockByNum(index); @@ -2155,11 +2161,13 @@ public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, try { VoteWitnessParam param = new VoteWitnessParam(); param.setVoterAddress(owner); - - byte[] witnessArrayData = memoryChunk(Math.addExact(witnessArrayOffset, DataWord.WORD_SIZE), - Math.multiplyExact(witnessArrayLength, DataWord.WORD_SIZE)); - byte[] amountArrayData = memoryChunk(Math.addExact(amountArrayOffset, DataWord.WORD_SIZE), - Math.multiplyExact(amountArrayLength, DataWord.WORD_SIZE)); + boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + byte[] witnessArrayData = memoryChunk( + addExact(witnessArrayOffset, DataWord.WORD_SIZE, allowStrictMath2), + multiplyExact(witnessArrayLength, DataWord.WORD_SIZE, allowStrictMath2)); + byte[] amountArrayData = memoryChunk( + addExact(amountArrayOffset, DataWord.WORD_SIZE, allowStrictMath2), + multiplyExact(amountArrayLength, DataWord.WORD_SIZE, allowStrictMath2)); for (int i = 0; i < witnessArrayLength; i++) { DataWord witness = new DataWord(Arrays.copyOfRange(witnessArrayData, @@ -2235,7 +2243,8 @@ public long updateContextContractFactor() { VMConfig.getDynamicEnergyThreshold(), VMConfig.getDynamicEnergyIncreaseFactor(), VMConfig.getDynamicEnergyMaxFactor(), - VMConfig.allowStrictMath())) { + VMConfig.allowStrictMath(), + VMConfig.allowStrictMath2())) { contractState.updateContractState(getContextAddress(), contractStateCapsule ); } diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index 7fcfbe8ef78..321efb729b9 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -1,6 +1,8 @@ package org.tron.core.vm.repository; -import static java.lang.Long.max; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.round; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -187,7 +189,7 @@ public long getAccountLeftEnergyFromFreeze(AccountCapsule accountCapsule) { long newEnergyUsage = recover(energyUsage, latestConsumeTime, now, windowSize); - return max(energyLimit - newEnergyUsage, 0); // us + return max(energyLimit - newEnergyUsage, 0, VMConfig.allowStrictMath2()); // us } @Override @@ -709,7 +711,7 @@ public long addBalance(byte[] address, long value) { StringUtil.createReadableString(accountCapsule.createDbKey()) + " insufficient balance"); } - accountCapsule.setBalance(Math.addExact(balance, value)); + accountCapsule.setBalance(addExact(balance, value, VMConfig.allowStrictMath2())); Key key = Key.create(address); accountCache.put(key, Value.create(accountCapsule, accountCache.get(key).getType().addType(Type.DIRTY))); @@ -875,7 +877,7 @@ private long increase(long lastUsage, long usage, long lastTime, long now, long if (lastTime + windowSize > now) { long delta = now - lastTime; double decay = (windowSize - delta) / (double) windowSize; - averageLastUsage = Math.round(averageLastUsage * decay); + averageLastUsage = round(averageLastUsage * decay, VMConfig.allowStrictMath2()); } else { averageLastUsage = 0; } diff --git a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java index 7bc760f9edf..753313afe43 100644 --- a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java +++ b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java @@ -1,5 +1,8 @@ package org.tron.core.vm.utils; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; + import java.util.List; import java.util.stream.Collectors; @@ -132,7 +135,8 @@ public static long queryAvailableUnfreezeV2Size(byte[] address, Repository repos long now = repository.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(); int unfreezingV2Count = accountCapsule.getUnfreezingV2Count(now); - return Long.max(UnfreezeBalanceV2Actuator.getUNFREEZE_MAX_TIMES() - unfreezingV2Count, 0L); + return max(UnfreezeBalanceV2Actuator.getUNFREEZE_MAX_TIMES() - unfreezingV2Count, 0L, + VMConfig.allowStrictMath2()); } public static long queryDelegatableResource(byte[] address, long type, Repository repository) { @@ -140,6 +144,7 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return 0L; } + boolean allowStrictMath2 = VMConfig.allowStrictMath2(); AccountCapsule accountCapsule = repository.getAccount(address); if (accountCapsule == null) { return 0L; @@ -161,8 +166,8 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return frozenV2Resource; } - long v2NetUsage = getV2NetUsage(accountCapsule, usage); - return Math.max(0L, frozenV2Resource - v2NetUsage); + long v2NetUsage = getV2NetUsage(accountCapsule, usage, allowStrictMath2); + return max(0L, frozenV2Resource - v2NetUsage, allowStrictMath2); } if (type == 1) { @@ -181,8 +186,8 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return frozenV2Resource; } - long v2EnergyUsage = getV2EnergyUsage(accountCapsule, usage); - return Math.max(0L, frozenV2Resource - v2EnergyUsage); + long v2EnergyUsage = getV2EnergyUsage(accountCapsule, usage, allowStrictMath2); + return max(0L, frozenV2Resource - v2EnergyUsage, allowStrictMath2); } return 0L; @@ -218,7 +223,7 @@ public static Triple checkUndelegateResource(byte[] address, l return Triple.of(0L, 0L, 0L); } - amount = Math.min(amount, resourceLimit); + amount = min(amount, resourceLimit, VMConfig.allowStrictMath2()); if (resourceLimit <= usagePair.getLeft()) { return Triple.of(0L, amount, usagePair.getRight()); } @@ -238,20 +243,22 @@ private static List getTotalWithdrawList(List{@code b}. - */ - public static double pow(double a, double b, boolean useStrictMath) { - return useStrictMath ? StrictMathWrapper.pow(a, b) : MathWrapper.pow(a, b); - } -} diff --git a/chainbase/src/main/java/org/tron/common/utils/Commons.java b/chainbase/src/main/java/org/tron/common/utils/Commons.java index 55542d494b4..6bcff7ec6e9 100644 --- a/chainbase/src/main/java/org/tron/common/utils/Commons.java +++ b/chainbase/src/main/java/org/tron/common/utils/Commons.java @@ -1,5 +1,8 @@ package org.tron.common.utils; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.subtractExact; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.tron.common.parameter.CommonParameter; @@ -55,16 +58,18 @@ public static byte[] decodeFromBase58Check(String addressBase58) { return address; } - public static void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) + public static void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount, + boolean useStrict) throws BalanceInsufficientException { AccountCapsule account = accountStore.getUnchecked(accountAddress); - adjustBalance(accountStore, account, amount); + adjustBalance(accountStore, account, amount, useStrict); } /** * judge balance. */ - public static void adjustBalance(AccountStore accountStore, AccountCapsule account, long amount) + public static void adjustBalance(AccountStore accountStore, AccountCapsule account, long amount, + boolean useStrict) throws BalanceInsufficientException { long balance = account.getBalance(); @@ -77,7 +82,7 @@ public static void adjustBalance(AccountStore accountStore, AccountCapsule accou String.format("%s insufficient balance, balance: %d, amount: %d", StringUtil.createReadableString(account.createDbKey()), balance, -amount)); } - account.setBalance(Math.addExact(balance, amount)); + account.setBalance(addExact(balance, amount, useStrict)); accountStore.put(account.getAddress().toByteArray(), account); } @@ -137,8 +142,9 @@ public static void adjustAssetBalanceV2(AccountCapsule account, String AssetID, public static void adjustTotalShieldedPoolValue(long valueBalance, DynamicPropertiesStore dynamicPropertiesStore) throws BalanceInsufficientException { - long totalShieldedPoolValue = Math - .subtractExact(dynamicPropertiesStore.getTotalShieldedPoolValue(), valueBalance); + long totalShieldedPoolValue = subtractExact( + dynamicPropertiesStore.getTotalShieldedPoolValue(), valueBalance, + dynamicPropertiesStore.allowStrictMath2()); if (totalShieldedPoolValue < 0) { throw new BalanceInsufficientException(String.format( "total shielded pool value can not below 0, actual: %d", totalShieldedPoolValue)); diff --git a/chainbase/src/main/java/org/tron/common/utils/ForkController.java b/chainbase/src/main/java/org/tron/common/utils/ForkController.java index 7cbac28e781..0a782b31e5b 100644 --- a/chainbase/src/main/java/org/tron/common/utils/ForkController.java +++ b/chainbase/src/main/java/org/tron/common/utils/ForkController.java @@ -1,5 +1,6 @@ package org.tron.common.utils; +import static org.tron.common.math.Maths.ceil; import static org.tron.common.utils.StringUtil.encode58Check; import com.google.common.collect.Maps; @@ -98,8 +99,8 @@ private boolean passNew(int version) { ++count; } } - return count >= Math - .ceil((double) versionEnum.getHardForkRate() * stats.length / 100); + return count >= ceil((double) versionEnum.getHardForkRate() * stats.length / 100, + manager.getDynamicPropertiesStore().allowStrictMath2()); } diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index b60fed63cda..26ee5bab34b 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -15,9 +15,23 @@ package org.tron.core.capsule; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.subtractExact; +import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; +import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; +import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; +import static org.tron.protos.contract.Common.ResourceCode; +import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; +import static org.tron.protos.contract.Common.ResourceCode.ENERGY; +import static org.tron.protos.contract.Common.ResourceCode.TRON_POWER; + import com.google.common.collect.Maps; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; +import java.util.List; +import java.util.Map; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.tron.common.utils.ByteArray; @@ -27,8 +41,8 @@ import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Account.AccountResource; import org.tron.protos.Protocol.Account.Builder; -import org.tron.protos.Protocol.Account.Frozen; import org.tron.protos.Protocol.Account.FreezeV2; +import org.tron.protos.Protocol.Account.Frozen; import org.tron.protos.Protocol.Account.UnFreezeV2; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Key; @@ -38,19 +52,6 @@ import org.tron.protos.contract.AccountContract.AccountCreateContract; import org.tron.protos.contract.AccountContract.AccountUpdateContract; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static java.lang.Math.ceil; -import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; -import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; -import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; -import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; -import static org.tron.protos.contract.Common.ResourceCode.ENERGY; -import static org.tron.protos.contract.Common.ResourceCode.TRON_POWER; -import static org.tron.protos.contract.Common.ResourceCode; - @Slf4j(topic = "capsule") public class AccountCapsule implements ProtoCapsule, Comparable { @@ -401,15 +402,18 @@ public void addAcquiredDelegatedFrozenV2BalanceForBandwidth(long balance) { this.account.getAcquiredDelegatedFrozenV2BalanceForBandwidth() + balance).build(); } - public void safeAddAcquiredDelegatedFrozenBalanceForBandwidth(long balance) { + public void safeAddAcquiredDelegatedFrozenBalanceForBandwidth(long balance, boolean useStrict) { this.account = this.account.toBuilder().setAcquiredDelegatedFrozenBalanceForBandwidth( - Math.max(0, this.account.getAcquiredDelegatedFrozenBalanceForBandwidth() + balance)) + max(0, this.account.getAcquiredDelegatedFrozenBalanceForBandwidth() + balance, + useStrict)) .build(); } - public void safeAddAcquiredDelegatedFrozenV2BalanceForBandwidth(long balance) { + @SuppressWarnings("unused") + public void safeAddAcquiredDelegatedFrozenV2BalanceForBandwidth(long balance, boolean useStrict) { this.account = this.account.toBuilder().setAcquiredDelegatedFrozenV2BalanceForBandwidth( - Math.max(0, this.account.getAcquiredDelegatedFrozenV2BalanceForBandwidth() + balance)) + max(0, this.account.getAcquiredDelegatedFrozenV2BalanceForBandwidth() + balance, + useStrict)) .build(); } @@ -496,10 +500,11 @@ public void addAcquiredDelegatedFrozenV2BalanceForEnergy(long balance) { this.account = this.account.toBuilder().setAccountResource(newAccountResource).build(); } - public void safeAddAcquiredDelegatedFrozenBalanceForEnergy(long balance) { + public void safeAddAcquiredDelegatedFrozenBalanceForEnergy(long balance, boolean useStrict) { AccountResource newAccountResource = getAccountResource().toBuilder() .setAcquiredDelegatedFrozenBalanceForEnergy( - Math.max(0, getAccountResource().getAcquiredDelegatedFrozenBalanceForEnergy() + balance)) + max(0, getAccountResource().getAcquiredDelegatedFrozenBalanceForEnergy() + balance, + useStrict)) .build(); this.account = this.account.toBuilder() @@ -507,10 +512,11 @@ public void safeAddAcquiredDelegatedFrozenBalanceForEnergy(long balance) { .build(); } - public void safeAddAcquiredDelegatedFrozenV2BalanceForEnergy(long balance) { + @SuppressWarnings("unused") + public void safeAddAcquiredDelegatedFrozenV2BalanceForEnergy(long balance, boolean useStrict) { AccountResource newAccountResource = getAccountResource().toBuilder() - .setAcquiredDelegatedFrozenV2BalanceForEnergy(Math.max(0, getAccountResource() - .getAcquiredDelegatedFrozenV2BalanceForEnergy() + balance)).build(); + .setAcquiredDelegatedFrozenV2BalanceForEnergy(max(0, getAccountResource() + .getAcquiredDelegatedFrozenV2BalanceForEnergy() + balance, useStrict)).build(); this.account = this.account.toBuilder().setAccountResource(newAccountResource).build(); } @@ -711,14 +717,15 @@ public boolean assetBalanceEnoughV2(byte[] key, long amount, return amount > 0 && null != currentAmount && amount <= currentAmount; } - public boolean addAssetAmount(byte[] key, long amount) { + public boolean addAssetAmount(byte[] key, long amount, boolean useStrict) { Map assetMap = this.account.getAssetMap(); String nameKey = ByteArray.toStr(key); Long currentAmount = assetMap.get(nameKey); if (currentAmount == null) { currentAmount = 0L; } - this.account = this.account.toBuilder().putAsset(nameKey, Math.addExact(currentAmount, amount)) + this.account = this.account.toBuilder().putAsset(nameKey, + addExact(currentAmount, amount, useStrict)) .build(); return true; } @@ -726,6 +733,7 @@ public boolean addAssetAmount(byte[] key, long amount) { public boolean addAssetAmountV2(byte[] key, long amount, DynamicPropertiesStore dynamicPropertiesStore, AssetIssueStore assetIssueStore) { importAsset(key); + boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); //key is token name if (dynamicPropertiesStore.getAllowSameTokenName() == 0) { Map assetMap = this.account.getAssetMap(); @@ -737,8 +745,8 @@ public boolean addAssetAmountV2(byte[] key, long amount, currentAmount = 0L; } this.account = this.account.toBuilder() - .putAsset(nameKey, Math.addExact(currentAmount, amount)) - .putAssetV2(tokenID, Math.addExact(currentAmount, amount)) + .putAsset(nameKey, addExact(currentAmount, amount, useStrict2)) + .putAssetV2(tokenID, addExact(currentAmount, amount, useStrict2)) .build(); } //key is token id @@ -750,19 +758,19 @@ public boolean addAssetAmountV2(byte[] key, long amount, currentAmount = 0L; } this.account = this.account.toBuilder() - .putAssetV2(tokenIDStr, Math.addExact(currentAmount, amount)) + .putAssetV2(tokenIDStr, addExact(currentAmount, amount, useStrict2)) .build(); } return true; } - public boolean reduceAssetAmount(byte[] key, long amount) { + public boolean reduceAssetAmount(byte[] key, long amount, boolean useStrict2) { Map assetMap = this.account.getAssetMap(); String nameKey = ByteArray.toStr(key); Long currentAmount = assetMap.get(nameKey); if (amount > 0 && null != currentAmount && amount <= currentAmount) { this.account = this.account.toBuilder() - .putAsset(nameKey, Math.subtractExact(currentAmount, amount)).build(); + .putAsset(nameKey, subtractExact(currentAmount, amount, useStrict2)).build(); return true; } @@ -773,6 +781,7 @@ public boolean reduceAssetAmountV2(byte[] key, long amount, DynamicPropertiesStore dynamicPropertiesStore, AssetIssueStore assetIssueStore) { importAsset(key); //key is token name + boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); if (dynamicPropertiesStore.getAllowSameTokenName() == 0) { Map assetMap = this.account.getAssetMap(); AssetIssueCapsule assetIssueCapsule = assetIssueStore.get(key); @@ -781,8 +790,8 @@ public boolean reduceAssetAmountV2(byte[] key, long amount, Long currentAmount = assetMap.get(nameKey); if (amount > 0 && null != currentAmount && amount <= currentAmount) { this.account = this.account.toBuilder() - .putAsset(nameKey, Math.subtractExact(currentAmount, amount)) - .putAssetV2(tokenID, Math.subtractExact(currentAmount, amount)) + .putAsset(nameKey, subtractExact(currentAmount, amount, useStrict2)) + .putAssetV2(tokenID, subtractExact(currentAmount, amount, useStrict2)) .build(); return true; } @@ -794,7 +803,7 @@ public boolean reduceAssetAmountV2(byte[] key, long amount, Long currentAmount = assetMapV2.get(tokenID); if (amount > 0 && null != currentAmount && amount <= currentAmount) { this.account = this.account.toBuilder() - .putAssetV2(tokenID, Math.subtractExact(currentAmount, amount)) + .putAssetV2(tokenID, subtractExact(currentAmount, amount, useStrict2)) .build(); return true; } diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java index cb6292ed290..be73a338b90 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java @@ -15,8 +15,8 @@ package org.tron.core.capsule; -import static java.lang.Math.max; -import static java.lang.Math.min; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import com.google.protobuf.Any; import com.google.protobuf.ByteString; @@ -109,9 +109,9 @@ public byte[] getOriginAddress() { return this.smartContract.getOriginAddress().toByteArray(); } - public long getConsumeUserResourcePercent() { + public long getConsumeUserResourcePercent(boolean useStrictMath2) { long percent = this.smartContract.getConsumeUserResourcePercent(); - return max(0, min(percent, Constant.ONE_HUNDRED)); + return max(0, min(percent, Constant.ONE_HUNDRED, useStrictMath2), useStrictMath2); } public long getOriginEnergyLimit() { diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java index 8ebb86ea332..8deeebaa758 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java @@ -1,11 +1,13 @@ package org.tron.core.capsule; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; +import static org.tron.common.math.Maths.pow; import static org.tron.core.Constant.DYNAMIC_ENERGY_DECREASE_DIVISION; import static org.tron.core.Constant.DYNAMIC_ENERGY_FACTOR_DECIMAL; import com.google.protobuf.InvalidProtocolBufferException; import lombok.extern.slf4j.Slf4j; -import org.tron.common.math.Maths; import org.tron.core.store.DynamicPropertiesStore; import org.tron.protos.contract.SmartContractOuterClass; import org.tron.protos.contract.SmartContractOuterClass.ContractState; @@ -79,12 +81,14 @@ public boolean catchUpToCycle(DynamicPropertiesStore dps) { dps.getDynamicEnergyThreshold(), dps.getDynamicEnergyIncreaseFactor(), dps.getDynamicEnergyMaxFactor(), - dps.allowStrictMath() + dps.allowStrictMath(), + dps.allowStrictMath2() ); } public boolean catchUpToCycle( - long newCycle, long threshold, long increaseFactor, long maxFactor, boolean useStrictMath + long newCycle, long threshold, long increaseFactor, long maxFactor, + boolean useStrictMath, boolean useStrictMath2 ) { long lastCycle = getUpdateCycle(); @@ -108,9 +112,10 @@ public boolean catchUpToCycle( double increasePercent = 1 + (double) increaseFactor / precisionFactor; this.contractState = ContractState.newBuilder() .setUpdateCycle(lastCycle) - .setEnergyFactor(Math.min( + .setEnergyFactor(min( maxFactor, - (long) ((getEnergyFactor() + precisionFactor) * increasePercent) - precisionFactor)) + (long) ((getEnergyFactor() + precisionFactor) * increasePercent) - precisionFactor, + useStrictMath2)) .build(); } @@ -121,7 +126,7 @@ public boolean catchUpToCycle( } // Calc the decrease percent (decrease factor [75% ~ 100%]) - double decreasePercent = Maths.pow( + double decreasePercent = pow( 1 - (double) increaseFactor / DYNAMIC_ENERGY_DECREASE_DIVISION / precisionFactor, cycleCount, useStrictMath ); @@ -132,9 +137,10 @@ public boolean catchUpToCycle( // That means we merge this special case to normal cases) this.contractState = ContractState.newBuilder() .setUpdateCycle(newCycle) - .setEnergyFactor(Math.max( + .setEnergyFactor(max( 0, - (long) ((getEnergyFactor() + precisionFactor) * decreasePercent) - precisionFactor)) + (long) ((getEnergyFactor() + precisionFactor) * decreasePercent) - precisionFactor, + useStrictMath2)) .build(); return true; diff --git a/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java index 7d003b6b0e4..29d80cebe3f 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java @@ -1,5 +1,8 @@ package org.tron.core.capsule; +import static org.tron.common.math.Maths.min; +import static org.tron.common.math.Maths.multiplyExact; + import java.util.Objects; import lombok.Getter; import lombok.Setter; @@ -215,12 +218,13 @@ public void payEnergyBill(DynamicPropertiesStore dynamicPropertiesStore, receipt.getEnergyUsageTotal(), receipt.getResult(), energyProcessor, now); return; } + boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); if ((!Objects.isNull(origin)) && caller.getAddress().equals(origin.getAddress())) { payEnergyBill(dynamicPropertiesStore, accountStore, forkController, caller, receipt.getEnergyUsageTotal(), receipt.getResult(), energyProcessor, now); } else { - long originUsage = Math.multiplyExact(receipt.getEnergyUsageTotal(), percent) / 100; + long originUsage = multiplyExact(receipt.getEnergyUsageTotal(), percent, useStrict2) / 100; originUsage = getOriginUsage(dynamicPropertiesStore, origin, originEnergyLimit, energyProcessor, originUsage); @@ -236,17 +240,18 @@ public void payEnergyBill(DynamicPropertiesStore dynamicPropertiesStore, private long getOriginUsage(DynamicPropertiesStore dynamicPropertiesStore, AccountCapsule origin, long originEnergyLimit, EnergyProcessor energyProcessor, long originUsage) { - + boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); if (dynamicPropertiesStore.getAllowTvmFreeze() == 1 || dynamicPropertiesStore.supportUnfreezeDelay()) { - return Math.min(originUsage, Math.min(originEnergyLeft, originEnergyLimit)); + return min(originUsage, min(originEnergyLeft, originEnergyLimit, useStrict2), useStrict2); } if (checkForEnergyLimit(dynamicPropertiesStore)) { - return Math.min(originUsage, - Math.min(energyProcessor.getAccountLeftEnergyFromFreeze(origin), originEnergyLimit)); + return min(originUsage, + min(energyProcessor.getAccountLeftEnergyFromFreeze(origin), originEnergyLimit, + useStrict2), useStrict2); } - return Math.min(originUsage, energyProcessor.getAccountLeftEnergyFromFreeze(origin)); + return min(originUsage, energyProcessor.getAccountLeftEnergyFromFreeze(origin), useStrict2); } private void payEnergyBill( @@ -301,7 +306,7 @@ private void payEnergyBill( } else { //send to blackHole Commons.adjustBalance(accountStore, accountStore.getBlackhole(), - energyFee); + energyFee, dynamicPropertiesStore.allowStrictMath2()); } } diff --git a/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java b/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java index f345a96df81..fb86cb1f456 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java +++ b/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java @@ -15,6 +15,10 @@ package org.tron.core.capsule.utils; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.floorDiv; +import static org.tron.common.math.Maths.multiplyExact; + import com.google.protobuf.ByteString; import java.math.BigInteger; import java.util.Arrays; @@ -230,8 +234,8 @@ public static byte[] createPairKey(byte[] sellTokenId, byte[] buyTokenId) { public static int comparePrice(long price1SellQuantity, long price1BuyQuantity, long price2SellQuantity, long price2BuyQuantity) { try { - return Long.compare(Math.multiplyExact(price1BuyQuantity, price2SellQuantity), - Math.multiplyExact(price2BuyQuantity, price1SellQuantity)); + return Long.compare(multiplyExact(price1BuyQuantity, price2SellQuantity, true), + multiplyExact(price2BuyQuantity, price1SellQuantity, true)); } catch (ArithmeticException ex) { // do nothing here, because we will use BigInteger to compute again @@ -246,25 +250,6 @@ public static int comparePrice(long price1SellQuantity, long price1BuyQuantity, .compareTo(price2BuyQuantityBI.multiply(price1SellQuantityBI)); } - /** - * ex. - * for sellToken is A, buyToken is TRX. - * price_A_maker * sellQuantity_maker = Price_TRX * buyQuantity_maker - * ==> price_A_maker = Price_TRX * buyQuantity_maker/sellQuantity_maker - * - * price_A_maker_1 < price_A_maker_2 - * ==> buyQuantity_maker_1/sellQuantity_maker_1 < buyQuantity_maker_2/sellQuantity_maker_2 - * ==> buyQuantity_maker_1*sellQuantity_maker_2 < buyQuantity_maker_2 * sellQuantity_maker_1 - */ - public static int comparePrice(MarketPrice price1, MarketPrice price2) { - return comparePrice(price1.getSellTokenQuantity(), price1.getBuyTokenQuantity(), - price2.getSellTokenQuantity(), price2.getBuyTokenQuantity()); - } - - public static boolean isLowerPrice(MarketPrice price1, MarketPrice price2) { - return comparePrice(price1, price2) == -1; - } - /** * if takerPrice >= makerPrice, return True * note: here are two different token pairs @@ -297,10 +282,10 @@ public static void updateOrderState(MarketOrderCapsule orderCapsule, } } - public static long multiplyAndDivide(long a, long b, long c) { + public static long multiplyAndDivide(long a, long b, long c, boolean useStrictMath2) { try { - long tmp = Math.multiplyExact(a, b); - return Math.floorDiv(tmp, c); + long tmp = multiplyExact(a, b, useStrictMath2); + return floorDiv(tmp, c, useStrictMath2); } catch (ArithmeticException ex) { // do nothing here, because we will use BigInteger to compute again } @@ -320,8 +305,9 @@ public static void returnSellTokenRemain(MarketOrderCapsule orderCapsule, byte[] sellTokenId = orderCapsule.getSellTokenId(); long sellTokenQuantityRemain = orderCapsule.getSellTokenQuantityRemain(); if (Arrays.equals(sellTokenId, "_".getBytes())) { - accountCapsule.setBalance(Math.addExact( - accountCapsule.getBalance(), sellTokenQuantityRemain)); + accountCapsule.setBalance(addExact( + accountCapsule.getBalance(), sellTokenQuantityRemain, + dynamicStore.allowStrictMath2())); } else { accountCapsule .addAssetAmountV2(sellTokenId, sellTokenQuantityRemain, dynamicStore, assetIssueStore); diff --git a/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java b/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java index 5cd0f796374..ef326977451 100644 --- a/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java @@ -1,6 +1,7 @@ package org.tron.core.db; -import static java.lang.Long.max; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -78,11 +79,10 @@ public void updateAdaptiveTotalEnergyLimit() { / AdaptiveResourceLimitConstants.EXPAND_RATE_DENOMINATOR; // logger.info(totalEnergyAverageUsage + "<" + targetTotalEnergyLimit + "\n" + result); } - - result = Math.min( - Math.max(result, totalEnergyLimit), - totalEnergyLimit * dynamicPropertiesStore.getAdaptiveResourceLimitMultiplier() - ); + boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + result = min(max(result, totalEnergyLimit, useStrict2), + totalEnergyLimit * dynamicPropertiesStore.getAdaptiveResourceLimitMultiplier(), + useStrict2); dynamicPropertiesStore.saveTotalEnergyCurrentLimit(result); logger.debug("Adjust totalEnergyCurrentLimit, old: {}, new: {}.", @@ -178,7 +178,7 @@ public long getAccountLeftEnergyFromFreeze(AccountCapsule accountCapsule) { long newEnergyUsage = recovery(accountCapsule, ENERGY, energyUsage, latestConsumeTime, now); - return max(energyLimit - newEnergyUsage, 0); // us + return max(energyLimit - newEnergyUsage, 0, dynamicPropertiesStore.allowStrictMath2()); // us } private long getHeadSlot() { diff --git a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java index c1875408850..9b446079337 100644 --- a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java @@ -1,5 +1,7 @@ package org.tron.core.db; +import static org.tron.common.math.Maths.min; +import static org.tron.common.math.Maths.round; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; @@ -51,7 +53,8 @@ protected long increase(long lastUsage, long usage, long lastTime, long now, lon if (lastTime + windowSize > now) { long delta = now - lastTime; double decay = (windowSize - delta) / (double) windowSize; - averageLastUsage = Math.round(averageLastUsage * decay); + averageLastUsage = round(averageLastUsage * decay, + dynamicPropertiesStore.allowStrictMath2()); } else { averageLastUsage = 0; } @@ -79,7 +82,8 @@ public long increase(AccountCapsule accountCapsule, ResourceCode resourceCode, if (lastTime + oldWindowSize > now) { long delta = now - lastTime; double decay = (oldWindowSize - delta) / (double) oldWindowSize; - averageLastUsage = Math.round(averageLastUsage * decay); + averageLastUsage = round(averageLastUsage * decay, + dynamicPropertiesStore.allowStrictMath2()); } else { averageLastUsage = 0; } @@ -111,7 +115,8 @@ public long increaseV2(AccountCapsule accountCapsule, ResourceCode resourceCode, if (lastTime + oldWindowSize > now) { long delta = now - lastTime; double decay = (oldWindowSize - delta) / (double) oldWindowSize; - averageLastUsage = Math.round(averageLastUsage * decay); + averageLastUsage = round(averageLastUsage * decay, + dynamicPropertiesStore.allowStrictMath2()); } else { averageLastUsage = 0; } @@ -127,7 +132,8 @@ public long increaseV2(AccountCapsule accountCapsule, ResourceCode resourceCode, long remainWindowSize = oldWindowSizeV2 - (now - lastTime) * WINDOW_SIZE_PRECISION; long newWindowSize = divideCeil( remainUsage * remainWindowSize + usage * this.windowSize * WINDOW_SIZE_PRECISION, newUsage); - newWindowSize = Math.min(newWindowSize, this.windowSize * WINDOW_SIZE_PRECISION); + newWindowSize = min(newWindowSize, this.windowSize * WINDOW_SIZE_PRECISION, + dynamicPropertiesStore.allowStrictMath2()); accountCapsule.setNewWindowSizeV2(resourceCode, newWindowSize); return newUsage; } @@ -189,7 +195,8 @@ public void unDelegateIncreaseV2(AccountCapsule owner, final AccountCapsule rece divideCeil( ownerUsage * remainOwnerWindowSizeV2 + transferUsage * remainReceiverWindowSizeV2, newOwnerUsage); - newOwnerWindowSize = Math.min(newOwnerWindowSize, this.windowSize * WINDOW_SIZE_PRECISION); + newOwnerWindowSize = min(newOwnerWindowSize, this.windowSize * WINDOW_SIZE_PRECISION, + dynamicPropertiesStore.allowStrictMath2()); owner.setNewWindowSizeV2(resourceCode, newOwnerWindowSize); owner.setUsage(resourceCode, newOwnerUsage); owner.setLatestTime(resourceCode, now); @@ -216,13 +223,15 @@ protected boolean consumeFeeForBandwidth(AccountCapsule accountCapsule, long fee try { long latestOperationTime = dynamicPropertiesStore.getLatestBlockHeaderTimestamp(); accountCapsule.setLatestOperationTime(latestOperationTime); - Commons.adjustBalance(accountStore, accountCapsule, -fee); + Commons.adjustBalance(accountStore, accountCapsule, -fee, + dynamicPropertiesStore.allowStrictMath2()); if (dynamicPropertiesStore.supportTransactionFeePool()) { dynamicPropertiesStore.addTransactionFeePool(fee); } else if (dynamicPropertiesStore.supportBlackHoleOptimization()) { dynamicPropertiesStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee); + Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee, + dynamicPropertiesStore.allowStrictMath2()); } return true; @@ -235,11 +244,13 @@ protected boolean consumeFeeForNewAccount(AccountCapsule accountCapsule, long fe try { long latestOperationTime = dynamicPropertiesStore.getLatestBlockHeaderTimestamp(); accountCapsule.setLatestOperationTime(latestOperationTime); - Commons.adjustBalance(accountStore, accountCapsule, -fee); + Commons.adjustBalance(accountStore, accountCapsule, -fee, + dynamicPropertiesStore.allowStrictMath2()); if (dynamicPropertiesStore.supportBlackHoleOptimization()) { dynamicPropertiesStore.burnTrx(fee); } else { - Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee); + Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee, + dynamicPropertiesStore.allowStrictMath2()); } return true; diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java index e9c4feb7e18..114197a3407 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java @@ -1,5 +1,7 @@ package org.tron.core.db; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE; import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CREATION_TYPE; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; @@ -244,9 +246,11 @@ public void pay() throws BalanceInsufficientException { callerAccount = callContract.getOwnerAddress().toByteArray(); originAccount = contractCapsule.getOriginAddress(); - percent = Math - .max(Constant.ONE_HUNDRED - contractCapsule.getConsumeUserResourcePercent(), 0); - percent = Math.min(percent, Constant.ONE_HUNDRED); + boolean useStrictMath2 = dynamicPropertiesStore.allowStrictMath2(); + percent = max(Constant.ONE_HUNDRED - contractCapsule.getConsumeUserResourcePercent( + useStrictMath2), 0, useStrictMath2); + percent = min(percent, Constant.ONE_HUNDRED, + useStrictMath2); originEnergyLimit = contractCapsule.getOriginEnergyLimit(); break; default: @@ -299,7 +303,7 @@ private void resetAccountUsage(AccountCapsule accountCap, // If area merging happened during suicide, use the current window size long newSize = mergedSize == currentSize ? size : currentSize; // Calc new usage by fixed x-axes - long newUsage = Long.max(0, newArea / newSize); + long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.allowStrictMath2()); // Reset account usage and window size accountCap.setEnergyUsage(newUsage); accountCap.setNewWindowSize(ENERGY, newUsage == 0 ? 0L : newSize); @@ -316,7 +320,7 @@ private void resetAccountUsageV2(AccountCapsule accountCap, long newSize = mergedSize == currentSize ? size : currentSize; long newSize2 = mergedSize == currentSize ? size2 : currentSize2; // Calc new usage by fixed x-axes - long newUsage = Long.max(0, newArea / newSize); + long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.allowStrictMath2()); // Reset account usage and window size accountCap.setEnergyUsage(newUsage); accountCap.setNewWindowSizeV2(ENERGY, newUsage == 0 ? 0L : newSize2); diff --git a/chainbase/src/main/java/org/tron/core/service/MortgageService.java b/chainbase/src/main/java/org/tron/core/service/MortgageService.java index 29ea32208eb..233c142f053 100644 --- a/chainbase/src/main/java/org/tron/core/service/MortgageService.java +++ b/chainbase/src/main/java/org/tron/core/service/MortgageService.java @@ -1,5 +1,7 @@ package org.tron.core.service; +import static org.tron.common.math.Maths.min; + import java.math.BigInteger; import java.util.List; import java.util.stream.Collectors; @@ -205,7 +207,8 @@ private long computeReward(long beginCycle, long endCycle, AccountCapsule accoun .map(vote -> new Pair<>(vote.getVoteAddress().toByteArray(), vote.getVoteCount())) .collect(Collectors.toList()); if (beginCycle < newAlgorithmCycle) { - long oldEndCycle = Math.min(endCycle, newAlgorithmCycle); + long oldEndCycle = min(endCycle, newAlgorithmCycle, + dynamicPropertiesStore.allowStrictMath2()); reward = getOldReward(beginCycle, oldEndCycle, srAddresses); beginCycle = oldEndCycle; } diff --git a/chainbase/src/main/java/org/tron/core/store/AssetIssueStore.java b/chainbase/src/main/java/org/tron/core/store/AssetIssueStore.java index d38a5f0677e..4f69a6c3c66 100644 --- a/chainbase/src/main/java/org/tron/core/store/AssetIssueStore.java +++ b/chainbase/src/main/java/org/tron/core/store/AssetIssueStore.java @@ -43,13 +43,6 @@ private List getAssetIssuesPaginated(List return null; } -// return Streams.stream(iterator()) -// .map(Entry::getValue) -// .sorted(Comparator.comparing(a -> a.getName().toStringUtf8(), String::compareTo)) -// .skip(offset) -// .limit(Math.min(limit, ASSET_ISSUE_COUNT_LIMIT_MAX)) -// .collect(Collectors.toList()); - if (assetIssueList.size() <= offset) { return null; } diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 399c3a6b292..8d1fb19ea2b 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -1,5 +1,6 @@ package org.tron.core.store; +import static org.tron.common.math.Maths.max; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; @@ -2245,7 +2246,7 @@ public void addTotalNetWeight(long amount) { long totalNetWeight = getTotalNetWeight(); totalNetWeight += amount; if (allowNewReward()) { - totalNetWeight = Math.max(0, totalNetWeight); + totalNetWeight = max(0, totalNetWeight, allowStrictMath2()); } saveTotalNetWeight(totalNetWeight); } @@ -2258,7 +2259,7 @@ public void addTotalEnergyWeight(long amount) { long totalEnergyWeight = getTotalEnergyWeight(); totalEnergyWeight += amount; if (allowNewReward()) { - totalEnergyWeight = Math.max(0, totalEnergyWeight); + totalEnergyWeight = max(0, totalEnergyWeight, allowStrictMath2()); } saveTotalEnergyWeight(totalEnergyWeight); } @@ -2271,7 +2272,7 @@ public void addTotalTronPowerWeight(long amount) { long totalWeight = getTotalTronPowerWeight(); totalWeight += amount; if (allowNewReward()) { - totalWeight = Math.max(0, totalWeight); + totalWeight = max(0, totalWeight, allowStrictMath2()); } saveTotalTronPowerWeight(totalWeight); } @@ -2896,6 +2897,10 @@ public boolean allowStrictMath() { return getAllowStrictMath() == 1L; } + public boolean allowStrictMath2() { + return this.allowConsensusLogicOptimization(); + } + public void saveConsensusLogicOptimization(long value) { this.put(CONSENSUS_LOGIC_OPTIMIZATION, new BytesCapsule(ByteArray.fromLong(value))); diff --git a/common/src/main/java/org/tron/common/math/MathWrapper.java b/common/src/main/java/org/tron/common/math/MathWrapper.java index 519dafb9d42..758a0f18370 100644 --- a/common/src/main/java/org/tron/common/math/MathWrapper.java +++ b/common/src/main/java/org/tron/common/math/MathWrapper.java @@ -11,4 +11,68 @@ public class MathWrapper { public static double pow(double a, double b) { return Math.pow(a, b); } + + public static long addExact(long x, long y) { + return Math.addExact(x, y); + } + + public static int addExact(int x, int y) { + return Math.addExact(x, y); + } + + public static long floorDiv(long x, long y) { + return Math.floorDiv(x, y); + } + + public static int multiplyExact(int x, int y) { + return Math.multiplyExact(x, y); + } + + public static long multiplyExact(long x, long y) { + return Math.multiplyExact(x, y); + } + + public static long subtractExact(long x, long y) { + return Math.subtractExact(x, y); + } + + public static int min(int a, int b) { + return Math.min(a, b); + } + + public static long min(long a, long b) { + return Math.min(a, b); + } + + public static int max(int a, int b) { + return Math.max(a, b); + } + + public static long max(long a, long b) { + return Math.max(a, b); + } + + public static int round(float a) { + return Math.round(a); + } + + public static long round(double a) { + return Math.round(a); + } + + public static double ceil(double a) { + return Math.ceil(a); + } + + public static double signum(double a) { + return Math.signum(a); + } + + public static double random() { + return Math.random(); + } + + public static long abs(long a) { + return Math.abs(a); + } } diff --git a/common/src/main/java/org/tron/common/math/Maths.java b/common/src/main/java/org/tron/common/math/Maths.java new file mode 100644 index 00000000000..f0503cee2e4 --- /dev/null +++ b/common/src/main/java/org/tron/common/math/Maths.java @@ -0,0 +1,92 @@ +package org.tron.common.math; + +/** + * This class is deprecated and should not be used in new code, + * for cross-platform consistency, please use {@link StrictMathWrapper} instead, + * especially for floating-point calculations. + */ +@Deprecated +public class Maths { + + /** + * Returns the value of the first argument raised to the power of the second argument. + * @param a the base. + * @param b the exponent. + * @return the value {@code a}{@code b}. + */ + public static double pow(double a, double b, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.pow(a, b) : MathWrapper.pow(a, b); + } + + /** + * Adds two integers together, checking for overflow. + * @param x the first value. + * @param y the second value. + * @return the sum of {@code x} and {@code y}. + * @throws ArithmeticException if the result overflows an int. + */ + public static long addExact(long x, long y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.addExact(x, y) : MathWrapper.addExact(x, y); + } + + public static int addExact(int x, int y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.addExact(x, y) : MathWrapper.addExact(x, y); + } + + public static long floorDiv(long x, long y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.floorDiv(x, y) : MathWrapper.floorDiv(x, y); + } + + public static int multiplyExact(int x, int y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.multiplyExact(x, y) : MathWrapper.multiplyExact(x, y); + } + + public static long multiplyExact(long x, long y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.multiplyExact(x, y) : MathWrapper.multiplyExact(x, y); + } + + public static long subtractExact(long x, long y, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.subtractExact(x, y) : MathWrapper.subtractExact(x, y); + } + + public static int min(int a, int b, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.min(a, b) : MathWrapper.min(a, b); + } + + public static long min(long a, long b, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.min(a, b) : MathWrapper.min(a, b); + } + + public static int max(int a, int b, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.max(a, b) : MathWrapper.max(a, b); + } + + public static long max(long a, long b, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.max(a, b) : MathWrapper.max(a, b); + } + + public static int round(float a, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.round(a) : MathWrapper.round(a); + } + + public static long round(double a, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.round(a) : MathWrapper.round(a); + } + + public static double ceil(double a, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.ceil(a) : MathWrapper.ceil(a); + } + + public static double signum(double a, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.signum(a) : MathWrapper.signum(a); + } + + public static double random(boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.random() : MathWrapper.random(); + } + + public static long abs(long a, boolean useStrictMath) { + return useStrictMath ? StrictMathWrapper.abs(a) : MathWrapper.abs(a); + } + +} diff --git a/common/src/main/java/org/tron/common/math/StrictMathWrapper.java b/common/src/main/java/org/tron/common/math/StrictMathWrapper.java index 6285f6567c0..6a4d9c4e1a6 100644 --- a/common/src/main/java/org/tron/common/math/StrictMathWrapper.java +++ b/common/src/main/java/org/tron/common/math/StrictMathWrapper.java @@ -5,4 +5,140 @@ public class StrictMathWrapper { public static double pow(double a, double b) { return StrictMath.pow(a, b); } + + /** + * *** methods are same as {@link java.lang.Math} methods, guaranteed by the call start *** + */ + + /** + * finally calls {@link java.lang.Math#addExact(long, long)} + */ + + public static long addExact(long x, long y) { + return StrictMath.addExact(x, y); + } + + /** + * finally calls {@link java.lang.Math#addExact(int, int)} + */ + + public static int addExact(int x, int y) { + return StrictMath.addExact(x, y); + } + + /** + * finally calls {@link java.lang.Math#subtractExact(long, long)} + */ + + public static long subtractExact(long x, long y) { + return StrictMath.subtractExact(x, y); + } + + /** + * finally calls {@link java.lang.Math#floorMod(long, long)} + */ + public static long multiplyExact(long x, long y) { + return StrictMath.multiplyExact(x, y); + } + + public static long multiplyExact(long x, int y) { + return multiplyExact(x, (long) y); + } + + public static int multiplyExact(int x, int y) { + return StrictMath.multiplyExact(x, y); + } + + /** + * finally calls {@link java.lang.Math#floorDiv(long, long)} + */ + public static long floorDiv(long x, long y) { + return StrictMath.floorDiv(x, y); + } + + public static long floorDiv(long x, int y) { + return floorDiv(x, (long) y); + } + + /** + * finally calls {@link java.lang.Math#min(int, int)} + */ + public static int min(int a, int b) { + return StrictMath.min(a, b); + } + + /** + * finally calls {@link java.lang.Math#min(long, long)} + */ + public static long min(long a, long b) { + return StrictMath.min(a, b); + } + + /** + * finally calls {@link java.lang.Math#max(int, int)} + */ + public static int max(int a, int b) { + return StrictMath.max(a, b); + } + + /** + * finally calls {@link java.lang.Math#max(long, long)} + */ + public static long max(long a, long b) { + return StrictMath.max(a, b); + } + + /** + * finally calls {@link java.lang.Math#round(float)} + */ + public static int round(float a) { + return StrictMath.round(a); + } + + /** + * finally calls {@link java.lang.Math#round(double)} + */ + public static long round(double a) { + return StrictMath.round(a); + } + + /** + * finally calls {@link java.lang.Math#signum(double)} + */ + public static double signum(double d) { + return StrictMath.signum(d); + } + + /** + * finally calls {@link java.lang.Math#signum(float)} + */ + public static long abs(long a) { + return StrictMath.abs(a); + } + + /** + * *** methods are same as {@link java.lang.Math} methods, guaranteed by the call end *** + */ + + /** + * *** methods are same as {@link java.lang.Math} methods by mathematical algorithms*** + * / + + + /** + * mathematical integer: ceil(i) = floor(i) = i + * @return the smallest (closest to negative infinity) double value that is greater + * than or equal to the argument and is equal to a mathematical integer. + */ + public static double ceil(double a) { + return StrictMath.ceil(a); + } + + /** + * *** methods are no matters *** + */ + public static double random() { + return StrictMath.random(); + } + } diff --git a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java index 0eb0487a534..1601dcaad28 100644 --- a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java +++ b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java @@ -17,6 +17,9 @@ */ package org.tron.common.runtime.vm; +import static org.tron.common.math.Maths.min; +import static org.tron.common.math.Maths.signum; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import java.math.BigInteger; @@ -28,6 +31,7 @@ import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.FastByteComparisons; import org.tron.core.db.ByteArrayWrapper; +import org.tron.core.vm.config.VMConfig; /** * DataWord is the 32-byte array representation of a 256-bit number Calculations can be done on this @@ -165,7 +169,7 @@ public byte[] getClonedData() { byte[] ret = ByteUtil.EMPTY_BYTE_ARRAY; if (data != null) { ret = new byte[WORD_SIZE]; - int dataSize = Math.min(data.length, WORD_SIZE); + int dataSize = min(data.length, WORD_SIZE, VMConfig.allowStrictMath2()); System.arraycopy(data, 0, ret, 0, dataSize); } return ret; @@ -484,7 +488,7 @@ public int compareTo(DataWord o) { data, 0, data.length, o.getData(), 0, o.getData().length); // Convert result into -1, 0 or 1 as is the convention - return (int) Math.signum(result); + return (int) signum(result, VMConfig.allowStrictMath2()); } public void signExtend(byte k) { diff --git a/common/src/main/java/org/tron/common/utils/ByteUtil.java b/common/src/main/java/org/tron/common/utils/ByteUtil.java index 54d637d3f01..88d4cfdf90b 100644 --- a/common/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/common/src/main/java/org/tron/common/utils/ByteUtil.java @@ -18,6 +18,8 @@ package org.tron.common.utils; +import static org.tron.common.math.Maths.min; + import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; import java.io.ByteArrayOutputStream; @@ -70,7 +72,7 @@ public static byte[] bigIntegerToBytes(BigInteger b, int numBytes) { byte[] bytes = new byte[numBytes]; byte[] biBytes = b.toByteArray(); int start = (biBytes.length == numBytes + 1) ? 1 : 0; - int length = Math.min(biBytes.length, numBytes); + int length = min(biBytes.length, numBytes, true); System.arraycopy(biBytes, start, bytes, numBytes - length, length); return bytes; } @@ -346,7 +348,7 @@ public static byte[] parseBytes(byte[] input, int offset, int len) { } byte[] bytes = new byte[len]; - System.arraycopy(input, offset, bytes, 0, Math.min(input.length - offset, len)); + System.arraycopy(input, offset, bytes, 0, min(input.length - offset, len, true)); return bytes; } diff --git a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java b/common/src/main/java/org/tron/core/vm/config/VMConfig.java similarity index 96% rename from actuator/src/main/java/org/tron/core/vm/config/VMConfig.java rename to common/src/main/java/org/tron/core/vm/config/VMConfig.java index 9f567344337..fa99daf20f4 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/common/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -55,6 +55,8 @@ public class VMConfig { private static boolean ALLOW_TVM_CANCUN = false; + private static Boolean ALLOW_STRICT_MATH_2 = false; + private VMConfig() { } @@ -154,6 +156,10 @@ public static void initAllowTvmCancun(long allow) { ALLOW_TVM_CANCUN = allow == 1; } + public static void initAllowStrictMath2(long allow) { + ALLOW_STRICT_MATH_2 = allow == 1; + } + public static boolean getEnergyLimitHardFork() { return CommonParameter.ENERGY_LIMIT_HARD_FORK; } @@ -241,4 +247,8 @@ public static boolean allowStrictMath() { public static boolean allowTvmCancun() { return ALLOW_TVM_CANCUN; } + + public static boolean allowStrictMath2() { + return ALLOW_STRICT_MATH_2; + } } diff --git a/framework/src/main/java/org/tron/common/logsfilter/ContractEventParser.java b/framework/src/main/java/org/tron/common/logsfilter/ContractEventParser.java index b2d8a0d8d3a..48181cb1255 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/ContractEventParser.java +++ b/framework/src/main/java/org/tron/common/logsfilter/ContractEventParser.java @@ -1,5 +1,7 @@ package org.tron.common.logsfilter; +import static org.tron.common.math.Maths.min; + import java.math.BigInteger; import java.util.regex.Pattern; import lombok.extern.slf4j.Slf4j; @@ -76,7 +78,7 @@ protected static byte[] subBytes(byte[] src, int start, int length) { throw new OutputLengthException("data start:" + start + ", length:" + length); } byte[] dst = new byte[length]; - System.arraycopy(src, start, dst, 0, Math.min(length, src.length - start)); + System.arraycopy(src, start, dst, 0, min(length, src.length - start, true)); return dst; } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index ce70d8b4cb7..86bff8fb665 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -18,6 +18,9 @@ package org.tron.core; +import static org.tron.common.math.Maths.addExact; +import static org.tron.common.math.Maths.ceil; +import static org.tron.common.math.Maths.max; import static org.tron.common.utils.Commons.getAssetIssueStoreFinal; import static org.tron.common.utils.Commons.getExchangeStoreFinal; import static org.tron.common.utils.WalletUtil.isConstant; @@ -880,10 +883,10 @@ public long calcCanDelegatedBandWidthMaxSize( long netUsage = (long) (accountNetUsage * TRX_PRECISION * ((double) (dynamicStore.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, dynamicStore.allowStrictMath2()); long maxSize = ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage; - return Math.max(0, maxSize); + return max(0, maxSize, dynamicStore.allowStrictMath2()); } public long calcCanDelegatedEnergyMaxSize(ByteString ownerAddress) { @@ -900,10 +903,11 @@ public long calcCanDelegatedEnergyMaxSize(ByteString ownerAddress) { long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (dynamicStore.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); - long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage); + long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage, + dynamicStore.allowStrictMath2()); long maxSize = ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage; - return Math.max(0, maxSize); + return max(0, maxSize, dynamicStore.allowStrictMath2()); } public DelegatedResourceAccountIndex getDelegatedResourceAccountIndex(ByteString address) { @@ -2985,7 +2989,8 @@ public Transaction estimateEnergy(TriggerSmartContract triggerSmartContract, if (transaction.getRet(0).getRet().equals(code.SUCESS)) { txRetBuilder.setResult(true); txRetBuilder.setCode(response_code.SUCCESS); - estimateBuilder.setEnergyRequired((long) Math.ceil((double) high / dps.getEnergyFee())); + estimateBuilder.setEnergyRequired((long) ceil((double) high / dps.getEnergyFee(), + dps.allowStrictMath2())); } return transaction; @@ -3539,8 +3544,9 @@ public ShieldedTRC20Parameters createShieldedContractParameters( long totalToAmount = 0; if (scaledToAmount > 0) { try { - totalToAmount = receiveSize == 0 ? scaledToAmount - : (Math.addExact(scaledToAmount, shieldedReceives.get(0).getNote().getValue())); + totalToAmount = receiveSize == 0 ? scaledToAmount : (addExact( + scaledToAmount, shieldedReceives.get(0).getNote().getValue(), + dbManager.getDynamicPropertiesStore().allowStrictMath2())); } catch (ArithmeticException e) { throw new ZksnarkException("Unbalanced burn!"); } @@ -3671,8 +3677,9 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk( long totalToAmount = 0; if (scaledToAmount > 0) { try { - totalToAmount = receiveSize == 0 ? scaledToAmount - : Math.addExact(scaledToAmount, shieldedReceives.get(0).getNote().getValue()); + totalToAmount = receiveSize == 0 ? scaledToAmount : addExact( + scaledToAmount, shieldedReceives.get(0).getNote().getValue(), + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); } catch (ArithmeticException e) { throw new ZksnarkException("Unbalanced burn!"); } diff --git a/framework/src/main/java/org/tron/core/capsule/utils/RLP.java b/framework/src/main/java/org/tron/core/capsule/utils/RLP.java index 60a84cfd3d3..24b5c502a1c 100644 --- a/framework/src/main/java/org/tron/core/capsule/utils/RLP.java +++ b/framework/src/main/java/org/tron/core/capsule/utils/RLP.java @@ -3,6 +3,7 @@ import static java.util.Arrays.copyOfRange; import static org.bouncycastle.util.Arrays.concatenate; import static org.bouncycastle.util.BigIntegers.asUnsignedByteArray; +import static org.tron.common.math.Maths.pow; import static org.tron.common.utils.ByteUtil.byteArrayToInt; import static org.tron.common.utils.ByteUtil.intToBytesNoLeadZeroes; import static org.tron.common.utils.ByteUtil.isNullOrZeroArray; @@ -49,7 +50,7 @@ public class RLP { /** * Allow for content up to size of 2^64 bytes * */ - private static final double MAX_ITEM_LENGTH = Math.pow(256, 8); + private static final double MAX_ITEM_LENGTH = pow(256, 8, true); /** * Reason for threshold according to Vitalik Buterin: - 56 bytes maximizes the benefit of both * options - if we went with 60 then we would have only had 4 slots for long strings so RLP would diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 3a37490ee69..83ecbc1c1ab 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -1,7 +1,8 @@ package org.tron.core.config.args; -import static java.lang.Math.max; import static java.lang.System.exit; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.core.Constant.ADD_PRE_FIX_BYTE_MAINNET; import static org.tron.core.Constant.DYNAMIC_ENERGY_INCREASE_FACTOR_RANGE; import static org.tron.core.Constant.DYNAMIC_ENERGY_MAX_FACTOR_RANGE; @@ -457,7 +458,7 @@ public static void setParam(final Config config) { if (config.hasPath(Constant.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT)) { long configLimit = config.getLong(Constant.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT); - PARAMETER.maxEnergyLimitForConstant = max(3_000_000L, configLimit); + PARAMETER.maxEnergyLimitForConstant = max(3_000_000L, configLimit, true); } if (config.hasPath(Constant.VM_LRU_CACHE_SIZE)) { @@ -1163,8 +1164,8 @@ public static void setParam(final Config config) { if (config.hasPath(Constant.ALLOW_DELEGATE_OPTIMIZATION)) { PARAMETER.allowDelegateOptimization = config.getLong(Constant.ALLOW_DELEGATE_OPTIMIZATION); - PARAMETER.allowDelegateOptimization = Math.min(PARAMETER.allowDelegateOptimization, 1); - PARAMETER.allowDelegateOptimization = Math.max(PARAMETER.allowDelegateOptimization, 0); + PARAMETER.allowDelegateOptimization = min(PARAMETER.allowDelegateOptimization, 1, true); + PARAMETER.allowDelegateOptimization = max(PARAMETER.allowDelegateOptimization, 0, true); } if (config.hasPath(Constant.COMMITTEE_UNFREEZE_DELAY_DAYS)) { @@ -1179,33 +1180,31 @@ public static void setParam(final Config config) { if (config.hasPath(Constant.ALLOW_DYNAMIC_ENERGY)) { PARAMETER.allowDynamicEnergy = config.getLong(Constant.ALLOW_DYNAMIC_ENERGY); - PARAMETER.allowDynamicEnergy = Math.min(PARAMETER.allowDynamicEnergy, 1); - PARAMETER.allowDynamicEnergy = Math.max(PARAMETER.allowDynamicEnergy, 0); + PARAMETER.allowDynamicEnergy = min(PARAMETER.allowDynamicEnergy, 1, true); + PARAMETER.allowDynamicEnergy = max(PARAMETER.allowDynamicEnergy, 0, true); } if (config.hasPath(Constant.DYNAMIC_ENERGY_THRESHOLD)) { PARAMETER.dynamicEnergyThreshold = config.getLong(Constant.DYNAMIC_ENERGY_THRESHOLD); PARAMETER.dynamicEnergyThreshold - = Math.min(PARAMETER.dynamicEnergyThreshold, 100_000_000_000_000_000L); - PARAMETER.dynamicEnergyThreshold = Math.max(PARAMETER.dynamicEnergyThreshold, 0); + = min(PARAMETER.dynamicEnergyThreshold, 100_000_000_000_000_000L, true); + PARAMETER.dynamicEnergyThreshold = max(PARAMETER.dynamicEnergyThreshold, 0, true); } if (config.hasPath(Constant.DYNAMIC_ENERGY_INCREASE_FACTOR)) { PARAMETER.dynamicEnergyIncreaseFactor = config.getLong(Constant.DYNAMIC_ENERGY_INCREASE_FACTOR); PARAMETER.dynamicEnergyIncreaseFactor = - Math.min(PARAMETER.dynamicEnergyIncreaseFactor, DYNAMIC_ENERGY_INCREASE_FACTOR_RANGE); - PARAMETER.dynamicEnergyIncreaseFactor = - Math.max(PARAMETER.dynamicEnergyIncreaseFactor, 0); + min(PARAMETER.dynamicEnergyIncreaseFactor, DYNAMIC_ENERGY_INCREASE_FACTOR_RANGE, true); + PARAMETER.dynamicEnergyIncreaseFactor = max(PARAMETER.dynamicEnergyIncreaseFactor, 0, true); } if (config.hasPath(Constant.DYNAMIC_ENERGY_MAX_FACTOR)) { PARAMETER.dynamicEnergyMaxFactor = config.getLong(Constant.DYNAMIC_ENERGY_MAX_FACTOR); PARAMETER.dynamicEnergyMaxFactor = - Math.min(PARAMETER.dynamicEnergyMaxFactor, DYNAMIC_ENERGY_MAX_FACTOR_RANGE); - PARAMETER.dynamicEnergyMaxFactor = - Math.max(PARAMETER.dynamicEnergyMaxFactor, 0); + min(PARAMETER.dynamicEnergyMaxFactor, DYNAMIC_ENERGY_MAX_FACTOR_RANGE, true); + PARAMETER.dynamicEnergyMaxFactor = max(PARAMETER.dynamicEnergyMaxFactor, 0, true); } PARAMETER.dynamicConfigEnable = config.hasPath(Constant.DYNAMIC_CONFIG_ENABLE) @@ -1624,7 +1623,7 @@ private static void initRocksDbSettings(Config config) { ? config.getInt(prefix + "levelNumber") : 7; int compactThreads = config.hasPath(prefix + "compactThreads") ? config.getInt(prefix + "compactThreads") - : max(Runtime.getRuntime().availableProcessors(), 1); + : max(Runtime.getRuntime().availableProcessors(), 1, true); int blocksize = config.hasPath(prefix + "blocksize") ? config.getInt(prefix + "blocksize") : 16; long maxBytesForLevelBase = config.hasPath(prefix + "maxBytesForLevelBase") diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index cfd12fffce2..43ea4460140 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1,5 +1,8 @@ package org.tron.core.db; +import static org.tron.common.math.Maths.floorDiv; +import static org.tron.common.math.Maths.max; +import static org.tron.common.math.Maths.min; import static org.tron.common.utils.Commons.adjustBalance; import static org.tron.core.Constant.TRANSACTION_MAX_BYTE_SIZE; import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; @@ -916,19 +919,20 @@ public void consumeMultiSignFee(TransactionCapsule trx, TransactionTrace trace) throws AccountResourceInsufficientException { if (trx.getInstance().getSignatureCount() > 1) { long fee = getDynamicPropertiesStore().getMultiSignFee(); - + boolean useStrictMath2 = getDynamicPropertiesStore().allowStrictMath2(); List contracts = trx.getInstance().getRawData().getContractList(); for (Contract contract : contracts) { byte[] address = TransactionCapsule.getOwner(contract); AccountCapsule accountCapsule = getAccountStore().get(address); try { if (accountCapsule != null) { - adjustBalance(getAccountStore(), accountCapsule, -fee); + adjustBalance(getAccountStore(), accountCapsule, -fee, useStrictMath2); if (getDynamicPropertiesStore().supportBlackHoleOptimization()) { getDynamicPropertiesStore().burnTrx(fee); } else { - adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee); + adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee, + useStrictMath2); } } } catch (BalanceInsufficientException e) { @@ -953,19 +957,20 @@ public void consumeMemoFee(TransactionCapsule trx, TransactionTrace trace) if (fee == 0) { return; } - + boolean useStrictMath2 = getDynamicPropertiesStore().allowStrictMath2(); List contracts = trx.getInstance().getRawData().getContractList(); for (Contract contract : contracts) { byte[] address = TransactionCapsule.getOwner(contract); AccountCapsule accountCapsule = getAccountStore().get(address); try { if (accountCapsule != null) { - adjustBalance(getAccountStore(), accountCapsule, -fee); + adjustBalance(getAccountStore(), accountCapsule, -fee, useStrictMath2); if (getDynamicPropertiesStore().supportBlackHoleOptimization()) { getDynamicPropertiesStore().burnTrx(fee); } else { - adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee); + adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee, + useStrictMath2); } } } catch (BalanceInsufficientException e) { @@ -1834,9 +1839,10 @@ private void payReward(BlockCapsule block) { mortgageService.payStandbyWitness(); if (chainBaseManager.getDynamicPropertiesStore().supportTransactionFeePool()) { - long transactionFeeReward = Math - .floorDiv(chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), - Constant.TRANSACTION_FEE_POOL_PERIOD); + long transactionFeeReward = floorDiv( + chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), + Constant.TRANSACTION_FEE_POOL_PERIOD, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); mortgageService.payTransactionFeeReward(witnessCapsule.getAddress().toByteArray(), transactionFeeReward); chainBaseManager.getDynamicPropertiesStore().saveTransactionFeePool( @@ -1850,9 +1856,10 @@ private void payReward(BlockCapsule block) { + chainBaseManager.getDynamicPropertiesStore().getWitnessPayPerBlock()); if (chainBaseManager.getDynamicPropertiesStore().supportTransactionFeePool()) { - long transactionFeeReward = Math - .floorDiv(chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), - Constant.TRANSACTION_FEE_POOL_PERIOD); + long transactionFeeReward = floorDiv( + chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), + Constant.TRANSACTION_FEE_POOL_PERIOD, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); account.setAllowance(account.getAllowance() + transactionFeeReward); chainBaseManager.getDynamicPropertiesStore().saveTransactionFeePool( chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool() @@ -2433,8 +2440,10 @@ private void initLiteNode() { } transactionCount += trx.getTransactionIds().size(); long blockNum = trx.getNum(); - maxBlock = Math.max(maxBlock, blockNum); - minBlock = Math.min(minBlock, blockNum); + maxBlock = max(maxBlock, blockNum, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + minBlock = min(minBlock, blockNum, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); item.setBlockNum(blockNum); trx.getTransactionIds().forEach( tid -> chainBaseManager.getTransactionStore().put(Hex.decode(tid), item)); diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java index f575253c50c..55446593bd0 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java @@ -1,5 +1,7 @@ package org.tron.core.net.messagehandler; +import static org.tron.common.math.Maths.min; + import java.util.LinkedList; import java.util.List; import lombok.extern.slf4j.Slf4j; @@ -117,7 +119,7 @@ private BlockId getUnForkId(List blockIds) throws P2pException { private LinkedList getBlockIds(Long unForkNum, BlockId headID) throws P2pException { long headNum = headID.getNum(); - long len = Math.min(headNum, unForkNum + NetConstants.SYNC_FETCH_BATCH_NUM); + long len = min(headNum, unForkNum + NetConstants.SYNC_FETCH_BATCH_NUM, true); LinkedList ids = new LinkedList<>(); for (long i = unForkNum; i <= len; i++) { diff --git a/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java b/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java index a63fd4bf0a9..b99b5b52bad 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java @@ -1,5 +1,8 @@ package org.tron.core.net.service.effective; +import static org.tron.common.math.Maths.ceil; +import static org.tron.common.math.Maths.max; + import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -86,8 +89,8 @@ private void disconnectRandom() { long now = System.currentTimeMillis(); Map weights = new HashMap<>(); peers.forEach(peer -> { - int weight = (int) Math.ceil((double) (now - peer.getLastInteractiveTime()) / 500); - weights.put(peer, Math.max(weight, 1)); + int weight = (int) ceil((double) (now - peer.getLastInteractiveTime()) / 500, true); + weights.put(peer, max(weight, 1, true)); }); WeightedRandom weightedRandom = new WeightedRandom(weights); PeerConnection one = (PeerConnection) weightedRandom.next(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java index cf04a1769aa..a6cc451b41c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -1,5 +1,7 @@ package org.tron.core.services.jsonrpc.filters; +import static org.tron.common.math.Maths.min; + import com.google.protobuf.ByteString; import lombok.Getter; import org.apache.commons.lang3.StringUtils; @@ -55,7 +57,7 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet if (toBlockSrc == -1) { toBlockSrc = Long.MAX_VALUE; } - fromBlockSrc = Math.min(toBlockSrc, currentMaxBlockNum); + fromBlockSrc = min(toBlockSrc, currentMaxBlockNum, true); } else if (StringUtils.isNotEmpty(fr.getFromBlock()) && StringUtils.isEmpty(fr.getToBlock())) { diff --git a/framework/src/main/java/org/tron/program/DBConvert.java b/framework/src/main/java/org/tron/program/DBConvert.java index a13a2ffefb5..7b9d63544dc 100644 --- a/framework/src/main/java/org/tron/program/DBConvert.java +++ b/framework/src/main/java/org/tron/program/DBConvert.java @@ -1,6 +1,7 @@ package org.tron.program; import static org.fusesource.leveldbjni.JniDBFactory.factory; +import static org.tron.common.math.Maths.max; import java.io.File; import java.nio.file.Path; @@ -190,7 +191,7 @@ private Options newDefaultRocksDbOptions() { options.setTargetFileSizeBase(64 * 1024 * 1024); options.setTargetFileSizeMultiplier(1); options.setMaxBytesForLevelBase(512 * 1024 * 1024); - options.setMaxBackgroundCompactions(Math.max(1, Runtime.getRuntime().availableProcessors())); + options.setMaxBackgroundCompactions(max(1, Runtime.getRuntime().availableProcessors(), true)); options.setLevel0FileNumCompactionTrigger(4); options.setLevelCompactionDynamicLevelBytes(true); if ("market_pair_price_to_order".equalsIgnoreCase(this.dbName)) { diff --git a/framework/src/test/java/org/tron/common/BaseTest.java b/framework/src/test/java/org/tron/common/BaseTest.java index 959a746a141..9eddef83fba 100644 --- a/framework/src/test/java/org/tron/common/BaseTest.java +++ b/framework/src/test/java/org/tron/common/BaseTest.java @@ -16,6 +16,7 @@ import org.tron.common.application.Application; import org.tron.common.crypto.ECKey; import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.Commons; import org.tron.common.utils.Sha256Hash; import org.tron.consensus.base.Param; import org.tron.core.ChainBaseManager; @@ -23,6 +24,8 @@ import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.Manager; +import org.tron.core.exception.BalanceInsufficientException; +import org.tron.core.store.AccountStore; import org.tron.protos.Protocol; @Slf4j @@ -102,4 +105,10 @@ public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] priva return block.toBuilder().setBlockHeader(blockHeader).build(); } + + public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) + throws BalanceInsufficientException { + Commons.adjustBalance(accountStore, accountAddress, amount, + chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index 7debeb12772..9e58233c922 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -15,6 +15,8 @@ package org.tron.common.runtime.vm; +import static org.tron.common.math.Maths.max; + import com.google.protobuf.Any; import com.google.protobuf.ByteString; import org.junit.Assert; @@ -248,7 +250,8 @@ public void testMaxContractResultSize() { continue; } Result result = Result.newBuilder().setContractRet(cr).build(); - maxSize = Math.max(maxSize, result.getSerializedSize()); + maxSize = max(maxSize, result.getSerializedSize(), + dbManager.getDynamicPropertiesStore().allowStrictMath2()); } Assert.assertEquals(2, maxSize); } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java index 9558c701109..524a858d2b5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java @@ -1,5 +1,6 @@ package org.tron.common.runtime.vm; +import static org.tron.common.math.Maths.min; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; @@ -856,7 +857,8 @@ private TVMTestResult unDelegateResource( transferUsage = (long) (oldReceiver.getEnergyUsage() * ((double) (amount) / oldReceiver.getAllFrozenBalanceForEnergy())); } - transferUsage = Math.min(unDelegateMaxUsage, transferUsage); + transferUsage = min(unDelegateMaxUsage, transferUsage, + manager.getDynamicPropertiesStore().allowStrictMath2()); } DelegatedResourceStore delegatedResourceStore = manager.getDelegatedResourceStore(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/MemoryTest.java b/framework/src/test/java/org/tron/common/runtime/vm/MemoryTest.java index b6e9cfe109c..dbbf6921567 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/MemoryTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/MemoryTest.java @@ -18,9 +18,9 @@ package org.tron.common.runtime.vm; -import static java.lang.Math.ceil; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; +import static org.tron.common.math.Maths.ceil; import java.util.Arrays; import lombok.extern.slf4j.Slf4j; @@ -43,7 +43,7 @@ private static void checkMemoryExtend(int dataSize) { } private static int calcSize(int dataSize, int chunkSize) { - return (int) ceil((double) dataSize / chunkSize) * chunkSize; + return (int) ceil((double) dataSize / chunkSize, true) * chunkSize; } @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java index 833ed6b0ac3..27e7891e6d8 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java @@ -1,6 +1,8 @@ package org.tron.common.runtime.vm; import static org.junit.Assert.assertNotNull; +import static org.tron.common.math.Maths.random; +import static org.tron.common.math.Maths.round; import com.google.protobuf.ByteString; import java.math.BigInteger; @@ -4504,7 +4506,7 @@ private byte[] longTo32Bytes(long value) { } private long randomLong() { - return Math.round(Math.random() * Long.MAX_VALUE / 2); + return round(random(true) * Long.MAX_VALUE / 2, true); } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java b/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java index 1d85e9a7eab..fc3b16f8f2e 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java @@ -1,5 +1,6 @@ package org.tron.common.runtime.vm; +import static org.tron.common.math.Maths.max; import static org.tron.protos.Protocol.Transaction.Result.contractResult; import static org.tron.protos.Protocol.Transaction.Result.contractResult.REVERT; import static org.tron.protos.Protocol.Transaction.Result.contractResult.SUCCESS; @@ -863,7 +864,8 @@ private void checkRewardAndWithdraw(byte[] contract, boolean isZero) throws Exce long rewardBySystem = mortgageService.queryReward(contract); long beginCycle = manager.getDelegationStore().getBeginCycle(contract); long currentCycle = manager.getDynamicPropertiesStore().getCurrentCycleNumber(); - long passedCycle = Math.max(0, currentCycle - beginCycle); + long passedCycle = max(0, currentCycle - beginCycle, + manager.getDynamicPropertiesStore().allowStrictMath2()); Assert.assertTrue(isZero ? rewardBySystem == 0 : rewardBySystem > 0); triggerContract(contract, SUCCESS, getConsumer(">=", rewardBySystem) diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java b/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java index 976490b8c80..d518776adb2 100644 --- a/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java +++ b/framework/src/test/java/org/tron/common/utils/client/utils/AbiUtil.java @@ -1,5 +1,7 @@ package org.tron.common.utils.client.utils; +import static org.tron.common.math.Maths.abs; + import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; @@ -340,7 +342,7 @@ static class CoderNumber extends Coder { @Override byte[] encode(String value) { long n = Long.valueOf(value); - DataWord word = new DataWord(Math.abs(n)); + DataWord word = new DataWord(abs(n, true)); if (n < 0) { word.negate(); } diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/DataWord.java b/framework/src/test/java/org/tron/common/utils/client/utils/DataWord.java index 6c36f4d636a..f676ef6c8e4 100644 --- a/framework/src/test/java/org/tron/common/utils/client/utils/DataWord.java +++ b/framework/src/test/java/org/tron/common/utils/client/utils/DataWord.java @@ -18,6 +18,8 @@ * along with the ethereumJ library. If not, see . */ +import static org.tron.common.math.Maths.signum; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import java.math.BigInteger; @@ -466,7 +468,7 @@ public int compareTo(DataWord o) { data, 0, data.length, o.getData(), 0, o.getData().length); // Convert result into -1, 0 or 1 as is the convention - return (int) Math.signum(result); + return (int) signum(result, true); } /** diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java index 807d0e1be02..179ba56e7ed 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java @@ -125,8 +125,8 @@ public void sameTokenNameCloseSuccessExchangeCreate() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -216,7 +216,7 @@ public void sameTokenNameCloseSuccessExchangeCreate2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(200_000_000_000000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, true); dbManager.getAccountStore().put(ownerAddress, accountCapsule); ExchangeCreateActuator actuator = new ExchangeCreateActuator(); @@ -710,8 +710,8 @@ public void sameTokenNameCloseNoEnoughBalance() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(1000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -748,8 +748,8 @@ public void sameTokenNameOpenNoEnoughBalance() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(1000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -785,8 +785,8 @@ public void sameTokenNameCloseSameTokens() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -822,8 +822,8 @@ public void sameTokenNameOpenSameTokens() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -859,8 +859,8 @@ public void sameTokenNameCloseLessToken() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 1000); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 1000, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -897,8 +897,8 @@ public void sameTokenNameOpenLessToken() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 1000); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 1000, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -934,8 +934,8 @@ public void sameTokenNameCloseMoreThanBalanceLimit() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -972,8 +972,8 @@ public void sameTokenNameOpenMoreThanBalanceLimit() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1010,7 +1010,7 @@ public void sameTokenNameCloseBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(firstTokenBalance + 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, false); dbManager.getAccountStore().put(ownerAddress, accountCapsule); ExchangeCreateActuator actuator = new ExchangeCreateActuator(); @@ -1047,7 +1047,7 @@ public void sameTokenNameOpenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(firstTokenBalance + 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, false); dbManager.getAccountStore().put(ownerAddress, accountCapsule); ExchangeCreateActuator actuator = new ExchangeCreateActuator(); @@ -1082,8 +1082,8 @@ public void sameTokenNameCloseFirstTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance - 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance - 1000L, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1120,8 +1120,8 @@ public void sameTokenNameOpenFirstTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance - 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance - 1000L, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1158,7 +1158,7 @@ public void sameTokenNameCloseBalanceNotEnough2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(secondTokenBalance + 1000L); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 200_000_000L, false); dbManager.getAccountStore().put(ownerAddress, accountCapsule); ExchangeCreateActuator actuator = new ExchangeCreateActuator(); @@ -1195,7 +1195,7 @@ public void sameTokenNameOpenBalanceNotEnough2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(secondTokenBalance + 1000L); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 200_000_000L, false); dbManager.getAccountStore().put(ownerAddress, accountCapsule); ExchangeCreateActuator actuator = new ExchangeCreateActuator(); @@ -1230,8 +1230,8 @@ public void sameTokenNameCloseSecondTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 90_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 90_000_000L, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1268,8 +1268,8 @@ public void sameTokenNameOpenSecondTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 90_000_000L); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 90_000_000L, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1305,7 +1305,7 @@ public void sameTokenNameCloseSecondTokenNotExist() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1342,7 +1342,7 @@ public void sameTokenNameOpenSecondTokenNotExist() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenBalance, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1388,7 +1388,7 @@ public void commonErrorCheck() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); accountCapsule.setBalance(200_000_000_000000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), 200_000_000L, true); dbManager.getAccountStore().put(ownerAddress, accountCapsule); actuatorTest.setContract(getContract( diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java index 6268c226c7e..7aef11ed793 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java @@ -190,8 +190,8 @@ public void SameTokenNameCloseSuccessExchangeInject() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -451,7 +451,7 @@ public void SameTokenNameCloseSuccessExchangeInject2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(firstTokenQuant); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -731,8 +731,8 @@ public void SameTokenNameCloseExchangeNotExist() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -819,8 +819,8 @@ public void SameTokenNameCloseAccountIsNotCreator() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -910,7 +910,7 @@ public void SameTokenNameCloseTokenIsNotInExchange() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(firstTokenQuant); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -995,8 +995,8 @@ public void SameTokenNameCloseTokenBalanceZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1099,8 +1099,8 @@ public void SameTokenNameCloseTokenQuantLessThanZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1187,7 +1187,7 @@ public void SameTokenNameCloseCalculatedTokenQuantLessThanZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(firstTokenQuant); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1273,7 +1273,7 @@ public void SameTokenNameCloseTokenBalanceGreaterThanBalanceLimit() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(firstTokenQuant); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1358,7 +1358,7 @@ public void SameTokenNameCloseBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(firstTokenQuant - 1); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1445,8 +1445,8 @@ public void SameTokenNameCloseTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant - 1); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant - 1, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1533,7 +1533,7 @@ public void SameTokenNameCloseBalanceNotEnough2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(399_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1618,8 +1618,8 @@ public void SameTokenNameCloseAnotherTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant - 1); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant - 1, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1785,8 +1785,8 @@ public void sameTokennullTransationResult() { TransactionResultCapsule ret = null; byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java index bf60b1cd910..d39706e0699 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java @@ -430,7 +430,7 @@ public void SameTokenNameCloseSuccessExchangeTransaction2() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -588,7 +588,7 @@ public void SameTokenNameCloseInvalidAddress() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, false); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -679,7 +679,7 @@ public void SameTokenNameCloseNoEnoughBalance() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, false); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -729,7 +729,7 @@ public void SameTokenNameOpenNoEnoughBalance() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -779,7 +779,7 @@ public void SameTokenNameCloseNoAccount() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -870,7 +870,7 @@ public void SameTokenNameCloseExchangeNotExist() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -959,7 +959,7 @@ public void SameTokenNameCloseTokenIsNotInExchange() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -1049,7 +1049,7 @@ public void SameTokenNameCloseTokenBalanceZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -1155,7 +1155,7 @@ public void SameTokenNameCloseTokenQuantLessThanZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -1245,7 +1245,7 @@ public void SameTokenNameCloseTokenBalanceGreaterThanBalanceLimit() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), 10000); + accountCapsule.addAssetAmount(tokenId.getBytes(), 10000, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -1421,7 +1421,7 @@ public void SameTokenNameCloseTokenBalanceNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), quant - 1); + accountCapsule.addAssetAmount(tokenId.getBytes(), quant - 1, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); @@ -1511,7 +1511,7 @@ public void SameTokenNameCloseTokenRequiredNotEnough() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(tokenId.getBytes(), quant); + accountCapsule.addAssetAmount(tokenId.getBytes(), quant, true); Map assetMap = accountCapsule.getAssetMapForTest(); Assert.assertEquals(20000_000000L, accountCapsule.getBalance()); Assert.assertEquals(null, assetMap.get(buyTokenId)); diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java index 6844925288e..5c5536f873c 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java @@ -851,8 +851,8 @@ public void SameTokenNameCloseAccountIsNotCreator() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -943,7 +943,7 @@ public void SameTokenNameCloseTokenIsNotInExchange() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(firstTokenQuant); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1030,8 +1030,8 @@ public void SameTokenNameCloseTokenBalanceZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), firstTokenQuant, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1136,8 +1136,8 @@ public void SameTokenNameCloseTokenQuantLessThanZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L, true); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, true); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); @@ -1227,8 +1227,8 @@ public void SameTokenNameCloseTnotherTokenQuantLessThanZero() { byte[] ownerAddress = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ownerAddress); - accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L); - accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant); + accountCapsule.addAssetAmount(firstTokenId.getBytes(), 1000L, false); + accountCapsule.addAssetAmount(secondTokenId.getBytes(), secondTokenQuant, false); accountCapsule.setBalance(10000_000000L); dbManager.getAccountStore().put(ownerAddress, accountCapsule); diff --git a/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java index 52e5f554374..88db0791b0a 100755 --- a/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java @@ -1230,7 +1230,7 @@ public void sameTokenNameCloseNotEnoughAssetTest() { AccountCapsule toAccount = chainBaseManager.getAccountStore().get(ByteArray.fromHexString(TO_ADDRESS)); toAccount.reduceAssetAmount(ByteString.copyFromUtf8(ASSET_NAME).toByteArray(), - TOTAL_SUPPLY - 10000); + TOTAL_SUPPLY - 10000, true); chainBaseManager.getAccountStore().put(toAccount.getAddress().toByteArray(), toAccount); ParticipateAssetIssueActuator actuator = new ParticipateAssetIssueActuator(); actuator.setChainBaseManager(chainBaseManager).setAny(getContract(1)); diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java index 508cee731f0..1f9a9af825c 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java @@ -108,8 +108,8 @@ public void successUpdateSettingContract() { Assert.assertEquals(ret.getInstance().getRet(), Protocol.Transaction.Result.code.SUCESS); Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) - .getConsumeUserResourcePercent(), - TARGET_PERCENT); + .getConsumeUserResourcePercent( + dbManager.getDynamicPropertiesStore().allowStrictMath2()), TARGET_PERCENT); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -245,8 +245,8 @@ public void twiceUpdateSettingContract() { Assert.assertEquals(ret.getInstance().getRet(), Protocol.Transaction.Result.code.SUCESS); Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) - .getConsumeUserResourcePercent(), - TARGET_PERCENT); + .getConsumeUserResourcePercent( + dbManager.getDynamicPropertiesStore().allowStrictMath2()), TARGET_PERCENT); // second secondActuator.validate(); @@ -255,8 +255,8 @@ public void twiceUpdateSettingContract() { Assert.assertEquals(ret.getInstance().getRet(), Protocol.Transaction.Result.code.SUCESS); Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) - .getConsumeUserResourcePercent(), - 90L); + .getConsumeUserResourcePercent( + dbManager.getDynamicPropertiesStore().allowStrictMath2()), 90L); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); diff --git a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java index 3346a1aead5..0eb69f8fd66 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.tron.common.math.Maths.max; import static org.tron.core.capsule.utils.TransactionUtil.isNumber; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_COST_BASE_SIZE; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; @@ -114,7 +115,7 @@ public static long estimateConsumeBandWidthSize(final AccountCapsule ownerCapsul TransactionCapsule fakeTransactionCapsule2 = new TransactionCapsule(builder2.build(), ContractType.DelegateResourceContract); long size2 = consumeBandWidthSize(fakeTransactionCapsule2, chainBaseManager); - long addSize = Math.max(size1 - size2, 0L); + long addSize = max(size1 - size2, 0L, true); return DELEGATE_COST_BASE_SIZE + addSize; } @@ -135,7 +136,7 @@ public static long estimateConsumeBandWidthSizeOld( TransactionCapsule fakeTransactionCapsule2 = new TransactionCapsule(builder2.build(), ContractType.DelegateResourceContract); long size2 = consumeBandWidthSize(fakeTransactionCapsule2, chainBaseManager); - long addSize = Math.max(size1 - size2, 0L); + long addSize = max(size1 - size2, 0L, true); return DELEGATE_COST_BASE_SIZE + addSize; } @@ -373,8 +374,8 @@ public void estimateConsumeBandWidthSizePositive() { DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); - long expected = DELEGATE_COST_BASE_SIZE + Math.max( - builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L); + long expected = DELEGATE_COST_BASE_SIZE + max( + builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L, true); long actual = TransactionUtil.estimateConsumeBandWidthSize(dps, balance); Assert.assertEquals(expected, actual); } @@ -391,8 +392,8 @@ public void estimateConsumeBandWidthSizeBoundary() { DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); - long expected = DELEGATE_COST_BASE_SIZE + Math.max( - builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L); + long expected = DELEGATE_COST_BASE_SIZE + max( + builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L, true); long actual = TransactionUtil.estimateConsumeBandWidthSize(dps, balance); Assert.assertEquals(expected, actual); } @@ -409,8 +410,8 @@ public void estimateConsumeBandWidthSizeEdge() { DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); - long expected = DELEGATE_COST_BASE_SIZE + Math.max( - builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L); + long expected = DELEGATE_COST_BASE_SIZE + max( + builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L, true); long actual = TransactionUtil.estimateConsumeBandWidthSize(dps, balance); Assert.assertEquals(expected, actual); } @@ -427,8 +428,8 @@ public void estimateConsumeBandWidthSizeCorner() { DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); - long expected = DELEGATE_COST_BASE_SIZE + Math.max( - builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L); + long expected = DELEGATE_COST_BASE_SIZE + max( + builder.build().getSerializedSize() - builder2.build().getSerializedSize(), 0L, true); long actual = TransactionUtil.estimateConsumeBandWidthSize(dps, balance); Assert.assertEquals(expected, actual); } diff --git a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java index de72b4be276..0ee0faa550a 100644 --- a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java @@ -90,7 +90,7 @@ public void AssetAmountTest() { String nameAdd = "TokenX"; long amountAdd = 222L; boolean addBoolean = accountCapsuleTest - .addAssetAmount(nameAdd.getBytes(), amountAdd); + .addAssetAmount(nameAdd.getBytes(), amountAdd, true); Assert.assertTrue(addBoolean); @@ -102,7 +102,7 @@ public void AssetAmountTest() { long amountReduce = 22L; boolean reduceBoolean = accountCapsuleTest - .reduceAssetAmount(ByteArray.fromString("TokenX"), amountReduce); + .reduceAssetAmount(ByteArray.fromString("TokenX"), amountReduce, false); Assert.assertTrue(reduceBoolean); Map assetMapAfter = accountCapsuleTest.getAssetMapForTest(); diff --git a/framework/src/test/java/org/tron/core/capsule/ContractStateCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/ContractStateCapsuleTest.java index 0465cd2e867..c90ad89abb3 100644 --- a/framework/src/test/java/org/tron/core/capsule/ContractStateCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/ContractStateCapsuleTest.java @@ -20,12 +20,12 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertFalse(capsule.catchUpToCycle(1000L, 2_000_000L, 2000L, 10_00L, false)); + Assert.assertFalse(capsule.catchUpToCycle(1000L, 2_000_000L, 2000L, 10_00L, false, false)); Assert.assertEquals(1000L, capsule.getUpdateCycle()); Assert.assertEquals(1_000_000L, capsule.getEnergyUsage()); Assert.assertEquals(5000L, capsule.getEnergyFactor()); - Assert.assertTrue(capsule.catchUpToCycle(1010L, 900_000L, 1000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1010L, 900_000L, 1000L, 10_000L, false, false)); Assert.assertEquals(1010L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(3137L, capsule.getEnergyFactor()); @@ -37,7 +37,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1001L, 2_000_000L, 2000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1001L, 2_000_000L, 2000L, 10_000L, false, false)); Assert.assertEquals(1001L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(4250L, capsule.getEnergyFactor()); @@ -49,7 +49,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1001L, 1_000_000L, 2000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1001L, 1_000_000L, 2000L, 10_000L, false, false)); Assert.assertEquals(1001L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(4250L, capsule.getEnergyFactor()); @@ -61,7 +61,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1001L, 900_000L, 2000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1001L, 900_000L, 2000L, 10_000L, false, false)); Assert.assertEquals(1001L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(8000L, capsule.getEnergyFactor()); @@ -73,7 +73,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1001L, 900_000L, 5000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1001L, 900_000L, 5000L, 10_000L, false, false)); Assert.assertEquals(1001L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(10_000L, capsule.getEnergyFactor()); @@ -85,7 +85,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1002L, 900_000L, 5000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1002L, 900_000L, 5000L, 10_000L, false, false)); Assert.assertEquals(1002L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(7500L, capsule.getEnergyFactor()); @@ -97,7 +97,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1003L, 900_000L, 5000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1003L, 900_000L, 5000L, 10_000L, false, false)); Assert.assertEquals(1003L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(5312L, capsule.getEnergyFactor()); @@ -109,7 +109,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1004L, 900_000L, 5000L, 10_000L, false)); + Assert.assertTrue(capsule.catchUpToCycle(1004L, 900_000L, 5000L, 10_000L, false, false)); Assert.assertEquals(1004L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(3398L, capsule.getEnergyFactor()); @@ -121,7 +121,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1005L, 900_000L, 5000L, 10_000L, true)); + Assert.assertTrue(capsule.catchUpToCycle(1005L, 900_000L, 5000L, 10_000L, true, true)); Assert.assertEquals(1005L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(1723L, capsule.getEnergyFactor()); @@ -133,7 +133,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1005L, 900_000L, 5000L, 10_000L, true)); + Assert.assertTrue(capsule.catchUpToCycle(1005L, 900_000L, 5000L, 10_000L, true, true)); Assert.assertEquals(1005L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(1723L, capsule.getEnergyFactor()); @@ -145,7 +145,7 @@ public void testCatchUpCycle() { .setUpdateCycle(1000L) .build()); - Assert.assertTrue(capsule.catchUpToCycle(1006L, 900_000L, 5000L, 10_000L, true)); + Assert.assertTrue(capsule.catchUpToCycle(1006L, 900_000L, 5000L, 10_000L, true, true)); Assert.assertEquals(1006L, capsule.getUpdateCycle()); Assert.assertEquals(0L, capsule.getEnergyUsage()); Assert.assertEquals(258L, capsule.getEnergyFactor()); diff --git a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java index 910b1adba67..df84433726e 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java @@ -1,5 +1,7 @@ package org.tron.core.capsule.utils; +import static org.tron.common.math.Maths.pow; + import com.google.protobuf.ByteString; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -86,7 +88,7 @@ private static int getRank(int num) { num = num >> 1; rank++; } - if (temp == Math.pow(2, rank - 1)) { + if (temp == pow(2, rank - 1, true)) { rank -= 1; } return rank; diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index e9b79487204..683ac49e8ad 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -5,7 +5,6 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.spy; import static org.tron.common.utils.Commons.adjustAssetBalanceV2; -import static org.tron.common.utils.Commons.adjustBalance; import static org.tron.common.utils.Commons.adjustTotalShieldedPoolValue; import static org.tron.common.utils.Commons.getExchangeStoreFinal; import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; @@ -36,6 +35,7 @@ import org.tron.common.crypto.ECKey; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Commons; import org.tron.common.utils.JsonUtil; import org.tron.common.utils.LocalWitnesses; import org.tron.common.utils.PublicMethod; @@ -82,6 +82,7 @@ import org.tron.core.exception.ValidateScheduleException; import org.tron.core.exception.ValidateSignatureException; import org.tron.core.exception.ZksnarkException; +import org.tron.core.store.AccountStore; import org.tron.core.store.CodeStore; import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.store.ExchangeStore; @@ -1167,4 +1168,10 @@ public void blockTrigger() { doThrow(new RuntimeException("postBlockTrigger mock")).when(manager).postBlockTrigger(any()); manager.blockTrigger(new BlockCapsule(Block.newBuilder().build()), 1, 1); } + + public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) + throws BalanceInsufficientException { + Commons.adjustBalance(accountStore, accountAddress, amount, + chainManager.getDynamicPropertiesStore().allowStrictMath2()); + } } diff --git a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java index 1f453cb9b41..d74229fb216 100755 --- a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java @@ -1,5 +1,8 @@ package org.tron.core.db; +import static org.tron.common.math.Maths.random; +import static org.tron.common.math.Maths.round; + import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.After; @@ -43,7 +46,7 @@ public void cleanDb() { } private static int randomInt(int minInt, int maxInt) { - return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); + return (int) round(random(true) * (maxInt - minInt) + minInt, true); } @Test diff --git a/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java b/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java index ea0c0354bb0..1de106f68e8 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java @@ -1,5 +1,8 @@ package org.tron.core.jsonrpc; +import static org.tron.common.math.Maths.random; +import static org.tron.common.math.Maths.round; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -17,7 +20,7 @@ public class ConcurrentHashMapTest { private static int randomInt(int minInt, int maxInt) { - return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); + return (int) round(random(true) * (maxInt - minInt) + minInt, true); } /** diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 211e7228289..c1b0f8bb507 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -113,6 +113,7 @@ public void testUpdateConsensusLogicOptimization() { Assert.assertEquals(v, 0); Assert.assertTrue(!dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); Assert.assertFalse(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); + Assert.assertFalse(dbManager.getDynamicPropertiesStore().allowStrictMath2()); long value = 1; Proposal proposal = @@ -127,6 +128,7 @@ public void testUpdateConsensusLogicOptimization() { Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); + Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowStrictMath2()); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java index 67353eb24b1..915742d3f0d 100644 --- a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; +import static org.tron.common.math.Maths.random; +import static org.tron.common.math.Maths.round; import static org.tron.common.zksnark.JLibrustzcash.librustzcashCheckDiversifier; import static org.tron.common.zksnark.JLibrustzcash.librustzcashComputeCm; import static org.tron.common.zksnark.JLibrustzcash.librustzcashIvkToPkd; @@ -87,7 +89,7 @@ public static void init() { } private static int randomInt(int minInt, int maxInt) { - return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); + return (int) round(random(true) * (maxInt - minInt) + minInt, true); } public static void test(byte[] K, byte[] ovk, byte[] cv, byte[] cm, byte[] epk) diff --git a/framework/src/test/java/org/tron/core/zksnark/SaplingNoteTest.java b/framework/src/test/java/org/tron/core/zksnark/SaplingNoteTest.java index 60f6c8c0826..da4df70d9ac 100644 --- a/framework/src/test/java/org/tron/core/zksnark/SaplingNoteTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/SaplingNoteTest.java @@ -1,5 +1,8 @@ package org.tron.core.zksnark; +import static org.tron.common.math.Maths.random; +import static org.tron.common.math.Maths.round; + import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -30,7 +33,7 @@ public static void removeDb() { } private static int randomInt(int minInt, int maxInt) { - return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); + return (int) round(random(true) * (maxInt - minInt) + minInt, true); } @Test diff --git a/plugins/src/main/java/org/tron/plugins/utils/ByteArray.java b/plugins/src/main/java/org/tron/plugins/utils/ByteArray.java index 3422c36ca9d..2922d110b7c 100644 --- a/plugins/src/main/java/org/tron/plugins/utils/ByteArray.java +++ b/plugins/src/main/java/org/tron/plugins/utils/ByteArray.java @@ -59,7 +59,7 @@ public static int compareUnsigned(byte[] a, byte[] b) { if (b == null) { return 1; } - int minLen = Math.min(a.length, b.length); + int minLen = StrictMath.min(a.length, b.length); for (int i = 0; i < minLen; ++i) { int aVal = a[i] & 0xFF; int bVal = b[i] & 0xFF; diff --git a/plugins/src/main/java/org/tron/plugins/utils/DBUtils.java b/plugins/src/main/java/org/tron/plugins/utils/DBUtils.java index 19547e2b5a5..f8559d5dba8 100644 --- a/plugins/src/main/java/org/tron/plugins/utils/DBUtils.java +++ b/plugins/src/main/java/org/tron/plugins/utils/DBUtils.java @@ -95,7 +95,8 @@ private static Options newDefaultRocksDbOptions(boolean forBulkLoad) { options.setTargetFileSizeBase(64 * 1024 * 1024); options.setTargetFileSizeMultiplier(1); options.setMaxBytesForLevelBase(512 * 1024 * 1024); - options.setMaxBackgroundCompactions(Math.max(1, Runtime.getRuntime().availableProcessors())); + options.setMaxBackgroundCompactions(StrictMath.max( + 1, Runtime.getRuntime().availableProcessors())); options.setLevel0FileNumCompactionTrigger(4); options.setLevelCompactionDynamicLevelBytes(true); final BlockBasedTableConfig tableCfg; diff --git a/plugins/src/main/java/org/tron/plugins/utils/MarketUtils.java b/plugins/src/main/java/org/tron/plugins/utils/MarketUtils.java index a36fc8ad57c..dbd578a59a3 100644 --- a/plugins/src/main/java/org/tron/plugins/utils/MarketUtils.java +++ b/plugins/src/main/java/org/tron/plugins/utils/MarketUtils.java @@ -130,8 +130,8 @@ public static int comparePriceKey(byte[] o1, byte[] o2) { public static int comparePrice(long price1SellQuantity, long price1BuyQuantity, long price2SellQuantity, long price2BuyQuantity) { try { - return Long.compare(Math.multiplyExact(price1BuyQuantity, price2SellQuantity), - Math.multiplyExact(price2BuyQuantity, price1SellQuantity)); + return Long.compare(StrictMath.multiplyExact(price1BuyQuantity, price2SellQuantity), + StrictMath.multiplyExact(price2BuyQuantity, price1SellQuantity)); } catch (ArithmeticException ex) { // do nothing here, because we will use BigInteger to compute again From b84c4f69d30966395b6b7a0e76b25a60cef3ecac Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Feb 2025 19:59:44 +0800 Subject: [PATCH 049/107] add test case of empty Payment Address in SpendNote --- .../java/org/tron/core/ShieldWalletTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/framework/src/test/java/org/tron/core/ShieldWalletTest.java b/framework/src/test/java/org/tron/core/ShieldWalletTest.java index fe095723c77..7eed5273586 100644 --- a/framework/src/test/java/org/tron/core/ShieldWalletTest.java +++ b/framework/src/test/java/org/tron/core/ShieldWalletTest.java @@ -363,6 +363,7 @@ public void testCreateShieldedContractParameters2() throws ContractExeException + "d0a20202020202020207d0a202020205d2c0a2020202022736869656c6465645f54524332305f636f" + "6e74726163745f61646472657373223a2234313434303037393739333539454341433339354242443" + "3434546383036304433444632444333463031220a7d")); + PrivateShieldedTRC20Parameters.Builder builder = PrivateShieldedTRC20Parameters.newBuilder(); try { JsonFormat.merge(parameter, builder, false); @@ -378,6 +379,39 @@ public void testCreateShieldedContractParameters2() throws ContractExeException Assert.assertEquals("Payment Address in ReceiveNote should not be empty", e.getMessage()); } + + String parameter2 = new String(ByteArray.fromHexString( + "7b0a202020202261736b223a2263323531336539653330383439343933326264383265306365353336" + + "363264313734323164393062373261383437316130613132623835353261333336653032222c0a202" + + "02020226e736b223a2234633662663364643461303634336432306236323866376534353938306335" + + "653138376630376135316436663365383661616631616239313663303765623064222c0a202020202" + + "26f766b223a2231376135386439613530353864613665343263613132636432383964306136616131" + + "363962393236633138653139626361353138623864366638363734653433222c0a202020202266726" + + "f6d5f616d6f756e74223a22313030222c0a2020202022736869656c6465645f7370656e6473223a5b" + + "0a20202020202020207b0a202020202020202020202020226e6f7465223a7b0a20202020202020202" + + "0202020202020202276616c7565223a3130302c0a2020202020202020202020202020202022706179" + + "6d656e745f61646472657373223a22222c0a202020202020202020202020202020202272636d223a2" + + "231366236663565343034343461623765656162313161653636313363323766333531313739373165" + + "666138376237313536306235383133383239633933393064220a2020202020202020202020207d0a2" + + "0202020202020207d0a202020205d2c0a2020202022736869656c6465645f54524332305f636f6e74" + + "726163745f61646472657373223a22343134343030373937393335394543414333393542424433434" + + "546383036304433444632444333463031220a7d")); + + builder = PrivateShieldedTRC20Parameters.newBuilder(); + try { + JsonFormat.merge(parameter2, builder, false); + } catch (ParseException e) { + Assert.fail(); + } + + try { + wallet1.createShieldedContractParameters(builder.build()); + Assert.fail(); + } catch (Exception e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Payment Address in SpendNote should not be empty", + e.getMessage()); + } } @Test From b9a49120150340966a01bbb871aa579ab0eba3da Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Feb 2025 20:09:41 +0800 Subject: [PATCH 050/107] add test case of generateFilterId --- .../src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index e75e4b17ab5..c9e6d6a2330 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -19,6 +19,7 @@ import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.JsonRpcApiUtil; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; import org.tron.core.services.jsonrpc.filters.LogBlockQuery; import org.tron.core.services.jsonrpc.filters.LogFilter; @@ -352,4 +353,9 @@ public void testGetConditionWithHashCollision() { Assert.fail(); } } + + @Test + public void testGenerateFilterId() { + Assert.assertEquals(32, JsonRpcApiUtil.generateFilterId().length()); + } } From e72dbc4efbac614520db5e5dbd0c68014f71ce3f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Feb 2025 20:58:24 +0800 Subject: [PATCH 051/107] format style of ApiUtilTest --- framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java index 84aba180138..570e7ed3498 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java @@ -1,6 +1,5 @@ package org.tron.core.jsonrpc; - import static org.tron.common.utils.Commons.decodeFromBase58Check; import static org.tron.keystore.Wallet.generateRandomBytes; From a6b21420dcc6d344798057cc6c81da0c05aa7b80 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sat, 15 Feb 2025 09:53:06 +0800 Subject: [PATCH 052/107] modify test case of isShieldedTRC20ContractNoteSpent --- .../src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java index ff30537ee7a..2c97473b6c3 100644 --- a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java +++ b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java @@ -2269,7 +2269,7 @@ public void testscanShieldedTRC20NotesByOvk() throws Exception { } } - @Test(expected = IllegalArgumentException.class) + @Test(expected = ZksnarkException.class) public void isShieldedTRC20ContractNoteSpent() throws Exception { int statNum = 9200; int endNum = 9240; From ff44e093610613ed3e96cc3f079a19cb49fe0552 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Mon, 17 Feb 2025 11:48:10 +0800 Subject: [PATCH 053/107] solve the sonar problem --- .../core/services/event/BlockEventGet.java | 63 ++++++++++--------- .../services/event/HistoryEventService.java | 7 ++- .../core/services/event/bo/BlockEvent.java | 20 ++++-- .../tron/core/services/event/bo/Event.java | 8 ++- .../event/bo/SmartContractTrigger.java | 10 ++- 5 files changed, 69 insertions(+), 39 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java index 8ffc333eda4..25fb54bce8c 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java @@ -59,7 +59,6 @@ public BlockEvent getBlockEvent(long blockNum) throws Exception { blockEvent.setBlockId(block.getBlockId()); blockEvent.setParentId(block.getParentBlockId()); blockEvent.setSolidId(manager.getChainBaseManager().getBlockIdByNum(solidNum)); - blockEvent.setBlockTime(block.getTimeStamp()); if (instance.isBlockLogTriggerEnable()) { blockEvent.setBlockLogTriggerCapsule(getBlockLogTrigger(block, solidNum)); } @@ -145,11 +144,45 @@ private List parseLogs(Protocol.Transaction tx, Map addrMap = new HashMap<>(); Map abiMap = new HashMap<>(); + parseLogs(logs, originAddress, addrMap, abiMap); + int index = 1; for (Protocol.TransactionInfo.Log log : logs) { byte[] contractAddress = TransactionTrace .convertToTronAddress(log.getAddress().toByteArray()); + String strContractAddress = + ArrayUtils.isEmpty(contractAddress) ? "" : StringUtil.encode58Check(contractAddress); + SmartContractOuterClass.SmartContract.ABI abi = abiMap.get(strContractAddress); + ContractTrigger event = new ContractTrigger(); + String creatorAddr = addrMap.get(strContractAddress); + String txId = Hex.toHexString(txInfo.getId().toByteArray()); + event.setUniqueId(txId + "_" + index); + event.setTransactionId(txId); + event.setContractAddress(strContractAddress); + event.setOriginAddress(originAddress); + event.setCallerAddress(""); + event.setCreatorAddress(StringUtils.isEmpty(creatorAddr) ? "" : creatorAddr); + event.setBlockNumber(txInfo.getBlockNumber()); + event.setTimeStamp(txInfo.getBlockTimeStamp()); + event.setLogInfo(buildLogInfo(log)); + event.setAbi(abi); + + list.add(event); + index++; + } + + return list; + } + + private void parseLogs(List logs, + String originAddress, + Map addrMap, Map abiMap) { + for (Protocol.TransactionInfo.Log log : logs) { + + byte[] contractAddress = TransactionTrace + .convertToTronAddress(log.getAddress().toByteArray()); String strContractAddr = ArrayUtils.isEmpty(contractAddress) ? "" : StringUtil.encode58Check(contractAddress); if (addrMap.get(strContractAddr) != null) { @@ -175,34 +208,6 @@ private List parseLogs(Protocol.Transaction tx, addrMap.put(strContractAddr, creatorAddr); abiMap.put(strContractAddr, abi); } - - int index = 1; - for (Protocol.TransactionInfo.Log log : logs) { - - byte[] contractAddress = TransactionTrace - .convertToTronAddress(log.getAddress().toByteArray()); - String strContractAddress = - ArrayUtils.isEmpty(contractAddress) ? "" : StringUtil.encode58Check(contractAddress); - SmartContractOuterClass.SmartContract.ABI abi = abiMap.get(strContractAddress); - ContractTrigger event = new ContractTrigger(); - String creatorAddr = addrMap.get(strContractAddress); - String txId = Hex.toHexString(txInfo.getId().toByteArray()); - event.setUniqueId(txId + "_" + index); - event.setTransactionId(txId); - event.setContractAddress(strContractAddress); - event.setOriginAddress(originAddress); - event.setCallerAddress(""); - event.setCreatorAddress(StringUtils.isEmpty(creatorAddr) ? "" : creatorAddr); - event.setBlockNumber(txInfo.getBlockNumber()); - event.setTimeStamp(txInfo.getBlockTimeStamp()); - event.setLogInfo(buildLogInfo(log)); - event.setAbi(abi); - - list.add(event); - index++; - } - - return list; } private LogInfo buildLogInfo(Protocol.TransactionInfo.Log log) { diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java index 0f26490d16b..af9b7818640 100644 --- a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -61,8 +61,11 @@ private void syncEvent() { Thread.sleep(30); } initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum)); - } catch (Exception e) { - logger.error("Sync event failed.", e); + } catch (InterruptedException e1) { + logger.warn("Sync event interrupted."); + Thread.currentThread().interrupt(); + } catch (Exception e2) { + logger.error("Sync event failed.", e2); } } diff --git a/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java b/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java index 9e314bc7d5a..f573a486738 100644 --- a/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java +++ b/framework/src/main/java/org/tron/core/services/event/bo/BlockEvent.java @@ -1,22 +1,34 @@ package org.tron.core.services.event.bo; import java.util.List; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; import org.tron.common.logsfilter.capsule.SolidityTriggerCapsule; import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; import org.tron.core.capsule.BlockCapsule; -@Data public class BlockEvent { + @Getter + @Setter private BlockCapsule.BlockId blockId; + @Getter + @Setter private BlockCapsule.BlockId parentId; + @Getter + @Setter private BlockCapsule.BlockId solidId; - private long blockTime; - + @Getter + @Setter private BlockLogTriggerCapsule blockLogTriggerCapsule; + @Getter + @Setter private List transactionLogTriggerCapsules; + @Getter + @Setter private SolidityTriggerCapsule solidityTriggerCapsule; + @Getter + @Setter private SmartContractTrigger smartContractTrigger; public BlockEvent() {} diff --git a/framework/src/main/java/org/tron/core/services/event/bo/Event.java b/framework/src/main/java/org/tron/core/services/event/bo/Event.java index 142e1be3c22..7d99747c087 100644 --- a/framework/src/main/java/org/tron/core/services/event/bo/Event.java +++ b/framework/src/main/java/org/tron/core/services/event/bo/Event.java @@ -1,10 +1,14 @@ package org.tron.core.services.event.bo; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data public class Event { + @Getter + @Setter private boolean isRemove; + @Getter + @Setter private BlockEvent blockEvent; public Event(BlockEvent blockEvent, boolean isRemove) { diff --git a/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java b/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java index 7413c309169..e981d5db7da 100644 --- a/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java +++ b/framework/src/main/java/org/tron/core/services/event/bo/SmartContractTrigger.java @@ -2,13 +2,19 @@ import java.util.ArrayList; import java.util.List; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.tron.common.logsfilter.trigger.ContractEventTrigger; import org.tron.common.logsfilter.trigger.ContractLogTrigger; -@Data public class SmartContractTrigger { + @Getter + @Setter private List contractLogTriggers = new ArrayList<>(); + @Getter + @Setter private List contractEventTriggers = new ArrayList<>(); + @Getter + @Setter private List redundancies = new ArrayList<>(); } From 8249971ddd9a34155972d2d6a0eecac0a374ae04 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 8 Jul 2024 15:17:37 +0800 Subject: [PATCH 054/107] feat(build): enable dependency checksum sha256 verification This file was automatically generated using `./gradlew --write-verification-metadata sha256 help` --- gradle/verification-metadata.xml | 2565 ++++++++++++++++++++++++++++++ 1 file changed, 2565 insertions(+) create mode 100644 gradle/verification-metadata.xml diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000000..3e061306873 --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,2565 @@ + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a464aa8b8c905a1b1ddd19d0f9706037d96bb413 Mon Sep 17 00:00:00 2001 From: Liulei Date: Mon, 17 Feb 2025 15:35:58 +0800 Subject: [PATCH 055/107] feat(tvm): compare dataword in mcopy energy cost --- actuator/src/main/java/org/tron/core/vm/EnergyCost.java | 8 +++----- .../java/org/tron/core/vm/repository/RepositoryImpl.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java index 74dbaa741c3..b758438c940 100644 --- a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java +++ b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java @@ -1,7 +1,5 @@ package org.tron.core.vm; -import static org.tron.common.math.Maths.max; - import java.math.BigInteger; import org.tron.common.runtime.vm.DataWord; import org.tron.core.vm.config.VMConfig; @@ -248,9 +246,9 @@ public static long getMCopyCost(Program program) { Stack stack = program.getStack(); long oldMemSize = program.getMemSize(); - int dstOffset = stack.peek().intValue(); - int srcOffset = stack.get(stack.size() - 2).intValue(); - DataWord maxOffset = new DataWord(max(dstOffset, srcOffset, VMConfig.allowStrictMath2())); + DataWord dstOffset = stack.peek(); + DataWord srcOffset = stack.get(stack.size() - 2); + DataWord maxOffset = dstOffset.compareTo(srcOffset) > 0 ? dstOffset : srcOffset; return VERY_LOW_TIER + calcMemEnergy(oldMemSize, memNeeded(maxOffset, stack.get(stack.size() - 3)), stack.get(stack.size() - 3).longValueSafe(), Op.MCOPY); diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index 321efb729b9..e81aba2a862 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -456,7 +456,7 @@ public byte[] getTransientStorageValue(byte[] address, byte[] key) { byte[] value; if (parent != null) { value = parent.getTransientStorageValue(address, key); - } else{ + } else { value = null; } From 01dd7e1183175c40f4232707622eab9e11ec850e Mon Sep 17 00:00:00 2001 From: Liulei Date: Mon, 17 Feb 2025 18:05:34 +0800 Subject: [PATCH 056/107] fix(tvm): clone tload value --- actuator/src/main/java/org/tron/core/vm/OperationActions.java | 2 +- .../test/java/org/tron/common/runtime/vm/OperationsTest.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index 1208a94b61b..95370ff16bb 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -649,7 +649,7 @@ public static void tLoadAction(Program program) { byte[] data = program.getContractState().getTransientStorageValue(address.getData(), key.getData()); - DataWord value = data != null ? new DataWord(data) : DataWord.ZERO(); + DataWord value = data != null ? new DataWord(data).clone() : DataWord.ZERO(); program.stackPush(value); program.step(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index 0eb00244d21..01d54c2194a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -960,6 +960,10 @@ public void testTransientStorageOperations() throws ContractValidateException { program.getContractState().getTransientStorageValue( program.getContractAddress().getData(), new DataWord(0x01).getData())); + op = new byte[] {0x60, 0x02, 0x60, 0x01, 0x5c, 0x16}; + program = new Program(op, op, invoke, interTrx); + testOperations(program); + // TLOAD = 0x5c; op = new byte[] {0x60, 0x01, 0x5c}; program = new Program(op, op, invoke, interTrx); From 41f751fc7a2ac4ca74e1274206fe7299491a9942 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 18 Feb 2025 17:26:38 +0800 Subject: [PATCH 057/107] feat(net): optimize handshake log information --- .../java/org/tron/core/net/service/relay/RelayService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index b871596b373..35d13ccf64f 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -145,9 +145,10 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) { } if (getPeerCountByAddress(msg.getAddress()) >= MAX_PEER_COUNT_PER_ADDRESS) { - logger.warn("HelloMessage from {}, the number of peers of {} exceeds 2.", + logger.warn("HelloMessage from {}, the number of peers of {} exceeds {}.", channel.getInetAddress(), - ByteArray.toHexString(msg.getAddress().toByteArray())); + ByteArray.toHexString(msg.getAddress().toByteArray()), + MAX_PEER_COUNT_PER_ADDRESS); return false; } From 5f39d97d273da1c6d93ba5c3862d4ea9e1b5d44f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 19 Feb 2025 16:11:50 +0800 Subject: [PATCH 058/107] don't use prefix 41 when add address to sensitiveCache map --- .../java/org/tron/core/net/service/relay/RelayService.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index 35d13ccf64f..a1afa7dd1a8 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -21,8 +21,6 @@ import org.tron.common.log.layout.DesensitizedConverter; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.TransactionCapsule; @@ -169,10 +167,8 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) { } if (flag) { TronNetService.getP2pConfig().getTrustNodes().add(channel.getInetAddress()); - byte[] addressByte = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, - msg.getAddress().toByteArray()); DesensitizedConverter.addSensitive(channel.getInetAddress().toString().substring(1), - ByteArray.toHexString(addressByte)); + ByteArray.toHexString(msg.getAddress().toByteArray())); } return flag; } catch (Exception e) { From 964daeb07a908721e448e803d6ddaf47923f951a Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 19 Feb 2025 18:43:27 +0800 Subject: [PATCH 059/107] fix(cfg): the setParam method overrides the internal tx switches initialized by @Parameter --- .../java/org/tron/core/config/args/Args.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index d94dfc52f0a..45fedbb3906 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -915,17 +915,24 @@ public static void setParam(final Config config) { PARAMETER.vmTrace = config.hasPath(Constant.VM_TRACE) && config.getBoolean(Constant.VM_TRACE); - PARAMETER.saveInternalTx = - config.hasPath(Constant.VM_SAVE_INTERNAL_TX) - && config.getBoolean(Constant.VM_SAVE_INTERNAL_TX); + if (config.hasPath(Constant.VM_SAVE_INTERNAL_TX)) { + PARAMETER.saveInternalTx = config.getBoolean(Constant.VM_SAVE_INTERNAL_TX); + } - PARAMETER.saveFeaturedInternalTx = - config.hasPath(Constant.VM_SAVE_FEATURED_INTERNAL_TX) - && config.getBoolean(Constant.VM_SAVE_FEATURED_INTERNAL_TX); + if (config.hasPath(Constant.VM_SAVE_FEATURED_INTERNAL_TX)) { + PARAMETER.saveFeaturedInternalTx = config.getBoolean(Constant.VM_SAVE_FEATURED_INTERNAL_TX); + } - PARAMETER.saveCancelAllUnfreezeV2Details = - config.hasPath(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS) - && config.getBoolean(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS); + if (config.hasPath(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS)) { + PARAMETER.saveCancelAllUnfreezeV2Details = + config.getBoolean(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS); + } + + if (PARAMETER.saveCancelAllUnfreezeV2Details + && (!PARAMETER.saveInternalTx || !PARAMETER.saveFeaturedInternalTx)) { + logger.warn("Configuring [vm.saveCancelAllUnfreezeV2Details] won't work as " + + "vm.saveInternalTx or vm.saveFeaturedInternalTx is off."); + } // PARAMETER.allowShieldedTransaction = // config.hasPath(Constant.COMMITTEE_ALLOW_SHIELDED_TRANSACTION) ? config From ca285532149b7a677936c01ddd9b6faf05d351a7 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 20 Feb 2025 17:29:41 +0800 Subject: [PATCH 060/107] feat(system.exit): adapt TronError for ExecutorService --- .../tron/core/service/RewardViCalService.java | 2 +- .../common/es/ExecutorServiceManager.java | 29 +++++++++++++++++++ .../org/tron/common/exit/ExitManager.java | 2 +- .../org/tron/consensus/dpos/DposTask.java | 6 +++- .../main/java/org/tron/core/db/Manager.java | 10 +++++-- .../TransactionsMsgHandler.java | 8 +++-- .../core/net/service/sync/SyncService.java | 4 +-- 7 files changed, 50 insertions(+), 11 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java b/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java index b3ef76b091e..f88fd02c539 100644 --- a/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java +++ b/chainbase/src/main/java/org/tron/core/service/RewardViCalService.java @@ -82,7 +82,7 @@ public void init() { // checkpoint is flushed to db, we can start rewardViCalService immediately lastBlockNumber = Long.MAX_VALUE; } - es.scheduleWithFixedDelay(this::maybeRun, 0, 3, TimeUnit.SECONDS); + ExecutorServiceManager.scheduleWithFixedDelay(es, this::maybeRun, 0, 3, TimeUnit.SECONDS); } private boolean enableNewRewardAlgorithm() { diff --git a/common/src/main/java/org/tron/common/es/ExecutorServiceManager.java b/common/src/main/java/org/tron/common/es/ExecutorServiceManager.java index 196d44ba722..779a8edf75d 100644 --- a/common/src/main/java/org/tron/common/es/ExecutorServiceManager.java +++ b/common/src/main/java/org/tron/common/es/ExecutorServiceManager.java @@ -4,10 +4,13 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; +import org.tron.common.exit.ExitManager; @Slf4j(topic = "common-executor") public class ExecutorServiceManager { @@ -80,4 +83,30 @@ public static void shutdownAndAwaitTermination(ExecutorService pool, String name } logger.info("Pool {} shutdown done", name); } + + public static Future submit(ExecutorService es, Runnable task) { + return es.submit(() -> { + try { + task.run(); + } catch (Throwable e) { + ExitManager.findTronError(e).ifPresent(ExitManager::logAndExit); + throw e; + } + }); + } + + public static ScheduledFuture scheduleWithFixedDelay(ScheduledExecutorService es, + Runnable command, + long initialDelay, + long delay, + TimeUnit unit) { + return es.scheduleWithFixedDelay(() -> { + try { + command.run(); + } catch (Throwable e) { + ExitManager.findTronError(e).ifPresent(ExitManager::logAndExit); + throw e; + } + }, initialDelay, delay, unit); + } } diff --git a/common/src/main/java/org/tron/common/exit/ExitManager.java b/common/src/main/java/org/tron/common/exit/ExitManager.java index ff3e0de734b..d80b7838c08 100644 --- a/common/src/main/java/org/tron/common/exit/ExitManager.java +++ b/common/src/main/java/org/tron/common/exit/ExitManager.java @@ -44,7 +44,7 @@ public static Optional findTronError(Throwable e) { return Optional.empty(); } - private static void logAndExit(TronError exit) { + public static void logAndExit(TronError exit) { final int code = exit.getErrCode().getCode(); logger.error("Shutting down with code: {}.", exit.getErrCode(), exit); Thread exitThread = exitThreadFactory.newThread(() -> System.exit(code)); diff --git a/consensus/src/main/java/org/tron/consensus/dpos/DposTask.java b/consensus/src/main/java/org/tron/consensus/dpos/DposTask.java index 8d5697cdc89..9e42552c80f 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/DposTask.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/DposTask.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.exit.ExitManager; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; @@ -68,10 +69,13 @@ public void init() { Thread.currentThread().interrupt(); } catch (Throwable throwable) { logger.error("Produce block error.", throwable); + ExitManager.findTronError(throwable).ifPresent(e -> { + throw e; + }); } } }; - produceExecutor.submit(runnable); + ExecutorServiceManager.submit(produceExecutor, runnable); logger.info("DPoS task started."); } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 993198d60f3..55c248b1c14 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -53,6 +53,7 @@ import org.tron.common.args.GenesisBlock; import org.tron.common.bloom.Bloom; import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.exit.ExitManager; import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.logsfilter.FilterQuery; import org.tron.common.logsfilter.capsule.BlockFilterCapsule; @@ -293,6 +294,9 @@ public class Manager { Metrics.counterInc(MetricKeys.Counter.TXS, 1, MetricLabels.Counter.TXS_FAIL, MetricLabels.Counter.TXS_FAIL_ERROR); } + ExitManager.findTronError(ex).ifPresent(e -> { + throw e; + }); } finally { if (tx != null && getRePushTransactions().remove(tx)) { Metrics.gaugeInc(MetricKeys.Gauge.MANAGER_QUEUE, -1, @@ -550,18 +554,18 @@ public void init() { validateSignService = ExecutorServiceManager .newFixedThreadPool(validateSignName, Args.getInstance().getValidateSignThreadNum()); rePushEs = ExecutorServiceManager.newSingleThreadExecutor(rePushEsName, true); - rePushEs.submit(rePushLoop); + ExecutorServiceManager.submit(rePushEs, rePushLoop); // add contract event listener for subscribing if (Args.getInstance().isEventSubscribe()) { startEventSubscribing(); triggerEs = ExecutorServiceManager.newSingleThreadExecutor(triggerEsName, true); - triggerEs.submit(triggerCapsuleProcessLoop); + ExecutorServiceManager.submit(triggerEs, triggerCapsuleProcessLoop); } // start json rpc filter process if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) { filterEs = ExecutorServiceManager.newSingleThreadExecutor(filterEsName); - filterEs.submit(filterProcessLoop); + ExecutorServiceManager.submit(filterEs, filterProcessLoop); } //initStoreFactory diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java index 0ea0f24e7ae..5fab8bc6f33 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java @@ -83,7 +83,8 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep dropSmartContractCount++; } } else { - trxHandlePool.submit(() -> handleTransaction(peer, new TransactionMessage(trx))); + ExecutorServiceManager.submit( + trxHandlePool, () -> handleTransaction(peer, new TransactionMessage(trx))); } } @@ -109,11 +110,12 @@ private void check(PeerConnection peer, TransactionsMessage msg) throws P2pExcep } private void handleSmartContract() { - smartContractExecutor.scheduleWithFixedDelay(() -> { + ExecutorServiceManager.scheduleWithFixedDelay(smartContractExecutor, () -> { try { while (queue.size() < MAX_SMART_CONTRACT_SUBMIT_SIZE && smartContractQueue.size() > 0) { TrxEvent event = smartContractQueue.take(); - trxHandlePool.submit(() -> handleTransaction(event.getPeer(), event.getMsg())); + ExecutorServiceManager.submit( + trxHandlePool, () -> handleTransaction(event.getPeer(), event.getMsg())); } } catch (InterruptedException e) { logger.warn("Handle smart server interrupted"); diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 0bce4b8baa5..e387329c467 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -70,7 +70,7 @@ public class SyncService { private final long syncFetchBatchNum = Args.getInstance().getSyncFetchBatchNum(); public void init() { - fetchExecutor.scheduleWithFixedDelay(() -> { + ExecutorServiceManager.scheduleWithFixedDelay(fetchExecutor, () -> { try { if (fetchFlag) { fetchFlag = false; @@ -81,7 +81,7 @@ public void init() { } }, 10, 1, TimeUnit.SECONDS); - blockHandleExecutor.scheduleWithFixedDelay(() -> { + ExecutorServiceManager.scheduleWithFixedDelay(blockHandleExecutor, () -> { try { if (handleFlag) { handleFlag = false; From 6a4f7a0466a42ae531de9bec80324a76dce22d3b Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 21 Feb 2025 11:17:33 +0800 Subject: [PATCH 061/107] feat(log): optimize event service logs --- framework/src/main/java/org/tron/core/db/Manager.java | 2 -- .../org/tron/core/net/service/relay/RelayService.java | 2 +- .../org/tron/core/services/event/BlockEventCache.java | 2 +- .../org/tron/core/services/event/BlockEventLoad.java | 4 ++-- .../tron/core/services/event/HistoryEventService.java | 4 ++-- .../tron/core/services/event/RealtimeEventService.java | 6 +++--- .../tron/core/services/event/SolidEventService.java | 10 +++++----- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 55c248b1c14..096476a1bbe 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2107,8 +2107,6 @@ private void startEventSubscribing() { private void postSolidityFilter(final long oldSolidNum, final long latestSolidifiedBlockNumber) { if (oldSolidNum >= latestSolidifiedBlockNumber) { - logger.warn("Post solidity filter failed, oldSolidity: {} >= latestSolidity: {}.", - oldSolidNum, latestSolidifiedBlockNumber); return; } diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index a1afa7dd1a8..161e918336b 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -142,7 +142,7 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) { return false; } - if (getPeerCountByAddress(msg.getAddress()) >= MAX_PEER_COUNT_PER_ADDRESS) { + if (getPeerCountByAddress(msg.getAddress()) > MAX_PEER_COUNT_PER_ADDRESS) { logger.warn("HelloMessage from {}, the number of peers of {} exceeds {}.", channel.getInetAddress(), ByteArray.toHexString(msg.getAddress().toByteArray()), diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java index 40abae07946..aac457ba29b 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java @@ -43,7 +43,7 @@ public static void init(BlockCapsule.BlockId blockId) { } public static void add(BlockEvent blockEvent) throws EventException { - logger.info("Add block event, {}", blockEvent.getBlockId().getString(), + logger.info("Add block event, {}, {}", blockEvent.getBlockId().getString(), blockEvent.getParentId().getString()); if (blockEventMap.get(blockEvent.getParentId()) == null) { throw new EventException("unlink BlockEvent, " diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java index 1af9d768c19..bebe3bcbc60 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java @@ -33,9 +33,9 @@ public void init() { executor.scheduleWithFixedDelay(() -> { try { load(); - } catch (Exception exception) { + } catch (Exception e) { close(); - logger.error("Spread thread error", exception); + logger.error("Event load service fail.", e); } }, 100, 100, TimeUnit.MILLISECONDS); logger.info("Event load service start."); diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java index af9b7818640..73422944f08 100644 --- a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -62,10 +62,10 @@ private void syncEvent() { } initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum)); } catch (InterruptedException e1) { - logger.warn("Sync event interrupted."); + logger.warn("History event service interrupted."); Thread.currentThread().interrupt(); } catch (Exception e2) { - logger.error("Sync event failed.", e2); + logger.error("History event service fail.", e2); } } diff --git a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java index 8375b2fd114..0f46115bc5a 100644 --- a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java @@ -38,7 +38,7 @@ public void init() { try { work(); } catch (Exception e) { - logger.info("Real-time event service fail. {}", e); + logger.error("Realtime event service fail.", e); } }, 1, 1, TimeUnit.SECONDS); logger.info("Realtime event service start."); @@ -81,7 +81,7 @@ public void flush(BlockEvent blockEvent, boolean isRemove) { && !instance.isTransactionLogTriggerSolidified() && !isRemove) { if (blockEvent.getTransactionLogTriggerCapsules() == null) { - logger.info("TransactionLogTriggerCapsules is null. {}", + logger.warn("TransactionLogTriggerCapsules is null. {}", blockEvent.getBlockId().getString()); } else { blockEvent.getTransactionLogTriggerCapsules().forEach(v -> @@ -91,7 +91,7 @@ public void flush(BlockEvent blockEvent, boolean isRemove) { if (instance.isContractEventTriggerEnable()) { if (blockEvent.getSmartContractTrigger() == null) { - logger.info("SmartContractTrigger is null. {}", blockEvent.getBlockId().getString()); + logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId().getString()); } else { blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { v.setTriggerName(Trigger.CONTRACTEVENT_TRIGGER_NAME); diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java index 5bf83ea0da9..6178b247b1d 100644 --- a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -29,8 +29,8 @@ public void init() { executor.scheduleWithFixedDelay(() -> { try { work(); - } catch (Exception exception) { - logger.error("Spread thread error", exception); + } catch (Exception e) { + logger.error("Solid event service fail.", e); } }, 1, 1, TimeUnit.SECONDS); logger.info("Solid event service start."); @@ -67,7 +67,7 @@ public void flush(BlockEvent blockEvent) { if (instance.isTransactionLogTriggerEnable() && instance.isTransactionLogTriggerSolidified()) { if (blockEvent.getTransactionLogTriggerCapsules() == null) { - logger.info("TransactionLogTrigger is null. {}", blockEvent.getBlockId()); + logger.warn("TransactionLogTrigger is null. {}", blockEvent.getBlockId()); } else { blockEvent.getTransactionLogTriggerCapsules().forEach(v -> manager.getTriggerCapsuleQueue().offer(v)); @@ -76,7 +76,7 @@ public void flush(BlockEvent blockEvent) { if (instance.isSolidityEventTriggerEnable()) { if (blockEvent.getSmartContractTrigger() == null) { - logger.info("SmartContractTrigger is null. {}", blockEvent.getBlockId()); + logger.warn("SmartContractTrigger is null. {}", blockEvent.getBlockId()); } else { blockEvent.getSmartContractTrigger().getContractEventTriggers().forEach(v -> { v.setTriggerName(Trigger.SOLIDITYEVENT_TRIGGER_NAME); @@ -100,7 +100,7 @@ public void flush(BlockEvent blockEvent) { if (instance.isSolidityTriggerEnable()) { if (blockEvent.getSolidityTriggerCapsule() == null) { - logger.info("SolidityTrigger is null. {}", blockEvent.getBlockId()); + logger.warn("SolidityTrigger is null. {}", blockEvent.getBlockId()); } else { manager.getTriggerCapsuleQueue().offer(blockEvent.getSolidityTriggerCapsule()); } From 128b5d35a4f8514db40abfcfd811cdd464bb4ef9 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Fri, 21 Feb 2025 15:55:26 +0800 Subject: [PATCH 062/107] feat(dependencies): bump logback from 1.2.9 to 1.2.13 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index aefae7956ec..14b095b1795 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ subprojects { dependencies { implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25' - implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.9' + implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.13' implementation "com.google.code.findbugs:jsr305:3.0.0" implementation group: 'org.springframework', name: 'spring-context', version: '5.3.18' implementation group: 'org.springframework', name: 'spring-tx', version: '5.3.18' From 698f895a1633d6b5d0297e243112bb733aa3089b Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 24 Feb 2025 14:28:41 +0800 Subject: [PATCH 063/107] reactor(actuator):rename allowStrictMath2 to disableJavaLangMath --- .../tron/core/actuator/AbstractActuator.java | 26 +++++++-------- .../actuator/DelegateResourceActuator.java | 5 ++- .../actuator/MarketSellAssetActuator.java | 8 ++--- .../org/tron/core/actuator/VMActuator.java | 32 +++++++++---------- .../org/tron/core/utils/TransactionUtil.java | 4 +-- .../tron/core/vm/PrecompiledContracts.java | 2 +- .../main/java/org/tron/core/vm/VMUtils.java | 4 +-- .../org/tron/core/vm/config/ConfigLoader.java | 2 +- .../DelegateResourceProcessor.java | 3 +- .../UnDelegateResourceProcessor.java | 4 +-- .../UnfreezeBalanceProcessor.java | 4 +-- .../java/org/tron/core/vm/program/Memory.java | 6 ++-- .../org/tron/core/vm/program/Program.java | 10 +++--- .../core/vm/repository/RepositoryImpl.java | 6 ++-- .../org/tron/core/vm/utils/FreezeV2Util.java | 6 ++-- .../java/org/tron/common/utils/Commons.java | 2 +- .../org/tron/common/utils/ForkController.java | 2 +- .../org/tron/core/capsule/AccountCapsule.java | 4 +-- .../tron/core/capsule/ContractCapsule.java | 4 +-- .../core/capsule/ContractStateCapsule.java | 8 ++--- .../org/tron/core/capsule/ReceiptCapsule.java | 6 ++-- .../tron/core/capsule/utils/MarketUtils.java | 8 ++--- .../org/tron/core/db/EnergyProcessor.java | 4 +-- .../org/tron/core/db/ResourceProcessor.java | 18 +++++------ .../org/tron/core/db/TransactionTrace.java | 12 +++---- .../tron/core/service/MortgageService.java | 2 +- .../core/store/DynamicPropertiesStore.java | 8 ++--- .../org/tron/common/runtime/vm/DataWord.java | 4 +-- .../org/tron/core/vm/config/VMConfig.java | 10 +++--- .../src/main/java/org/tron/core/Wallet.java | 14 ++++---- .../main/java/org/tron/core/db/Manager.java | 20 ++++++------ .../test/java/org/tron/common/BaseTest.java | 2 +- .../runtime/vm/BandWidthRuntimeTest.java | 2 +- .../tron/common/runtime/vm/FreezeV2Test.java | 2 +- .../org/tron/common/runtime/vm/VoteTest.java | 4 +-- .../UpdateSettingContractActuatorTest.java | 6 ++-- .../java/org/tron/core/db/ManagerTest.java | 2 +- .../core/services/ProposalServiceTest.java | 4 +-- 38 files changed, 131 insertions(+), 139 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java b/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java index 2f1bb450d1b..b5bdb9bcafc 100644 --- a/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/AbstractActuator.java @@ -69,15 +69,15 @@ public AbstractActuator setForkUtils(ForkController forkController) { } public long addExact(long x, long y) { - return Maths.addExact(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.addExact(x, y, this.disableJavaLangMath()); } public long addExact(int x, int y) { - return Maths.addExact(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.addExact(x, y, this.disableJavaLangMath()); } public long floorDiv(long x, long y) { - return Maths.floorDiv(x, y, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.floorDiv(x, y, this.disableJavaLangMath()); } public long floorDiv(long x, int y) { @@ -85,8 +85,7 @@ public long floorDiv(long x, int y) { } public long multiplyExact(long x, long y) { - return Maths.multiplyExact(x, y, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.multiplyExact(x, y, this.disableJavaLangMath()); } public long multiplyExact(long x, int y) { @@ -94,21 +93,19 @@ public long multiplyExact(long x, int y) { } public int multiplyExact(int x, int y) { - return Maths.multiplyExact(x, y, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.multiplyExact(x, y, this.disableJavaLangMath()); } public long subtractExact(long x, long y) { - return Maths.subtractExact(x, y, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.subtractExact(x, y, this.disableJavaLangMath()); } public int min(int a, int b) { - return Maths.min(a, b, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.min(a, b, this.disableJavaLangMath()); } public long min(long a, long b) { - return Maths.min(a, b, chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + return Maths.min(a, b, this.disableJavaLangMath()); } public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) @@ -122,7 +119,10 @@ public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long */ public void adjustBalance(AccountStore accountStore, AccountCapsule account, long amount) throws BalanceInsufficientException { - Commons.adjustBalance(accountStore, account, amount, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + Commons.adjustBalance(accountStore, account, amount, this.disableJavaLangMath()); + } + + private boolean disableJavaLangMath() { + return chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath(); } } diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 90e91d8d3b2..547171486ee 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -163,7 +162,7 @@ public boolean validate() throws ContractValidateException { long netUsage = (long) (accountNetUsage * TRX_PRECISION * ((double) (dynamicStore.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, - dynamicStore.allowStrictMath2()); + dynamicStore.disableJavaLangMath()); if (ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage < delegateBalance) { throw new ContractValidateException( "delegateBalance must be less than or equal to available FreezeBandwidthV2 balance"); @@ -177,7 +176,7 @@ public boolean validate() throws ContractValidateException { long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (dynamicStore.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage, - dynamicStore.allowStrictMath2()); + dynamicStore.disableJavaLangMath()); if (ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage < delegateBalance) { throw new ContractValidateException( "delegateBalance must be less than or equal to available FreezeEnergyV2 balance"); diff --git a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java index 43f21b716d8..b5b375ee391 100644 --- a/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/MarketSellAssetActuator.java @@ -400,10 +400,10 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, // => takerBuyTokenQuantityCurrent_A = takerSellTokenQuantityRemain_TRX * // makerSellTokenQuantity_A/makerBuyTokenQuantity_TRX - boolean useStrictMath2 = dynamicStore.allowStrictMath2(); + boolean disableMath = dynamicStore.disableJavaLangMath(); long takerBuyTokenQuantityRemain = MarketUtils .multiplyAndDivide(takerSellRemainQuantity, makerSellQuantity, makerBuyQuantity, - useStrictMath2); + disableMath); if (takerBuyTokenQuantityRemain == 0) { // quantity too small, return sellToken to user @@ -427,7 +427,7 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, makerBuyTokenQuantityReceive = MarketUtils .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); takerBuyTokenQuantityReceive = makerOrderCapsule.getSellTokenQuantityRemain(); long takerSellTokenLeft = @@ -462,7 +462,7 @@ private void matchSingleOrder(MarketOrderCapsule takerOrderCapsule, // makerSellTokenQuantity_A/makerBuyTokenQuantity_TRX makerBuyTokenQuantityReceive = MarketUtils .multiplyAndDivide(makerSellRemainQuantity, makerBuyQuantity, makerSellQuantity, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); MarketUtils.updateOrderState(makerOrderCapsule, State.INACTIVE, marketAccountStore); if (makerBuyTokenQuantityReceive == 0) { diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 42ddc65c745..bd34c96a9d9 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -128,7 +128,7 @@ public void validate(Object object) throws ContractValidateException { if (isConstantCall && trx.getRawData().getFeeLimit() > 0) { maxEnergyLimit = min(maxEnergyLimit, trx.getRawData().getFeeLimit() / context.getStoreFactory().getChainBaseManager() - .getDynamicPropertiesStore().getEnergyFee(), VMConfig.allowStrictMath2()); + .getDynamicPropertiesStore().getEnergyFee(), VMConfig.disableJavaLangMath()); } blockCap = context.getBlockCap(); if ((VMConfig.allowTvmFreeze() || VMConfig.allowTvmFreezeV2()) @@ -566,9 +566,9 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi } long energyFromBalance = max(account.getBalance() - callValue, 0, - VMConfig.allowStrictMath2()) / sunPerEnergy; + VMConfig.disableJavaLangMath()) / sunPerEnergy; long availableEnergy = addExact(leftFrozenEnergy, energyFromBalance, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); long energyFromFeeLimit = feeLimit / sunPerEnergy; if (VMConfig.allowTvmFreezeV2()) { @@ -585,12 +585,12 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi account.setEnergyUsage( energyProcessor.increase(account, ENERGY, account.getEnergyUsage(), min(leftFrozenEnergy, energyFromFeeLimit, - VMConfig.allowStrictMath2()), now, now)); + VMConfig.disableJavaLangMath()), now, now)); receipt.setCallerEnergyMergedUsage(account.getEnergyUsage()); receipt.setCallerEnergyMergedWindowSize(account.getWindowSize(ENERGY)); rootRepository.updateAccount(account.createDbKey(), account); } - return min(availableEnergy, energyFromFeeLimit, VMConfig.allowStrictMath2()); + return min(availableEnergy, energyFromFeeLimit, VMConfig.disableJavaLangMath()); } @@ -603,7 +603,7 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe } // can change the calc way long leftEnergyFromFreeze = rootRepository.getAccountLeftEnergyFromFreeze(account); - boolean isStrict2 = VMConfig.allowStrictMath2(); + boolean isStrict2 = VMConfig.disableJavaLangMath(); callValue = max(callValue, 0, isStrict2); long energyFromBalance = floorDiv(max( account.getBalance() - callValue, 0, isStrict2), sunPerEnergy, isStrict2); @@ -627,12 +627,12 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe } else { energyFromFeeLimit = addExact( leftEnergyFromFreeze, (feeLimit - leftBalanceForEnergyFreeze) / sunPerEnergy, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } } return min(addExact(leftEnergyFromFreeze, energyFromBalance, - VMConfig.allowStrictMath2()), energyFromFeeLimit, VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()), energyFromFeeLimit, VMConfig.disableJavaLangMath()); } public long getTotalEnergyLimit(AccountCapsule creator, AccountCapsule caller, @@ -708,7 +708,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent( - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); long originEnergyLimit = contractCapsule.getOriginEnergyLimit(); if (originEnergyLimit < 0) { @@ -724,7 +724,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu } if (consumeUserResourcePercent <= 0) { creatorEnergyLimit = min(originEnergyLeft, originEnergyLimit, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } else { if (consumeUserResourcePercent < VMConstant.ONE_HUNDRED) { // creatorEnergyLimit = @@ -735,8 +735,8 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu BigInteger.valueOf(callerEnergyLimit) .multiply(BigInteger.valueOf(VMConstant.ONE_HUNDRED - consumeUserResourcePercent)) .divide(BigInteger.valueOf(consumeUserResourcePercent)).longValueExact(), - min(originEnergyLeft, originEnergyLimit, VMConfig.allowStrictMath2()), - VMConfig.allowStrictMath2()); + min(originEnergyLeft, originEnergyLimit, VMConfig.disableJavaLangMath()), + VMConfig.disableJavaLangMath()); } } if (VMConfig.allowTvmFreezeV2()) { @@ -758,7 +758,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu rootRepository.updateAccount(creator.createDbKey(), creator); } return addExact(callerEnergyLimit, creatorEnergyLimit, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } private long getTotalEnergyLimitWithFloatRatio(AccountCapsule creator, AccountCapsule caller, @@ -775,16 +775,16 @@ private long getTotalEnergyLimitWithFloatRatio(AccountCapsule creator, AccountCa ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent( - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); if (creatorEnergyLimit * consumeUserResourcePercent > (VMConstant.ONE_HUNDRED - consumeUserResourcePercent) * callerEnergyLimit) { return floorDiv( callerEnergyLimit * VMConstant.ONE_HUNDRED, consumeUserResourcePercent, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } else { return addExact(callerEnergyLimit, creatorEnergyLimit, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } } diff --git a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java index a34afa9d32e..53d6caf5691 100644 --- a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java @@ -40,7 +40,6 @@ import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; -import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.exception.PermissionException; @@ -53,7 +52,6 @@ import org.tron.protos.Protocol.Transaction.Result.contractResult; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.BalanceContract.DelegateResourceContract; @Slf4j(topic = "capsule") @@ -271,7 +269,7 @@ public static long estimateConsumeBandWidthSize(DynamicPropertiesStore dps, long DelegateResourceContract.Builder builder2 = DelegateResourceContract.newBuilder() .setBalance(TRX_PRECISION); long builder2Size = builder2.build().getSerializedSize(); - long addSize = max(builderSize - builder2Size, 0L, dps.allowStrictMath2()); + long addSize = max(builderSize - builder2Size, 0L, dps.disableJavaLangMath()); return DELEGATE_COST_BASE_SIZE + addSize; } diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 53e2cba90d4..b53a196e0b6 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -626,7 +626,7 @@ public long getEnergyForData(byte[] data) { int expLen = parseLen(data, 1); int modLen = parseLen(data, 2); - boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + boolean allowStrictMath2 = VMConfig.disableJavaLangMath(); byte[] expHighBytes = parseBytes(data, addSafely(ARGS_OFFSET, baseLen), min(expLen, 32, allowStrictMath2)); diff --git a/actuator/src/main/java/org/tron/core/vm/VMUtils.java b/actuator/src/main/java/org/tron/core/vm/VMUtils.java index 090c4c54898..2f469e0579a 100644 --- a/actuator/src/main/java/org/tron/core/vm/VMUtils.java +++ b/actuator/src/main/java/org/tron/core/vm/VMUtils.java @@ -170,7 +170,7 @@ public static boolean validateForSmartContract(Repository deposit, byte[] ownerA "Validate InternalTransfer error, balance is not sufficient."); } - addExact(toAccount.getBalance(), amount, VMConfig.allowStrictMath2()); + addExact(toAccount.getBalance(), amount, VMConfig.disableJavaLangMath()); } catch (ArithmeticException e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); @@ -232,7 +232,7 @@ public static boolean validateForSmartContract(Repository deposit, byte[] ownerA if (assetBalance != null) { try { addExact(assetBalance, amount, - VMConfig.allowStrictMath2()); //check if overflow + VMConfig.disableJavaLangMath()); //check if overflow } catch (Exception e) { logger.debug(e.getMessage(), e); throw new ContractValidateException(e.getMessage()); diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index 508bedc34dc..81ed4ba2b8f 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -42,7 +42,7 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowEnergyAdjustment(ds.getAllowEnergyAdjustment()); VMConfig.initAllowStrictMath(ds.getAllowStrictMath()); VMConfig.initAllowTvmCancun(ds.getAllowTvmCancun()); - VMConfig.initAllowStrictMath2(ds.getConsensusLogicOptimization()); + VMConfig.initDisableJavaLangMath(ds.getConsensusLogicOptimization()); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java index 164f9711a20..b711eb427d1 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java @@ -10,7 +10,6 @@ import com.google.protobuf.ByteString; import java.util.Arrays; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.ChainBaseManager; @@ -54,7 +53,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra throw new ContractValidateException("delegateBalance must be greater than or equal to 1 TRX"); } - boolean allowStrictMath2 = dynamicStore.allowStrictMath2(); + boolean allowStrictMath2 = dynamicStore.disableJavaLangMath(); switch (param.getResourceType()) { case BANDWIDTH: { BandwidthProcessor processor = new BandwidthProcessor(ChainBaseManager.getInstance()); diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java index fc95f23cc03..99bcecdbd44 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java @@ -117,7 +117,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) { * dynamicStore.getTotalNetLimit() / repo.getTotalNetWeight()); transferUsage = (long) (receiverCapsule.getNetUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForBandwidth())); - transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.allowStrictMath2()); + transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.disableJavaLangMath()); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForBandwidth(-unDelegateBalance); } @@ -141,7 +141,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) { * dynamicStore.getTotalEnergyCurrentLimit() / repo.getTotalEnergyWeight()); transferUsage = (long) (receiverCapsule.getEnergyUsage() * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForEnergy())); - transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.allowStrictMath2()); + transferUsage = min(unDelegateMaxUsage, transferUsage, VMConfig.disableJavaLangMath()); receiverCapsule.addAcquiredDelegatedFrozenV2BalanceForEnergy(-unDelegateBalance); } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java index 2167635a28f..53981a22d34 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java @@ -137,11 +137,11 @@ public long execute(UnfreezeBalanceParam param, Repository repo) { switch (param.getResourceType()) { case BANDWIDTH: receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForBandwidth(-unfreezeBalance, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); break; case ENERGY: receiverCapsule.safeAddAcquiredDelegatedFrozenBalanceForEnergy(-unfreezeBalance, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/vm/program/Memory.java b/actuator/src/main/java/org/tron/core/vm/program/Memory.java index 70e4005a54a..4811bfb6e12 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Memory.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Memory.java @@ -105,7 +105,7 @@ public void extend(int address, int size) { if (size <= 0) { return; } - boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + boolean allowStrictMath2 = VMConfig.disableJavaLangMath(); final int newSize = addExact(address, size, allowStrictMath2); int toAllocate = newSize - internalSize(); if (toAllocate > 0) { @@ -194,7 +194,7 @@ public void copy(int destPos, int srcPos, int size) { private int captureMax(int chunkIndex, int chunkOffset, int size, byte[] src, int srcPos) { byte[] chunk = chunks.get(chunkIndex); - int toCapture = min(size, chunk.length - chunkOffset, VMConfig.allowStrictMath2()); + int toCapture = min(size, chunk.length - chunkOffset, VMConfig.disableJavaLangMath()); System.arraycopy(src, srcPos, chunk, chunkOffset, toCapture); return toCapture; @@ -203,7 +203,7 @@ private int captureMax(int chunkIndex, int chunkOffset, int size, byte[] src, in private int grabMax(int chunkIndex, int chunkOffset, int size, byte[] dest, int destPos) { byte[] chunk = chunks.get(chunkIndex); - int toGrab = min(size, chunk.length - chunkOffset, VMConfig.allowStrictMath2()); + int toGrab = min(size, chunk.length - chunkOffset, VMConfig.disableJavaLangMath()); System.arraycopy(chunk, chunkOffset, dest, destPos, toGrab); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 77326e0d81f..024acb670a0 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -168,7 +168,7 @@ static String formatBinData(byte[] binData, int startPC) { for (int i = 0; i < binData.length; i += 16) { ret.append(Utils.align("" + Integer.toHexString(startPC + (i)) + ":", ' ', 8, false)); ret.append(Hex.toHexString(binData, i, min(16, binData.length - i, - VMConfig.allowStrictMath2()))).append('\n'); + VMConfig.disableJavaLangMath()))).append('\n'); } return ret.toString(); } @@ -638,7 +638,7 @@ private void withdrawRewardAndCancelVote(byte[] owner, Repository repo) { long balance = ownerCapsule.getBalance(); long allowance = ownerCapsule.getAllowance(); ownerCapsule.setInstance(ownerCapsule.getInstance().toBuilder() - .setBalance(addExact(balance, allowance, VMConfig.allowStrictMath2())) + .setBalance(addExact(balance, allowance, VMConfig.disableJavaLangMath())) .setAllowance(0) .setLatestWithdrawTime(getTimestamp().longValue() * 1000) .build()); @@ -1237,7 +1237,7 @@ public DataWord getContractAddress() { public DataWord getBlockHash(int index) { if (index < this.getNumber().longValue() && index >= max(256, this.getNumber().longValue(), - VMConfig.allowStrictMath2()) - 256) { + VMConfig.disableJavaLangMath()) - 256) { BlockCapsule blockCapsule = contractState.getBlockByNum(index); @@ -2170,7 +2170,7 @@ public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, try { VoteWitnessParam param = new VoteWitnessParam(); param.setVoterAddress(owner); - boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + boolean allowStrictMath2 = VMConfig.disableJavaLangMath(); byte[] witnessArrayData = memoryChunk( addExact(witnessArrayOffset, DataWord.WORD_SIZE, allowStrictMath2), multiplyExact(witnessArrayLength, DataWord.WORD_SIZE, allowStrictMath2)); @@ -2253,7 +2253,7 @@ public long updateContextContractFactor() { VMConfig.getDynamicEnergyIncreaseFactor(), VMConfig.getDynamicEnergyMaxFactor(), VMConfig.allowStrictMath(), - VMConfig.allowStrictMath2())) { + VMConfig.disableJavaLangMath())) { contractState.updateContractState(getContextAddress(), contractStateCapsule ); } diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index e81aba2a862..a064cbf6c8a 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -189,7 +189,7 @@ public long getAccountLeftEnergyFromFreeze(AccountCapsule accountCapsule) { long newEnergyUsage = recover(energyUsage, latestConsumeTime, now, windowSize); - return max(energyLimit - newEnergyUsage, 0, VMConfig.allowStrictMath2()); // us + return max(energyLimit - newEnergyUsage, 0, VMConfig.disableJavaLangMath()); // us } @Override @@ -711,7 +711,7 @@ public long addBalance(byte[] address, long value) { StringUtil.createReadableString(accountCapsule.createDbKey()) + " insufficient balance"); } - accountCapsule.setBalance(addExact(balance, value, VMConfig.allowStrictMath2())); + accountCapsule.setBalance(addExact(balance, value, VMConfig.disableJavaLangMath())); Key key = Key.create(address); accountCache.put(key, Value.create(accountCapsule, accountCache.get(key).getType().addType(Type.DIRTY))); @@ -877,7 +877,7 @@ private long increase(long lastUsage, long usage, long lastTime, long now, long if (lastTime + windowSize > now) { long delta = now - lastTime; double decay = (windowSize - delta) / (double) windowSize; - averageLastUsage = round(averageLastUsage * decay, VMConfig.allowStrictMath2()); + averageLastUsage = round(averageLastUsage * decay, VMConfig.disableJavaLangMath()); } else { averageLastUsage = 0; } diff --git a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java index 753313afe43..28c190e2e7e 100644 --- a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java +++ b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java @@ -136,7 +136,7 @@ public static long queryAvailableUnfreezeV2Size(byte[] address, Repository repos long now = repository.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(); int unfreezingV2Count = accountCapsule.getUnfreezingV2Count(now); return max(UnfreezeBalanceV2Actuator.getUNFREEZE_MAX_TIMES() - unfreezingV2Count, 0L, - VMConfig.allowStrictMath2()); + VMConfig.disableJavaLangMath()); } public static long queryDelegatableResource(byte[] address, long type, Repository repository) { @@ -144,7 +144,7 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return 0L; } - boolean allowStrictMath2 = VMConfig.allowStrictMath2(); + boolean allowStrictMath2 = VMConfig.disableJavaLangMath(); AccountCapsule accountCapsule = repository.getAccount(address); if (accountCapsule == null) { return 0L; @@ -223,7 +223,7 @@ public static Triple checkUndelegateResource(byte[] address, l return Triple.of(0L, 0L, 0L); } - amount = min(amount, resourceLimit, VMConfig.allowStrictMath2()); + amount = min(amount, resourceLimit, VMConfig.disableJavaLangMath()); if (resourceLimit <= usagePair.getLeft()) { return Triple.of(0L, amount, usagePair.getRight()); } diff --git a/chainbase/src/main/java/org/tron/common/utils/Commons.java b/chainbase/src/main/java/org/tron/common/utils/Commons.java index 6bcff7ec6e9..b121e84ecfe 100644 --- a/chainbase/src/main/java/org/tron/common/utils/Commons.java +++ b/chainbase/src/main/java/org/tron/common/utils/Commons.java @@ -144,7 +144,7 @@ public static void adjustTotalShieldedPoolValue(long valueBalance, DynamicPropertiesStore dynamicPropertiesStore) throws BalanceInsufficientException { long totalShieldedPoolValue = subtractExact( dynamicPropertiesStore.getTotalShieldedPoolValue(), valueBalance, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); if (totalShieldedPoolValue < 0) { throw new BalanceInsufficientException(String.format( "total shielded pool value can not below 0, actual: %d", totalShieldedPoolValue)); diff --git a/chainbase/src/main/java/org/tron/common/utils/ForkController.java b/chainbase/src/main/java/org/tron/common/utils/ForkController.java index 0a782b31e5b..a702234f4cd 100644 --- a/chainbase/src/main/java/org/tron/common/utils/ForkController.java +++ b/chainbase/src/main/java/org/tron/common/utils/ForkController.java @@ -100,7 +100,7 @@ private boolean passNew(int version) { } } return count >= ceil((double) versionEnum.getHardForkRate() * stats.length / 100, - manager.getDynamicPropertiesStore().allowStrictMath2()); + manager.getDynamicPropertiesStore().disableJavaLangMath()); } diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index 26ee5bab34b..2768c06a393 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -733,7 +733,7 @@ public boolean addAssetAmount(byte[] key, long amount, boolean useStrict) { public boolean addAssetAmountV2(byte[] key, long amount, DynamicPropertiesStore dynamicPropertiesStore, AssetIssueStore assetIssueStore) { importAsset(key); - boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + boolean useStrict2 = dynamicPropertiesStore.disableJavaLangMath(); //key is token name if (dynamicPropertiesStore.getAllowSameTokenName() == 0) { Map assetMap = this.account.getAssetMap(); @@ -781,7 +781,7 @@ public boolean reduceAssetAmountV2(byte[] key, long amount, DynamicPropertiesStore dynamicPropertiesStore, AssetIssueStore assetIssueStore) { importAsset(key); //key is token name - boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + boolean useStrict2 = dynamicPropertiesStore.disableJavaLangMath(); if (dynamicPropertiesStore.getAllowSameTokenName() == 0) { Map assetMap = this.account.getAssetMap(); AssetIssueCapsule assetIssueCapsule = assetIssueStore.get(key); diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java index be73a338b90..f566a128d6b 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java @@ -109,9 +109,9 @@ public byte[] getOriginAddress() { return this.smartContract.getOriginAddress().toByteArray(); } - public long getConsumeUserResourcePercent(boolean useStrictMath2) { + public long getConsumeUserResourcePercent(boolean disableMath) { long percent = this.smartContract.getConsumeUserResourcePercent(); - return max(0, min(percent, Constant.ONE_HUNDRED, useStrictMath2), useStrictMath2); + return max(0, min(percent, Constant.ONE_HUNDRED, disableMath), disableMath); } public long getOriginEnergyLimit() { diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java index 8deeebaa758..bd932ea50ae 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java @@ -82,13 +82,13 @@ public boolean catchUpToCycle(DynamicPropertiesStore dps) { dps.getDynamicEnergyIncreaseFactor(), dps.getDynamicEnergyMaxFactor(), dps.allowStrictMath(), - dps.allowStrictMath2() + dps.disableJavaLangMath() ); } public boolean catchUpToCycle( long newCycle, long threshold, long increaseFactor, long maxFactor, - boolean useStrictMath, boolean useStrictMath2 + boolean useStrictMath, boolean disableMath ) { long lastCycle = getUpdateCycle(); @@ -115,7 +115,7 @@ public boolean catchUpToCycle( .setEnergyFactor(min( maxFactor, (long) ((getEnergyFactor() + precisionFactor) * increasePercent) - precisionFactor, - useStrictMath2)) + disableMath)) .build(); } @@ -140,7 +140,7 @@ public boolean catchUpToCycle( .setEnergyFactor(max( 0, (long) ((getEnergyFactor() + precisionFactor) * decreasePercent) - precisionFactor, - useStrictMath2)) + disableMath)) .build(); return true; diff --git a/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java index 29d80cebe3f..73c852805a2 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ReceiptCapsule.java @@ -218,7 +218,7 @@ public void payEnergyBill(DynamicPropertiesStore dynamicPropertiesStore, receipt.getEnergyUsageTotal(), receipt.getResult(), energyProcessor, now); return; } - boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + boolean useStrict2 = dynamicPropertiesStore.disableJavaLangMath(); if ((!Objects.isNull(origin)) && caller.getAddress().equals(origin.getAddress())) { payEnergyBill(dynamicPropertiesStore, accountStore, forkController, caller, @@ -240,7 +240,7 @@ public void payEnergyBill(DynamicPropertiesStore dynamicPropertiesStore, private long getOriginUsage(DynamicPropertiesStore dynamicPropertiesStore, AccountCapsule origin, long originEnergyLimit, EnergyProcessor energyProcessor, long originUsage) { - boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + boolean useStrict2 = dynamicPropertiesStore.disableJavaLangMath(); if (dynamicPropertiesStore.getAllowTvmFreeze() == 1 || dynamicPropertiesStore.supportUnfreezeDelay()) { return min(originUsage, min(originEnergyLeft, originEnergyLimit, useStrict2), useStrict2); @@ -306,7 +306,7 @@ private void payEnergyBill( } else { //send to blackHole Commons.adjustBalance(accountStore, accountStore.getBlackhole(), - energyFee, dynamicPropertiesStore.allowStrictMath2()); + energyFee, dynamicPropertiesStore.disableJavaLangMath()); } } diff --git a/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java b/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java index fb86cb1f456..d711ac0d63b 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java +++ b/chainbase/src/main/java/org/tron/core/capsule/utils/MarketUtils.java @@ -282,10 +282,10 @@ public static void updateOrderState(MarketOrderCapsule orderCapsule, } } - public static long multiplyAndDivide(long a, long b, long c, boolean useStrictMath2) { + public static long multiplyAndDivide(long a, long b, long c, boolean disableMath) { try { - long tmp = multiplyExact(a, b, useStrictMath2); - return floorDiv(tmp, c, useStrictMath2); + long tmp = multiplyExact(a, b, disableMath); + return floorDiv(tmp, c, disableMath); } catch (ArithmeticException ex) { // do nothing here, because we will use BigInteger to compute again } @@ -307,7 +307,7 @@ public static void returnSellTokenRemain(MarketOrderCapsule orderCapsule, if (Arrays.equals(sellTokenId, "_".getBytes())) { accountCapsule.setBalance(addExact( accountCapsule.getBalance(), sellTokenQuantityRemain, - dynamicStore.allowStrictMath2())); + dynamicStore.disableJavaLangMath())); } else { accountCapsule .addAssetAmountV2(sellTokenId, sellTokenQuantityRemain, dynamicStore, assetIssueStore); diff --git a/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java b/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java index ef326977451..b7c6354af37 100644 --- a/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/EnergyProcessor.java @@ -79,7 +79,7 @@ public void updateAdaptiveTotalEnergyLimit() { / AdaptiveResourceLimitConstants.EXPAND_RATE_DENOMINATOR; // logger.info(totalEnergyAverageUsage + "<" + targetTotalEnergyLimit + "\n" + result); } - boolean useStrict2 = dynamicPropertiesStore.allowStrictMath2(); + boolean useStrict2 = dynamicPropertiesStore.disableJavaLangMath(); result = min(max(result, totalEnergyLimit, useStrict2), totalEnergyLimit * dynamicPropertiesStore.getAdaptiveResourceLimitMultiplier(), useStrict2); @@ -178,7 +178,7 @@ public long getAccountLeftEnergyFromFreeze(AccountCapsule accountCapsule) { long newEnergyUsage = recovery(accountCapsule, ENERGY, energyUsage, latestConsumeTime, now); - return max(energyLimit - newEnergyUsage, 0, dynamicPropertiesStore.allowStrictMath2()); // us + return max(energyLimit - newEnergyUsage, 0, dynamicPropertiesStore.disableJavaLangMath()); // us } private long getHeadSlot() { diff --git a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java index 9b446079337..1d6cd1c7415 100644 --- a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java @@ -54,7 +54,7 @@ protected long increase(long lastUsage, long usage, long lastTime, long now, lon long delta = now - lastTime; double decay = (windowSize - delta) / (double) windowSize; averageLastUsage = round(averageLastUsage * decay, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); } else { averageLastUsage = 0; } @@ -83,7 +83,7 @@ public long increase(AccountCapsule accountCapsule, ResourceCode resourceCode, long delta = now - lastTime; double decay = (oldWindowSize - delta) / (double) oldWindowSize; averageLastUsage = round(averageLastUsage * decay, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); } else { averageLastUsage = 0; } @@ -116,7 +116,7 @@ public long increaseV2(AccountCapsule accountCapsule, ResourceCode resourceCode, long delta = now - lastTime; double decay = (oldWindowSize - delta) / (double) oldWindowSize; averageLastUsage = round(averageLastUsage * decay, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); } else { averageLastUsage = 0; } @@ -133,7 +133,7 @@ public long increaseV2(AccountCapsule accountCapsule, ResourceCode resourceCode, long newWindowSize = divideCeil( remainUsage * remainWindowSize + usage * this.windowSize * WINDOW_SIZE_PRECISION, newUsage); newWindowSize = min(newWindowSize, this.windowSize * WINDOW_SIZE_PRECISION, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); accountCapsule.setNewWindowSizeV2(resourceCode, newWindowSize); return newUsage; } @@ -196,7 +196,7 @@ public void unDelegateIncreaseV2(AccountCapsule owner, final AccountCapsule rece ownerUsage * remainOwnerWindowSizeV2 + transferUsage * remainReceiverWindowSizeV2, newOwnerUsage); newOwnerWindowSize = min(newOwnerWindowSize, this.windowSize * WINDOW_SIZE_PRECISION, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); owner.setNewWindowSizeV2(resourceCode, newOwnerWindowSize); owner.setUsage(resourceCode, newOwnerUsage); owner.setLatestTime(resourceCode, now); @@ -224,14 +224,14 @@ protected boolean consumeFeeForBandwidth(AccountCapsule accountCapsule, long fee long latestOperationTime = dynamicPropertiesStore.getLatestBlockHeaderTimestamp(); accountCapsule.setLatestOperationTime(latestOperationTime); Commons.adjustBalance(accountStore, accountCapsule, -fee, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); if (dynamicPropertiesStore.supportTransactionFeePool()) { dynamicPropertiesStore.addTransactionFeePool(fee); } else if (dynamicPropertiesStore.supportBlackHoleOptimization()) { dynamicPropertiesStore.burnTrx(fee); } else { Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); } return true; @@ -245,12 +245,12 @@ protected boolean consumeFeeForNewAccount(AccountCapsule accountCapsule, long fe long latestOperationTime = dynamicPropertiesStore.getLatestBlockHeaderTimestamp(); accountCapsule.setLatestOperationTime(latestOperationTime); Commons.adjustBalance(accountStore, accountCapsule, -fee, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); if (dynamicPropertiesStore.supportBlackHoleOptimization()) { dynamicPropertiesStore.burnTrx(fee); } else { Commons.adjustBalance(accountStore, accountStore.getBlackhole().createDbKey(), +fee, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); } return true; diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java index 114197a3407..a65c814246d 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java @@ -4,7 +4,6 @@ import static org.tron.common.math.Maths.min; import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE; import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CREATION_TYPE; -import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.ENERGY; import java.util.Objects; @@ -41,7 +40,6 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.Transaction.Result.contractResult; -import org.tron.protos.contract.Common; import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @@ -246,11 +244,11 @@ public void pay() throws BalanceInsufficientException { callerAccount = callContract.getOwnerAddress().toByteArray(); originAccount = contractCapsule.getOriginAddress(); - boolean useStrictMath2 = dynamicPropertiesStore.allowStrictMath2(); + boolean disableMath = dynamicPropertiesStore.disableJavaLangMath(); percent = max(Constant.ONE_HUNDRED - contractCapsule.getConsumeUserResourcePercent( - useStrictMath2), 0, useStrictMath2); + disableMath), 0, disableMath); percent = min(percent, Constant.ONE_HUNDRED, - useStrictMath2); + disableMath); originEnergyLimit = contractCapsule.getOriginEnergyLimit(); break; default: @@ -303,7 +301,7 @@ private void resetAccountUsage(AccountCapsule accountCap, // If area merging happened during suicide, use the current window size long newSize = mergedSize == currentSize ? size : currentSize; // Calc new usage by fixed x-axes - long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.allowStrictMath2()); + long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.disableJavaLangMath()); // Reset account usage and window size accountCap.setEnergyUsage(newUsage); accountCap.setNewWindowSize(ENERGY, newUsage == 0 ? 0L : newSize); @@ -320,7 +318,7 @@ private void resetAccountUsageV2(AccountCapsule accountCap, long newSize = mergedSize == currentSize ? size : currentSize; long newSize2 = mergedSize == currentSize ? size2 : currentSize2; // Calc new usage by fixed x-axes - long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.allowStrictMath2()); + long newUsage = max(0, newArea / newSize, dynamicPropertiesStore.disableJavaLangMath()); // Reset account usage and window size accountCap.setEnergyUsage(newUsage); accountCap.setNewWindowSizeV2(ENERGY, newUsage == 0 ? 0L : newSize2); diff --git a/chainbase/src/main/java/org/tron/core/service/MortgageService.java b/chainbase/src/main/java/org/tron/core/service/MortgageService.java index 233c142f053..b1fd279c2db 100644 --- a/chainbase/src/main/java/org/tron/core/service/MortgageService.java +++ b/chainbase/src/main/java/org/tron/core/service/MortgageService.java @@ -208,7 +208,7 @@ private long computeReward(long beginCycle, long endCycle, AccountCapsule accoun .collect(Collectors.toList()); if (beginCycle < newAlgorithmCycle) { long oldEndCycle = min(endCycle, newAlgorithmCycle, - dynamicPropertiesStore.allowStrictMath2()); + dynamicPropertiesStore.disableJavaLangMath()); reward = getOldReward(beginCycle, oldEndCycle, srAddresses); beginCycle = oldEndCycle; } diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 8d1fb19ea2b..865555b35a8 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2246,7 +2246,7 @@ public void addTotalNetWeight(long amount) { long totalNetWeight = getTotalNetWeight(); totalNetWeight += amount; if (allowNewReward()) { - totalNetWeight = max(0, totalNetWeight, allowStrictMath2()); + totalNetWeight = max(0, totalNetWeight, disableJavaLangMath()); } saveTotalNetWeight(totalNetWeight); } @@ -2259,7 +2259,7 @@ public void addTotalEnergyWeight(long amount) { long totalEnergyWeight = getTotalEnergyWeight(); totalEnergyWeight += amount; if (allowNewReward()) { - totalEnergyWeight = max(0, totalEnergyWeight, allowStrictMath2()); + totalEnergyWeight = max(0, totalEnergyWeight, disableJavaLangMath()); } saveTotalEnergyWeight(totalEnergyWeight); } @@ -2272,7 +2272,7 @@ public void addTotalTronPowerWeight(long amount) { long totalWeight = getTotalTronPowerWeight(); totalWeight += amount; if (allowNewReward()) { - totalWeight = max(0, totalWeight, allowStrictMath2()); + totalWeight = max(0, totalWeight, disableJavaLangMath()); } saveTotalTronPowerWeight(totalWeight); } @@ -2897,7 +2897,7 @@ public boolean allowStrictMath() { return getAllowStrictMath() == 1L; } - public boolean allowStrictMath2() { + public boolean disableJavaLangMath() { return this.allowConsensusLogicOptimization(); } diff --git a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java index 1601dcaad28..faeae45782e 100644 --- a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java +++ b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java @@ -169,7 +169,7 @@ public byte[] getClonedData() { byte[] ret = ByteUtil.EMPTY_BYTE_ARRAY; if (data != null) { ret = new byte[WORD_SIZE]; - int dataSize = min(data.length, WORD_SIZE, VMConfig.allowStrictMath2()); + int dataSize = min(data.length, WORD_SIZE, VMConfig.disableJavaLangMath()); System.arraycopy(data, 0, ret, 0, dataSize); } return ret; @@ -488,7 +488,7 @@ public int compareTo(DataWord o) { data, 0, data.length, o.getData(), 0, o.getData().length); // Convert result into -1, 0 or 1 as is the convention - return (int) signum(result, VMConfig.allowStrictMath2()); + return (int) signum(result, VMConfig.disableJavaLangMath()); } public void signExtend(byte k) { diff --git a/common/src/main/java/org/tron/core/vm/config/VMConfig.java b/common/src/main/java/org/tron/core/vm/config/VMConfig.java index fa99daf20f4..23210f284c0 100644 --- a/common/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/common/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -55,7 +55,7 @@ public class VMConfig { private static boolean ALLOW_TVM_CANCUN = false; - private static Boolean ALLOW_STRICT_MATH_2 = false; + private static Boolean DISABLE_JAVA_LANG_MATH = false; private VMConfig() { } @@ -156,8 +156,8 @@ public static void initAllowTvmCancun(long allow) { ALLOW_TVM_CANCUN = allow == 1; } - public static void initAllowStrictMath2(long allow) { - ALLOW_STRICT_MATH_2 = allow == 1; + public static void initDisableJavaLangMath(long allow) { + DISABLE_JAVA_LANG_MATH = allow == 1; } public static boolean getEnergyLimitHardFork() { @@ -248,7 +248,7 @@ public static boolean allowTvmCancun() { return ALLOW_TVM_CANCUN; } - public static boolean allowStrictMath2() { - return ALLOW_STRICT_MATH_2; + public static boolean disableJavaLangMath() { + return DISABLE_JAVA_LANG_MATH; } } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index b7a1bdd9501..27c942bf6b4 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -903,10 +903,10 @@ public long calcCanDelegatedBandWidthMaxSize( long netUsage = (long) (accountNetUsage * TRX_PRECISION * ((double) (dynamicStore.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, dynamicStore.allowStrictMath2()); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage, dynamicStore.disableJavaLangMath()); long maxSize = ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage; - return max(0, maxSize, dynamicStore.allowStrictMath2()); + return max(0, maxSize, dynamicStore.disableJavaLangMath()); } public long calcCanDelegatedEnergyMaxSize(ByteString ownerAddress) { @@ -924,10 +924,10 @@ public long calcCanDelegatedEnergyMaxSize(ByteString ownerAddress) { (dynamicStore.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage, - dynamicStore.allowStrictMath2()); + dynamicStore.disableJavaLangMath()); long maxSize = ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage; - return max(0, maxSize, dynamicStore.allowStrictMath2()); + return max(0, maxSize, dynamicStore.disableJavaLangMath()); } public DelegatedResourceAccountIndex getDelegatedResourceAccountIndex(ByteString address) { @@ -3010,7 +3010,7 @@ public Transaction estimateEnergy(TriggerSmartContract triggerSmartContract, txRetBuilder.setResult(true); txRetBuilder.setCode(response_code.SUCCESS); estimateBuilder.setEnergyRequired((long) ceil((double) high / dps.getEnergyFee(), - dps.allowStrictMath2())); + dps.disableJavaLangMath())); } return transaction; @@ -3572,7 +3572,7 @@ public ShieldedTRC20Parameters createShieldedContractParameters( try { totalToAmount = receiveSize == 0 ? scaledToAmount : (addExact( scaledToAmount, shieldedReceives.get(0).getNote().getValue(), - dbManager.getDynamicPropertiesStore().allowStrictMath2())); + dbManager.getDynamicPropertiesStore().disableJavaLangMath())); } catch (ArithmeticException e) { throw new ZksnarkException("Unbalanced burn!"); } @@ -3705,7 +3705,7 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk( try { totalToAmount = receiveSize == 0 ? scaledToAmount : addExact( scaledToAmount, shieldedReceives.get(0).getNote().getValue(), - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); } catch (ArithmeticException e) { throw new ZksnarkException("Unbalanced burn!"); } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 096476a1bbe..cb7164a3bac 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -930,20 +930,20 @@ public void consumeMultiSignFee(TransactionCapsule trx, TransactionTrace trace) throws AccountResourceInsufficientException { if (trx.getInstance().getSignatureCount() > 1) { long fee = getDynamicPropertiesStore().getMultiSignFee(); - boolean useStrictMath2 = getDynamicPropertiesStore().allowStrictMath2(); + boolean disableMath = getDynamicPropertiesStore().disableJavaLangMath(); List contracts = trx.getInstance().getRawData().getContractList(); for (Contract contract : contracts) { byte[] address = TransactionCapsule.getOwner(contract); AccountCapsule accountCapsule = getAccountStore().get(address); try { if (accountCapsule != null) { - adjustBalance(getAccountStore(), accountCapsule, -fee, useStrictMath2); + adjustBalance(getAccountStore(), accountCapsule, -fee, disableMath); if (getDynamicPropertiesStore().supportBlackHoleOptimization()) { getDynamicPropertiesStore().burnTrx(fee); } else { adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee, - useStrictMath2); + disableMath); } } } catch (BalanceInsufficientException e) { @@ -968,20 +968,20 @@ public void consumeMemoFee(TransactionCapsule trx, TransactionTrace trace) if (fee == 0) { return; } - boolean useStrictMath2 = getDynamicPropertiesStore().allowStrictMath2(); + boolean disableMath = getDynamicPropertiesStore().disableJavaLangMath(); List contracts = trx.getInstance().getRawData().getContractList(); for (Contract contract : contracts) { byte[] address = TransactionCapsule.getOwner(contract); AccountCapsule accountCapsule = getAccountStore().get(address); try { if (accountCapsule != null) { - adjustBalance(getAccountStore(), accountCapsule, -fee, useStrictMath2); + adjustBalance(getAccountStore(), accountCapsule, -fee, disableMath); if (getDynamicPropertiesStore().supportBlackHoleOptimization()) { getDynamicPropertiesStore().burnTrx(fee); } else { adjustBalance(getAccountStore(), this.getAccountStore().getBlackhole(), +fee, - useStrictMath2); + disableMath); } } } catch (BalanceInsufficientException e) { @@ -1871,7 +1871,7 @@ private void payReward(BlockCapsule block) { long transactionFeeReward = floorDiv( chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), Constant.TRANSACTION_FEE_POOL_PERIOD, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); mortgageService.payTransactionFeeReward(witnessCapsule.getAddress().toByteArray(), transactionFeeReward); chainBaseManager.getDynamicPropertiesStore().saveTransactionFeePool( @@ -1888,7 +1888,7 @@ private void payReward(BlockCapsule block) { long transactionFeeReward = floorDiv( chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool(), Constant.TRANSACTION_FEE_POOL_PERIOD, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); account.setAllowance(account.getAllowance() + transactionFeeReward); chainBaseManager.getDynamicPropertiesStore().saveTransactionFeePool( chainBaseManager.getDynamicPropertiesStore().getTransactionFeePool() @@ -2458,9 +2458,9 @@ private void initLiteNode() { transactionCount += trx.getTransactionIds().size(); long blockNum = trx.getNum(); maxBlock = max(maxBlock, blockNum, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); minBlock = min(minBlock, blockNum, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); item.setBlockNum(blockNum); trx.getTransactionIds().forEach( tid -> chainBaseManager.getTransactionStore().put(Hex.decode(tid), item)); diff --git a/framework/src/test/java/org/tron/common/BaseTest.java b/framework/src/test/java/org/tron/common/BaseTest.java index 9eddef83fba..552808b842c 100644 --- a/framework/src/test/java/org/tron/common/BaseTest.java +++ b/framework/src/test/java/org/tron/common/BaseTest.java @@ -109,6 +109,6 @@ public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] priva public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) throws BalanceInsufficientException { Commons.adjustBalance(accountStore, accountAddress, amount, - chainBaseManager.getDynamicPropertiesStore().allowStrictMath2()); + chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath()); } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index 9e58233c922..698ba5f2923 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -251,7 +251,7 @@ public void testMaxContractResultSize() { } Result result = Result.newBuilder().setContractRet(cr).build(); maxSize = max(maxSize, result.getSerializedSize(), - dbManager.getDynamicPropertiesStore().allowStrictMath2()); + dbManager.getDynamicPropertiesStore().disableJavaLangMath()); } Assert.assertEquals(2, maxSize); } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java index 276a4a547f4..907398f163b 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/FreezeV2Test.java @@ -860,7 +860,7 @@ private TVMTestResult unDelegateResource( * ((double) (amount) / oldReceiver.getAllFrozenBalanceForEnergy())); } transferUsage = min(unDelegateMaxUsage, transferUsage, - manager.getDynamicPropertiesStore().allowStrictMath2()); + manager.getDynamicPropertiesStore().disableJavaLangMath()); } DelegatedResourceStore delegatedResourceStore = manager.getDelegatedResourceStore(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java b/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java index fc3b16f8f2e..d6493ed8018 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/VoteTest.java @@ -5,7 +5,6 @@ import static org.tron.protos.Protocol.Transaction.Result.contractResult.REVERT; import static org.tron.protos.Protocol.Transaction.Result.contractResult.SUCCESS; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -30,7 +29,6 @@ import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.common.utils.WalletUtil; import org.tron.common.utils.client.utils.AbiUtil; @@ -865,7 +863,7 @@ private void checkRewardAndWithdraw(byte[] contract, boolean isZero) throws Exce long beginCycle = manager.getDelegationStore().getBeginCycle(contract); long currentCycle = manager.getDynamicPropertiesStore().getCurrentCycleNumber(); long passedCycle = max(0, currentCycle - beginCycle, - manager.getDynamicPropertiesStore().allowStrictMath2()); + manager.getDynamicPropertiesStore().disableJavaLangMath()); Assert.assertTrue(isZero ? rewardBySystem == 0 : rewardBySystem > 0); triggerContract(contract, SUCCESS, getConsumer(">=", rewardBySystem) diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java index 1f9a9af825c..213bbd6cb85 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java @@ -109,7 +109,7 @@ public void successUpdateSettingContract() { Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) .getConsumeUserResourcePercent( - dbManager.getDynamicPropertiesStore().allowStrictMath2()), TARGET_PERCENT); + dbManager.getDynamicPropertiesStore().disableJavaLangMath()), TARGET_PERCENT); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { @@ -246,7 +246,7 @@ public void twiceUpdateSettingContract() { Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) .getConsumeUserResourcePercent( - dbManager.getDynamicPropertiesStore().allowStrictMath2()), TARGET_PERCENT); + dbManager.getDynamicPropertiesStore().disableJavaLangMath()), TARGET_PERCENT); // second secondActuator.validate(); @@ -256,7 +256,7 @@ public void twiceUpdateSettingContract() { Assert.assertEquals( dbManager.getContractStore().get(ByteArray.fromHexString(CONTRACT_ADDRESS)) .getConsumeUserResourcePercent( - dbManager.getDynamicPropertiesStore().allowStrictMath2()), 90L); + dbManager.getDynamicPropertiesStore().disableJavaLangMath()), 90L); } catch (ContractValidateException e) { Assert.assertFalse(e instanceof ContractValidateException); diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index c17cba03304..a7fc2feaf87 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -1196,6 +1196,6 @@ public void blockTrigger() { public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) throws BalanceInsufficientException { Commons.adjustBalance(accountStore, accountAddress, amount, - chainManager.getDynamicPropertiesStore().allowStrictMath2()); + chainManager.getDynamicPropertiesStore().disableJavaLangMath()); } } diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index c1b0f8bb507..300a38a0916 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -113,7 +113,7 @@ public void testUpdateConsensusLogicOptimization() { Assert.assertEquals(v, 0); Assert.assertTrue(!dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); Assert.assertFalse(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); - Assert.assertFalse(dbManager.getDynamicPropertiesStore().allowStrictMath2()); + Assert.assertFalse(dbManager.getDynamicPropertiesStore().disableJavaLangMath()); long value = 1; Proposal proposal = @@ -128,7 +128,7 @@ public void testUpdateConsensusLogicOptimization() { Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()); Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowWitnessSortOptimization()); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().allowStrictMath2()); + Assert.assertTrue(dbManager.getDynamicPropertiesStore().disableJavaLangMath()); } } \ No newline at end of file From 87695361b6e45fc71742ae0b2b6d2969e22f5283 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Mon, 24 Feb 2025 15:04:52 +0800 Subject: [PATCH 064/107] feat(config): modify fastForward configuration --- framework/src/main/resources/config.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 49b11d41e42..a89d6fd094e 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -201,7 +201,7 @@ node { ] fastForward = [ - "100.26.245.209:18888", + "100.27.171.62:18888", "15.188.6.125:18888" ] From 5460d12f84b6222eaa9a1b2da1a2f3896d53264c Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 24 Feb 2025 15:21:40 +0800 Subject: [PATCH 065/107] clear ch.qos.logback:1.2.9 --- gradle/verification-metadata.xml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3e061306873..34ab41b748a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -33,14 +33,6 @@ - - - - - - - - @@ -49,24 +41,11 @@ - - - - - - - - - - - - - From fbaa09bf989070c42f673122b619b0bea1278097 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 24 Feb 2025 16:06:43 +0800 Subject: [PATCH 066/107] feat(workflows): upgrade CodeQL Action to v3 see: https://github.blog/changelog/2025-01-10-code-scanning-codeql-action-v2-is-now-deprecated/ --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4ab98d5cf3c..5a0f120e116 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -46,7 +46,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -59,6 +59,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" From f187e1031f36a147f7aac5e708b6663b2eb8b134 Mon Sep 17 00:00:00 2001 From: Liulei Date: Tue, 25 Feb 2025 11:53:37 +0800 Subject: [PATCH 067/107] fix(tvm): revert tstore in staticcall --- .../src/main/java/org/tron/core/vm/OperationActions.java | 3 +++ .../core/vm/program/invoke/ProgramInvokeMockImpl.java | 4 ++++ .../java/org/tron/common/runtime/vm/OperationsTest.java | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index 95370ff16bb..fa1aedbb5f8 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -656,6 +656,9 @@ public static void tLoadAction(Program program) { } public static void tStoreAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } DataWord key = program.stackPop(); DataWord value = program.stackPop(); DataWord address = program.getContractAddress(); diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java index e22c5d06578..567ac72931a 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java @@ -210,6 +210,10 @@ public void setOwnerAddress(byte[] ownerAddress) { this.ownerAddress = Arrays.clone(ownerAddress); } + public void setStaticCall(boolean isStatic) { + isStaticCall = isStatic; + } + @Override public boolean isStaticCall() { return isStaticCall; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index 01d54c2194a..fe04b4719a6 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -953,6 +953,15 @@ public void testTransientStorageOperations() throws ContractValidateException { // TSTORE = 0x5d; op = new byte[] {0x60, 0x01, 0x60, 0x01, 0x5d}; + + invoke.setStaticCall(true); + program = new Program(op, op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(20000, program.getResult().getEnergyUsed()); + Assert.assertTrue(program.getResult().getException() + instanceof Program.StaticCallModificationException); + + invoke.setStaticCall(false); program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(106, program.getResult().getEnergyUsed()); From adab9ddeb44476500a702133fca040be5ff30d18 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Wed, 26 Feb 2025 11:08:41 +0800 Subject: [PATCH 068/107] feat(start): adjust consensusService start before tronNetService Closes #6215 --- .../java/org/tron/common/application/ApplicationImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index 9224ddaee14..ffb70722822 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -42,10 +42,10 @@ public class ApplicationImpl implements Application { public void startup() { this.startServices(); eventService.init(); + consensusService.start(); if ((!Args.getInstance().isSolidityNode()) && (!Args.getInstance().isP2pDisable())) { tronNetService.start(); } - consensusService.start(); MetricsUtil.init(); } @@ -53,10 +53,10 @@ public void startup() { public void shutdown() { this.shutdownServices(); eventService.close(); - consensusService.stop(); if (!Args.getInstance().isSolidityNode() && (!Args.getInstance().p2pDisable)) { tronNetService.close(); } + consensusService.stop(); dbManager.close(); shutdown.countDown(); } From 34393f62128db9e2930a26e7e5a1a3f1b5c27420 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Wed, 26 Feb 2025 18:57:05 +0800 Subject: [PATCH 069/107] feat(test): optimize unit testing configuration --- .../common/utils/client/WalletClient.java | 59 --- .../common/utils/client/utils/HttpMethed.java | 17 +- .../core/services/NodeInfoServiceTest.java | 16 - .../src/test/resources/config-localtest.conf | 4 +- framework/src/test/resources/testng.conf | 499 ------------------ 5 files changed, 9 insertions(+), 586 deletions(-) delete mode 100644 framework/src/test/resources/testng.conf diff --git a/framework/src/test/java/org/tron/common/utils/client/WalletClient.java b/framework/src/test/java/org/tron/common/utils/client/WalletClient.java index 37b67ffaa46..9d9a68da49d 100644 --- a/framework/src/test/java/org/tron/common/utils/client/WalletClient.java +++ b/framework/src/test/java/org/tron/common/utils/client/WalletClient.java @@ -96,65 +96,6 @@ public WalletClient(final ECKey ecKey) { this.ecKey = ecKey; } - /** - * constructor. - */ - - public static boolean init(int itype) { - Config config = Configuration.getByPath("testng.conf"); - dbPath = config.getString("CityDb.DbPath"); - txtPath = System.getProperty("user.dir") + '/' + config.getString("CityDb.TxtPath"); - - String fullNodepathname = ""; - - if (1000 == itype) { - fullNodepathname = "checkfullnode.ip.list"; - } else { - fullNodepathname = "fullnode.ip.list"; - } - String fullNode = ""; - String solidityNode = ""; - if (config.hasPath("soliditynode.ip.list")) { - solidityNode = config.getStringList("soliditynode.ip.list").get(0); - } - if (config.hasPath(fullNodepathname)) { - fullNode = config.getStringList(fullNodepathname).get(itype); - } - if (config.hasPath("net.type") && "mainnet".equalsIgnoreCase(config.getString("net.type"))) { - WalletClient.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - } else { - WalletClient.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_TESTNET); - } - rpcCli = new GrpcClient(fullNode, solidityNode); - return true; - } - - /** - * constructor. - */ - - public static GrpcClient init() { - //Config config = org.tron.core.config.Configuration.getByPath("config.conf"); - Config config = Configuration.getByPath("testng.conf"); - dbPath = config.getString("CityDb.DbPath"); - txtPath = System.getProperty("user.dir") + "/" + config.getString("CityDb.TxtPath"); - - String fullNode = ""; - String solidityNode = ""; - if (config.hasPath("soliditynode.ip.list")) { - solidityNode = config.getStringList("soliditynode.ip.list").get(0); - } - if (config.hasPath("fullnode.ip.list")) { - fullNode = config.getStringList("fullnode.ip.list").get(0); - } - if (config.hasPath("net.type") && "mainnet".equalsIgnoreCase(config.getString("net.type"))) { - WalletClient.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - } else { - WalletClient.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_TESTNET); - } - return new GrpcClient(fullNode, solidityNode); - } - public static byte getAddressPreFixByte() { return addressPreFixByte; } diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java b/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java index 5a085e16ca6..a68bb616f11 100644 --- a/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java +++ b/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java @@ -36,10 +36,8 @@ public class HttpMethed { static HttpClient httpClient; static HttpPost httppost; static HttpResponse response; - static Integer connectionTimeout = - Configuration.getByPath("testng.conf").getInt("defaultParameter.httpConnectionTimeout"); - static Integer soTimeout = - Configuration.getByPath("testng.conf").getInt("defaultParameter.httpSoTimeout"); + static Integer connectionTimeout = 19000; + static Integer soTimeout = 18000; static String transactionString; static String transactionSignString; static JSONObject responseContent; @@ -48,8 +46,7 @@ public class HttpMethed { public static volatile Integer witnessNum; /** constructor. */ - private static volatile String httpnode = - Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(1); + private static volatile String httpnode = "127.0.0.1:50052"; /** constructor. */ public static Integer getWitnessNum() { @@ -1171,7 +1168,7 @@ public static String gettransactionsign( String httpNode, String transactionString, String privateKey) { try { transactionSignString = TransactionUtils.getTransactionSign(transactionString, privateKey, - false); + false); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -3446,7 +3443,7 @@ public static Boolean getSpendResult( String jsonString = responseContent.toJSONString(); if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; @@ -3501,7 +3498,7 @@ public static Boolean getSpendResultFromSolidity( String jsonString = responseContent.toJSONString(); if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; @@ -3552,7 +3549,7 @@ public static Boolean getSpendResultFromPbft( String jsonString = responseContent.toJSONString(); if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; diff --git a/framework/src/test/java/org/tron/core/services/NodeInfoServiceTest.java b/framework/src/test/java/org/tron/core/services/NodeInfoServiceTest.java index 19d0540e5e6..be0a96f632b 100644 --- a/framework/src/test/java/org/tron/core/services/NodeInfoServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/NodeInfoServiceTest.java @@ -4,21 +4,15 @@ import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; -import io.grpc.ManagedChannelBuilder; import java.net.InetSocketAddress; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.mockito.Mockito; -import org.tron.api.GrpcAPI.EmptyMessage; -import org.tron.api.WalletGrpc; -import org.tron.api.WalletGrpc.WalletBlockingStub; import org.tron.common.application.TronApplicationContext; import org.tron.common.entity.NodeInfo; import org.tron.common.utils.Sha256Hash; -import org.tron.common.utils.client.Configuration; import org.tron.core.capsule.BlockCapsule; import org.tron.core.net.P2pEventHandlerImpl; -import org.tron.core.net.peer.PeerManager; import org.tron.p2p.connection.Channel; import org.tron.program.Version; @@ -29,8 +23,6 @@ public class NodeInfoServiceTest { private NodeInfoService nodeInfoService; private WitnessProductBlockService witnessProductBlockService; private P2pEventHandlerImpl p2pEventHandler; - private String fullnode = Configuration.getByPath("testng.conf").getStringList("fullnode.ip.list") - .get(0); public NodeInfoServiceTest(TronApplicationContext context) { nodeInfoService = context.getBean("nodeInfoService", NodeInfoService.class); @@ -60,12 +52,4 @@ public void test() { logger.info("{}", JSON.toJSONString(nodeInfo)); } - public void testGrpc() { - WalletBlockingStub walletStub = WalletGrpc - .newBlockingStub(ManagedChannelBuilder.forTarget(fullnode) - .usePlaintext() - .build()); - logger.info("getNodeInfo: {}", walletStub.getNodeInfo(EmptyMessage.getDefaultInstance())); - } - } diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index 44c051e1079..b6c1f41154a 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -225,7 +225,7 @@ genesis.block = { witnesses = [ { - address: TN3zfjYUmMFK3ZsHSsrdJoNRtGkQmZLBLz + address: TEDapYSVvAZ3aYH7w8N9tMEEFKaNKUD5Bp url = "http://Test.org", voteCount = 106 }, @@ -262,7 +262,7 @@ genesis.block = { //localWitnessAccountAddress = TN3zfjYUmMFK3ZsHSsrdJoNRtGkQmZLBLz localwitness = [ - f4df789d3210ac881cb900464dd30409453044d2777060a0c391cbdf4c6a4f57 + 1234567890123456789012345678901234567890123456789012345678901234 ] diff --git a/framework/src/test/resources/testng.conf b/framework/src/test/resources/testng.conf deleted file mode 100644 index ea4f25ad87b..00000000000 --- a/framework/src/test/resources/testng.conf +++ /dev/null @@ -1,499 +0,0 @@ -net { - type = mainnet -} - -fullnode = { - ip.list = [ - #Docker env - "127.0.0.1:50051", - "127.0.0.1:50052", - - #New beat1 - "39.106.145.222:50051", - "101.200.46.37:50051", - #"101.200.46.37:50051", - - #New beta2 - "101.200.46.37:50052", - "39.106.145.222:50052", - "101.200.46.37:50052", - - #Stress env - #"47.94.243.150:50051", - #"39.106.110.112:50051", - - #MainNet env - #"47.95.206.44:50051", - #"47.95.206.44:50051", - - - ] -} - -solidityNode = { - ip.list = [ - #Docker env - "127.0.0.1:50053", - "127.0.0.1:50062", - "127.0.0.1:50071", - - #New beat 1 - "39.106.145.222:50061", - "39.106.145.222:50061", - #"39.106.145.222:50071", - - #New beat 2 - "101.200.46.37:50053", - "101.200.46.37:50062", - "101.200.46.37:50071", - #"101.200.46.37:50071", - - - #Main Net env - #"47.95.206.44:50061", - ] -} - -httpnode = { - ip.list = [ - #docker env - "127.0.0.1:8090", - "127.0.0.1:8093", - "127.0.0.1:8097", - "127.0.0.1:8091", - "127.0.0.1:8098", - - - #New beta 2 - "101.200.46.37:50091", - "39.106.145.222:50091", - "101.200.46.37:50192", - "101.200.46.37:50094", - "101.200.46.37:50082", - #"101.200.46.37:50082", - ] -} - -eventnode = { - ip.list = [ - "tcp://127.0.0.1:50096", - #"tcp://39.106.145.222:50096", - ] -} - -jsonRpcNode = { - ip.list = [ - #"101.200.46.37:50545", - "127.0.0.1:50545", - "127.0.0.1:50555", - ] -} - -ethHttpsNode = { - host.list = [ - "mainnet.infura.io", - #"47.95.206.44:50545", - ] -} - - -foundationAccount = { - -} - - -witness = { - -} - -mainWitness = { - -} - -defaultParameter = { - maxFeeLimit = 1000000000 - assetDescription = stest-assetissue - assetUrl = github.com/tronprotocol/wallet/stest - multiSignFee = 1000000 - updateAccountPermissionFee = 100000000 - httpConnectionTimeout = 19000 - httpSoTimeout = 18000 - createWitnessAmount = 9999000000 - operations = 7fff1fc0033e3300000000000000000000000000000000000000000000000000 - delayTransactionFee = 100000 - cancleDelayTransactionFee = 50000 - solidityCompilerVersion = "v5" - solidityCompile = "../solcDIR/solc" - zenTokenOwnerKey = 2925e186bb1e88988855f11ebf20ea3a6e19ed92328b0ffb576122e769d45b68 - zenTokenId = 1000001 - zenTokenFee = 10000000 - zenTokenWhenCreateNewAddress = 1000000 - zenTrc20TokenOwnerKey = ede941a01eb8234866f60c7e8e95db4614bb0d05298d82bae0abea81f1861046 - jsonRpcOwnerKey = dbc78781ad27f3751358333412d5edc85b13e5eee129a1a77f7232baadafae0e - blackHoleAddress = THmtHi1Rzq4gSKYGEKv1DPkV7au6xU1AUB -} - - -code = { - code_AssertException_testdivideInt = "608060405234801561001057600080fd5b5060ac8061001f6000396000f300608060405260043610603d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166226ff5581146042575b600080fd5b348015604d57600080fd5b50605a600435602435606c565b60408051918252519081900360200190f35b60008183811515607857fe5b0593925050505600a165627a7a72305820b587002bc926764a997a3925613203906e484069ff4e2f8324b4dce6088326220029" - code_AssertException_testfindArgsContractMinTest = "608060405234801561001057600080fd5b50610134806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663329000b58114610045575b600080fd5b34801561005157600080fd5b5061005d60043561006f565b60408051918252519081900360200190f35b604080516003808252608082019092526000916060919060208201838038833901905050905060018160008151811015156100a657fe5b602090810290910101528051600290829060019081106100c257fe5b602090810290910101528051600390829060029081106100de57fe5b6020908102909101015280518190849081106100f657fe5b906020019060200201519150509190505600a165627a7a72305820e426d63fe06962cb78b523edb9295a369bc2cc1b82cac5740d74e924b1a398c40029" - code_AssertException_testbyteMinContract = "608060405234801561001057600080fd5b50610305806100206000396000f3006080604052600436106100405763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166383be82a38114610045575b600080fd5b34801561005157600080fd5b5061005d600435610092565b604080517fff000000000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b60408051600380825281830190925260009160208201606080388339505081516100c392600092506020019061023e565b50600c60f860020a0260008081546001816001161561010002031660029004811015156100ec57fe5b81546001161561010b5790600052602060002090602091828204019190065b601f036101000a81548160ff0219169060f860020a84040217905550600d60f860020a0260006001815460018160011615610100020316600290048110151561015057fe5b81546001161561016f5790600052602060002090602091828204019190065b601f036101000a81548160ff0219169060f860020a84040217905550600e60f860020a026000600281546001816001161561010002031660029004811015156101b457fe5b8154600116156101d35790600052602060002090602091828204019190065b601f036101000a81548160ff0219169060f860020a84040217905550600082815460018160011615610100020316600290048110151561020f57fe5b81546001161561022e5790600052602060002090602091828204019190065b905460f860020a911a0292915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061027f57805160ff19168380011785556102ac565b828001600101855582156102ac579182015b828111156102ac578251825591602001919060010190610291565b506102b89291506102bc565b5090565b6102d691905b808211156102b857600081556001016102c2565b905600a165627a7a72305820c42a0dcadb40b736d1d61cf46a58a66e740573568264ed5ce2f9b1de442d39fe0029" - code_AssertException_testenum = "608060405234801561001057600080fd5b5060f18061001f6000396000f30060806040526004361060485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166367cb61b68114604d578063fb76fa52146082575b600080fd5b348015605857600080fd5b50605f609c565b60405180826003811115606e57fe5b60ff16815260200191505060405180910390f35b348015608d57600080fd5b50609a60ff6004351660a5565b005b60005460ff1690565b6000805482919060ff1916600183600381111560bd57fe5b0217905550505600a165627a7a723058201ad3f79794ab99b9429a737984c9e0722214f7412fa23f4f8895f58032e222360029" - code_AssertException_testmoveRight = "608060405234801561001057600080fd5b5060b38061001f6000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630599d3dc81146043575b600080fd5b348015604e57600080fd5b506058600435606a565b60408051918252519081900360200190f35b60008160056000821215607957fe5b60029190910a9005929150505600a165627a7a72305820e944c4077f7d4f205074c52900d041d56d5f700a779aed8ced4af969f99464760029" - code_AssertException_testuninitializedContract = "608060405234801561001057600080fd5b5060e18061001f6000396000f30060806040526004361060485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166366e41cb78114604d5780636b59084d146071575b600080fd5b348015605857600080fd5b50605f6083565b60408051918252519081900360200190f35b348015607c57600080fd5b50605f609c565b600060b36096600460058363ffffffff16565b91505090565b600060af60966004600563ffffffff8416565b0290565bfe00a165627a7a72305820adcb5758cba4260d0f840e31e0b97435395f43728ddfe8024de688c29583dd220029" - code_AssertException_testTestAssertContract = "608060405234801561001057600080fd5b5060b58061001f6000396000f300608060405260043610605c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632b813bc081146061578063357815c414607557806350bff6bf146075578063a26388bb146075575b600080fd5b348015606c57600080fd5b5060736087565b005b348015608057600080fd5b506073605c565bfe00a165627a7a723058209284d2c51e121903dde36db88dae131b1b20dc83b987a6f491dcac2d9b2d30db0029" - - code_ContractGrammar001_testGrammar001 = "608060405234801561001057600080fd5b50610105806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630a75057381146057578063cd580ff3146083578063f0fdf834146098575b600080fd5b348015606257600080fd5b506071600435151560243560ad565b60408051918252519081900360200190f35b348015608e57600080fd5b50607160043560ce565b34801560a357600080fd5b50607160043560d4565b600060d4831560ba575060ce5b60c6838263ffffffff16565b949350505050565b60020290565b8002905600a165627a7a7230582032df33d18c9876ca1a32117c2b4c526215a9dd8feeb3c9d849690539b3a992ac0029" - code_ContractGrammar001_testGrammar002 = "610199610030600b82828239805160001a6073146000811461002057610022565bfe5b5030600052607381538281f300730000000000000000000000000000000000000000301460806040526004361061006d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663483b8a1481146100725780636ce8e081146100a1578063831cb739146100bc575b600080fd5b81801561007e57600080fd5b5061008d6004356024356100d7565b604080519115158252519081900360200190f35b8180156100ad57600080fd5b5061008d600435602435610117565b8180156100c857600080fd5b5061008d60043560243561012d565b60008181526020839052604081205460ff1615156100f757506000610111565b506000818152602083905260409020805460ff1916905560015b92915050565b6000908152602091909152604090205460ff1690565b60008181526020839052604081205460ff161561014c57506000610111565b50600090815260209190915260409020805460ff19166001908117909155905600a165627a7a723058205198109bfdc1087cafa3e909576bdb656bb058100cf618ef42eecaeb64e30b7f0029" - code1_ContractGrammar001_testGrammar002 = "608060405234801561001057600080fd5b50610139806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663f207564e8114610045575b600080fd5b34801561005157600080fd5b5061005d60043561005f565b005b73__browser/TvmTest_p1_Grammar_002.sol:S__63831cb7396000836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b1580156100d357600080fd5b505af41580156100e7573d6000803e3d6000fd5b505050506040513d60208110156100fd57600080fd5b5051151561010a57600080fd5b505600a165627a7a7230582044978981980e6552ad10452a66a2038edf7739f149dcced7705b0e329d594f300029" - code_ContractGrammar001_testGrammar003 = "610199610030600b82828239805160001a6073146000811461002057610022565bfe5b5030600052607381538281f300730000000000000000000000000000000000000000301460806040526004361061006d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663483b8a1481146100725780636ce8e081146100a1578063831cb739146100bc575b600080fd5b81801561007e57600080fd5b5061008d6004356024356100d7565b604080519115158252519081900360200190f35b8180156100ad57600080fd5b5061008d600435602435610117565b8180156100c857600080fd5b5061008d60043560243561012d565b60008181526020839052604081205460ff1615156100f757506000610111565b506000818152602083905260409020805460ff1916905560015b92915050565b6000908152602091909152604090205460ff1690565b60008181526020839052604081205460ff161561014c57506000610111565b50600090815260209190915260409020805460ff19166001908117909155905600a165627a7a72305820026d1eee826a0f8eb329643f3547e967fb7631f83b1855c607bdd82706af37520029" - code1_ContractGrammar001_testGrammar003 = "608060405234801561001057600080fd5b50610137806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663f207564e8114610045575b600080fd5b34801561005157600080fd5b5061005d60043561005f565b005b604080517f831cb7390000000000000000000000000000000000000000000000000000000081526000600482015260248101839052905173__browser/TvmTest_p1_Grammar_003.sol:S__9163831cb739916044808301926020929190829003018186803b1580156100d157600080fd5b505af41580156100e5573d6000803e3d6000fd5b505050506040513d60208110156100fb57600080fd5b5051151561010857600080fd5b505600a165627a7a72305820de817c43c8f916d8e300ee0f317061f220ba7971379253fc437c52ab40295d6f0029" - code_ContractGrammar001_testGrammar004 = "60f561002f600b82828239805160001a6073146000811461001f57610021565bfe5b5030600052607381538281f300730000000000000000000000000000000000000000301460806040526004361060555763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166324fef5c88114605a575b600080fd5b818015606557600080fd5b5060726004356024356084565b60408051918252519081900360200190f35b6000805b835481101560bc57828482815481101515609e57fe5b9060005260206000200154141560b55780915060c2565b6001016088565b60001991505b50929150505600a165627a7a72305820dd50badae5d39d8013dd477274519025531d3c7c11cd98cd10290fbace71b9510029" - code1_ContractGrammar001_testGrammar004 = "608060405234801561001057600080fd5b50610281806100206000396000f3006080604052600436106100615763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178fe3f8114610066578063e33b870714610090578063e81cf24c146100aa578063f0ba8440146100c5575b600080fd5b34801561007257600080fd5b5061007e6004356100dd565b60408051918252519081900360200190f35b34801561009c57600080fd5b506100a86004356100ff565b005b3480156100b657600080fd5b506100a8600435602435610131565b3480156100d157600080fd5b5061007e600435610236565b600080828154811015156100ed57fe5b90600052602060002001549050919050565b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630155565b604080517f24fef5c800000000000000000000000000000000000000000000000000000000815260006004820181905260248201859052915173__browser/TvmTest_p1_Grammar_004.sol:S__916324fef5c8916044808301926020929190829003018186803b1580156101a557600080fd5b505af41580156101b9573d6000803e3d6000fd5b505050506040513d60208110156101cf57600080fd5b5051905060001981141561021457600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301829055610231565b8160008281548110151561022457fe5b6000918252602090912001555b505050565b600080548290811061024457fe5b6000918252602090912001549050815600a165627a7a72305820e8c6ea7734c94bd93e5388cb46b5a5ba3807df808e86fb52d4fa2a792685d9280029" - code_ContractGrammar001_testGrammar006 = "608060405234801561001057600080fd5b50610159806100206000396000f3006080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166321183e8d81146100875780637f6b590c146100a15780638de6f511146100b9578063b3de648b146100a1578063e668f6b6146100b9578063e7708d03146100b9578063fb095f2e146100a1575b600080fd5b34801561009357600080fd5b5061009f6004356100d1565b005b3480156100ad57600080fd5b5061009f6004356100e2565b3480156100c557600080fd5b5061009f6004356100e5565b600a5b6000190180156100d4575050565b50565b6100e2565b50919050565b828110156100ea576002909102906001016100f0565b60008180156101245761011b60018403610106565b830291506100ea565b506001929150505600a165627a7a723058209488a62acdb28a3bac209504cc3dd53d2ef7bf56cbb835e431c507bbc2b0b20b0029" - - code_ContractGrammar002_testGrammar007 = "608060405234801561001057600080fd5b506000602081905260017fe831479d2c88b7e2c4154b0e3fd4b67c62580aba2734ac954410a8c097fac7c35560027f156aefbe71d87b3f83e37064ce76ea7eb25ea897d2708aad4c1d03439058d3a3557f7a7a790000000000000000000000000000000000000000000000000000000000905260077fd0d0b23e4a00f3e9683c2bc8ad2b8ee67c66dc4b2ae07ae98ee14d014badcf83556101b2806100b66000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166337721ab7811461005b578063a633d8d414610129578063ec56a37314610153575b600080fd5b34801561006757600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100b494369492936024939284019190819084018382808284375094975061016b9650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100ee5781810151838201526020016100d6565b50505050905090810190601f16801561011b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013557600080fd5b5061014160043561016e565b60408051918252519081900360200190f35b34801561015f57600080fd5b50610141600435610174565b90565b60030a90565b600060208190529081526040902054815600a165627a7a72305820dda8d0ad404466b0389ba7a490a63e5acc2d4eaf8ee3f4937e09084fba1f5a5a0029" - code1_ContractGrammar002_testGrammar007 = "608060405234801561001057600080fd5b5060405160208061033d833981016040525160018054600160a060020a0319908116600160a060020a039384161791829055600280549290931691161790556102df8061005e6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166349de3f08811461005b5780639e3151a814610085578063f6598275146100b5575b600080fd5b34801561006757600080fd5b506100736004356100cd565b60408051918252519081900360200190f35b34801561009157600080fd5b506100b373ffffffffffffffffffffffffffffffffffffffff600435166101c9565b005b3480156100c157600080fd5b50610073600435610205565b600254604080517fec56a37300000000000000000000000000000000000000000000000000000000815260048101849052905160009273ffffffffffffffffffffffffffffffffffffffff169163ec56a37391602480830192602092919082900301818787803b15801561014057600080fd5b505af1158015610154573d6000803e3d6000fd5b505050506040513d602081101561016a57600080fd5b50506001546040805173ffffffffffffffffffffffffffffffffffffffff9092168252336020830152818101849052517f09208868f8090ea021d1f0e2ed8182e6a6f23a1f447267430e531bf2003c09199181900360600190a1919050565b6000805473ffffffffffffffffffffffffffffffffffffffff191673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600254604080517fa633d8d4000000000000000000000000000000000000000000000000000000008152600481018490529051600092839273ffffffffffffffffffffffffffffffffffffffff9091169163a633d8d49160248082019260209290919082900301818787803b15801561027d57600080fd5b505af1158015610291573d6000803e3d6000fd5b505050506040513d60208110156102a757600080fd5b505192909201929150505600a165627a7a723058208c58520ab7ab3c09ab693d81d3c7746deb66b7515d4258f26a379367fca4b95d0029" - code_ContractGrammar002_testGrammar008 = "608060405234801561001057600080fd5b50610188806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663dba7ab6c8114610050578063f5f5ba7214610077575b600080fd5b34801561005c57600080fd5b50610065610101565b60408051918252519081900360200190f35b34801561008357600080fd5b5061008c610125565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100c65781810151838201526020016100ae565b50505050905090810190601f1680156100f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f6d69616f7700000000000000000000000000000000000000000000000000000090565b60408051808201909152600681527f46656c696e6500000000000000000000000000000000000000000000000000006020820152905600a165627a7a723058206cd9ce9902b03355d5f4bd8e0e4c4d9cd5b5d65364c50454f2418305ab515b4f0029" - code_ContractGrammar002_testGrammar010 = "608060405234801561001057600080fd5b506101b7806100206000396000f30060806040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166355b775ea8114610050578063f198f5df14610080575b600080fd5b34801561005c57600080fd5b5061007e73ffffffffffffffffffffffffffffffffffffffff60043516610095565b005b34801561008c57600080fd5b5061007e6100d1565b6000805473ffffffffffffffffffffffffffffffffffffffff191673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663370158ea600a610320906040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016020604051808303818589803b15801561015b57600080fd5b5088f115801561016f573d6000803e3d6000fd5b5050505050506040513d602081101561018757600080fd5b50505600a165627a7a72305820f2b3e0e175369ea0df0aef7c6b9e8644b34c144efe85d21cb38539d1abd32e970029" - code_ContractGrammar002_testGrammar011 = "608060405234801561001057600080fd5b5060c88061001f6000396000f30060806040526004361060485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313d1aa2e8114604d578063e2179b8e146077575b600080fd5b348015605857600080fd5b506065600435602435608b565b60408051918252519081900360200190f35b348015608257600080fd5b506089608f565b005b5090565b609960036002608b565b505600a165627a7a723058202aeac1a0dbc6913a9378d4e8294f1061e5798083067aa9db5d95d8d78f24d5430029" - code_ContractGrammar002_testGrammar012 = "608060405234801561001057600080fd5b50610169806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663370158ea8114610045575b600080fd5b61004d6100c7565b6040805198895273ffffffffffffffffffffffffffffffffffffffff97881660208a01527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909616888701526060880194909452608087019290925260a086015290921660c084015260e083019190915251908190036101000190f35b6000806000806000806000806000806000806000806000805a9f50339e50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19600035169c50349b50429a503a995032985050303196508d95508c94508b93508a925089915088905050505050505090919293949596975600a165627a7a72305820ba2fd5e479d9fa3924efa9cef8dde8690cf0618a742fe972533b7eb5b2b3ca990029" - code_ContractGrammar002_testGrammar013 = "60806040526000805534801561001457600080fd5b5060018054600160a060020a0319163317905561014c806100366000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b5811461005b578063a87d942c14610072578063d09de08a14610099575b600080fd5b34801561006757600080fd5b506100706100ae565b005b34801561007e57600080fd5b506100876100eb565b60408051918252519081900360200190f35b3480156100a557600080fd5b506100706100f1565b60015473ffffffffffffffffffffffffffffffffffffffff163314156100e95760015473ffffffffffffffffffffffffffffffffffffffff16ff5b565b60005490565b600154600a9073ffffffffffffffffffffffffffffffffffffffff1633141561011d5760008054820190555b505600a165627a7a72305820604072633e1ae10ab2bb71c55f8678aafe925bee8ebffa82a1eddc5c2ed1fc2d0029" - - code_ContractGrammar003_testGrammar014 = "608060405234801561001057600080fd5b50610435806100206000396000f3006080604052600436106100745763ffffffff60e060020a6000350416633da5d187811461007957806343c3a43a1461009f578063b053ebd4146100c3578063c8287909146100f4578063d7d21f5b14610109578063dd92afef1461012d578063ee9e398114610154578063fa06834b14610175575b600080fd5b34801561008557600080fd5b5061009d600160a060020a036004351660243561018a565b005b3480156100ab57600080fd5b5061009d600160a060020a0360043516602435610205565b3480156100cf57600080fd5b506100d8610282565b60408051600160a060020a039092168252519081900360200190f35b34801561010057600080fd5b506100d8610291565b34801561011557600080fd5b5061009d600160a060020a03600435166024356102a0565b34801561013957600080fd5b5061014261031d565b60408051918252519081900360200190f35b34801561016057600080fd5b5061009d600160a060020a0360043516610323565b34801561018157600080fd5b50610142610403565b81600160a060020a031660405180807f73657456616c75652875696e74323536290000000000000000000000000000008152506011019050604051809103902060e060020a9004826040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381865af4505050505050565b81600160a060020a031660405180807f73657456616c75652875696e74323536290000000000000000000000000000008152506011019050604051809103902060e060020a9004826040518263ffffffff1660e060020a028152600401808281526020019150506000604051808303816000875af1505050505050565b600154600160a060020a031681565b600154600160a060020a031690565b81600160a060020a031660405180807f73657456616c75652875696e74323536290000000000000000000000000000008152506011019050604051809103902060e060020a9004826040518263ffffffff1660e060020a028152600401808281526020019150506000604051808303816000875af2505050505050565b60005481565b80600160a060020a031660405180807f61646428290000000000000000000000000000000000000000000000000000008152506005019050604051809103902060e060020a90046040518163ffffffff1660e060020a0281526004016000604051808303816000875af1925050505080600160a060020a031660405180807f61646428290000000000000000000000000000000000000000000000000000008152506005019050604051809103902060e060020a90046040518163ffffffff1660e060020a0281526004016000604051808303816000875af15050505050565b600054905600a165627a7a7230582093a7a067c2321655a53783d1d54310cf8d57828093eeb9cf511536f8834f2de50029" - code1_ContractGrammar003_testGrammar014 = "608060405234801561001057600080fd5b5061055d806100206000396000f30060806040526004361061007f5763ffffffff60e060020a6000350416630eec1aba81146100845780631645c6c8146100b5578063466427c0146100cd5780634f2be91f146100e557806355241077146100fc578063b053ebd414610114578063c828790914610129578063dd92afef1461013e578063fa06834b14610165575b600080fd5b34801561009057600080fd5b5061009961017a565b60408051600160a060020a039092168252519081900360200190f35b3480156100c157600080fd5b50610099600435610189565b3480156100d957600080fd5b506100996004356101a4565b3480156100f157600080fd5b506100fa6101bf565b005b34801561010857600080fd5b506100fa600435610407565b34801561012057600080fd5b5061009961042b565b34801561013557600080fd5b5061009961043a565b34801561014a57600080fd5b50610153610449565b60408051918252519081900360200190f35b34801561017157600080fd5b5061015361044f565b600254600160a060020a031681565b600460205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b600080546001018155806101d1610455565b604051809103906000f0801580156101ed573d6000803e3d6000fd5b50915081600160a060020a03166338cc48316040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561022e57600080fd5b505af1158015610242573d6000803e3d6000fd5b505050506040513d602081101561025857600080fd5b5051600080548152600360209081526040808320805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0395861617905580517f38cc48310000000000000000000000000000000000000000000000000000000081529051938616936338cc483193600480840194938390030190829087803b1580156102e157600080fd5b505af11580156102f5573d6000803e3d6000fd5b505050506040513d602081101561030b57600080fd5b50516002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055610341610455565b604051809103906000f08015801561035d573d6000803e3d6000fd5b50905080600160a060020a03166338cc48316040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561039e57600080fd5b505af11580156103b2573d6000803e3d6000fd5b505050506040513d60208110156103c857600080fd5b5051600080548152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555050565b6000556001805473ffffffffffffffffffffffffffffffffffffffff191633179055565b600154600160a060020a031681565b600154600160a060020a031690565b60005481565b60005490565b60405160cd80610465833901905600608060405234801561001057600080fd5b5060ae8061001f6000396000f300608060405260043610603e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166338cc483181146043575b600080fd5b348015604e57600080fd5b506055607e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b30905600a165627a7a7230582002da030c3a635a762a2cd57a6d82b2c8a097197a64cad72ca827e7e227e67dd90029a165627a7a7230582023d343e99ca6abe7ec5591fd8706cb1a6d5bb25e9868b17445ad3171a6e295fd0029" - code_ContractGrammar003_testGrammar015 = "608060405234801561001057600080fd5b50610317806100206000396000f3006080604052600436106100535763ffffffff60e060020a600035041663292a1c6881146100b357806342a78883146100da57806342bb5a26146100f457806366b0bae0146101095780637c06885a1461011e575b34801561005f57600080fd5b507f17c1956f6e992470102c5fc953bf560fda31fabee8737cf8e77bdde00eb5698d6000366040518080602001828103825284848281815260200192508082843760405192018290039550909350505050a1005b3480156100bf57600080fd5b506100c8610133565b60408051918252519081900360200190f35b3480156100e657600080fd5b506100f2600435610168565b005b34801561010057600080fd5b506100c86101c4565b34801561011557600080fd5b506100f26101f9565b34801561012a57600080fd5b506100f261027c565b604080517f457869737446756e6343616c6c65642862797465732c75696e743235362900008152905190819003601e01902090565b7fb776d49293459725ca7d6a5abc60e389d2f3d067d4f028ba9cd790f69659984660003683604051808060200183815260200182810382528585828181526020019250808284376040519201829003965090945050505050a150565b604080517f46616c6c6261636b43616c6c65642862797465732900000000000000000000008152905190819003601501902090565b600060405180807f66756e6374696f6e4e6f744578697374282900000000000000000000000000008152506012019050604051809103902090503073ffffffffffffffffffffffffffffffffffffffff168160e060020a90046040518163ffffffff1660e060020a0281526004016000604051808303816000875af15050505050565b604080517f657869737446756e632875696e743235362900000000000000000000000000008152815190819003601201812063ffffffff60e060020a8083049182160283526001600484015292519092309290916024808301926000929190829003018183875af150505050505600a165627a7a7230582065d5e244faea44396a1826f0c2919055c883a00eef975f72a579ee7f0c654a0b0029" - code_ContractGrammar003_testGrammar016 = "608060405234801561001057600080fd5b50610270806100206000396000f3006080604052600436106100275763ffffffff60e060020a600035041663bef55ef3811461002c575b600080fd5b34801561003857600080fd5b50610041610043565b005b60008061004e610157565b604051809103906000f08015801561006a573d6000803e3d6000fd5b5091508173ffffffffffffffffffffffffffffffffffffffff16635b4b73a960036040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156100c457600080fd5b505af11580156100d8573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16633bc5de306040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561012757600080fd5b505af115801561013b573d6000803e3d6000fd5b505050506040513d602081101561015157600080fd5b50505050565b60405160de80610167833901905600608060405234801561001057600080fd5b5060bf8061001f6000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633bc5de308114604d5780635b4b73a9146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005490565b6000555600a165627a7a72305820f4a95b9ecc5b7f7b57cbf2caff1c5f2f5e6e2dbd28464523cc05abde5864fd010029a165627a7a723058207ab90bb4123df32a1805dc37faaac054a403d1ab28007eb48c99ea48fefae6e90029" - code1_ContractGrammar003_testGrammar016 = "608060405234801561001057600080fd5b50610214806100206000396000f3006080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633bc5de30811461005b5780635b4b73a914610082578063e2179b8e1461009c575b600080fd5b34801561006757600080fd5b506100706100b1565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061009a6004356100b7565b005b3480156100a857600080fd5b5061009a6100bc565b60005490565b600055565b6000806100c76100fb565b604051809103906000f0801580156100e3573d6000803e3d6000fd5b5091506100f2600360056100f7565b505050565b0190565b60405160de8061010b833901905600608060405234801561001057600080fd5b5060bf8061001f6000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633bc5de308114604d5780635b4b73a9146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005490565b6000555600a165627a7a72305820f4a95b9ecc5b7f7b57cbf2caff1c5f2f5e6e2dbd28464523cc05abde5864fd010029a165627a7a723058205eb1e089faa9ff3eba073d682ee515d9d086d2ce3d4043109292b99a8a91d15f0029" - code_ContractGrammar003_testGrammar017 = "608060405234801561001057600080fd5b50610306806100206000396000f3006080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630121b93f811461005b5780635f72f4501461006857806397a9dae914610094575b600080fd5b6100666004356100d7565b005b34801561007457600080fd5b50610080600435610160565b604080519115158252519081900360200190f35b3480156100a057600080fd5b506100c573ffffffffffffffffffffffffffffffffffffffff600435166024356101e4565b60408051918252519081900360200190f35b60009081526001602081815260408084208151808301835233815234818501818152600384018054808901909155885260048401909552929095209451855473ffffffffffffffffffffffffffffffffffffffff191673ffffffffffffffffffffffffffffffffffffffff90911617855591519390920192909255600290910180549091019055565b600081815260016020819052604082209081015460028201548391111561018a57600092506101dd565b506002810180546000918290558254604051919273ffffffffffffffffffffffffffffffffffffffff9091169183156108fc0291849190818181858888f1935050505015156101d857600080fd5b600192505b5050919050565b6040805160808101825273ffffffffffffffffffffffffffffffffffffffff9384168152602080820193845260009282018381526060830184815293805260019182905291517fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805473ffffffffffffffffffffffffffffffffffffffff1916919096161790945591517fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4a5590517fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4b55517fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4c55905600a165627a7a72305820774c07868cec7fa6d603c6bffa4ad224b2c7523a44248047a445872f15b064980029" - code_ContractGrammar003_testGrammar018 = "608060405234801561001057600080fd5b5061025b806100206000396000f3006080604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166307423b35811461007c5780634c15d6db146100a35780635ee41656146100b8578063a449e8eb146100cd578063b7a0961a146100e2578063d23d7e8a1461007c575b600080fd5b34801561008857600080fd5b506100916100f7565b60408051918252519081900360200190f35b3480156100af57600080fd5b5061009161012c565b3480156100c457600080fd5b5061009161013a565b3480156100d957600080fd5b50610091610147565b3480156100ee57600080fd5b506100916101b4565b604080517f31310000000000000000000000000000000000000000000000000000000000008152905190819003600201902090565b600060046003600209905090565b6000600360028008905090565b6000600260405180807f313100000000000000000000000000000000000000000000000000000000000081525060020190506020604051808303816000865af1158015610198573d6000803e3d6000fd5b5050506040513d60208110156101ad57600080fd5b5051905090565b6000600360405180807f313100000000000000000000000000000000000000000000000000000000000081525060020190506020604051808303816000865af1158015610205573d6000803e3d6000fd5b505050604051516c01000000000000000000000000026bffffffffffffffffffffffff19169050905600a165627a7a72305820af56e004716c8ccf6d0609f6bcdc39fa45fda7fbc38e049ef6bab4609abf86e10029" - code_ContractGrammar003_testGrammar019 = "6080604052348015600f57600080fd5b50603580601d6000396000f3006080604052600080fd00a165627a7a7230582027e85e5bf589c5cecb1dd0d8712fa54ff07ff16b4dca5a602c53587c17898b2f0029" - code_ContractGrammar003_testGrammar020 = "608060405234801561001057600080fd5b5060a48061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ccb5f721146044575b600080fd5b348015604f57600080fd5b5060566058565b005b620f424080141515606857600080fd5b600180141515607657600080fd5b5600a165627a7a72305820fdd16dc5b670249de6546a7474b1c29f5894578d17a251188bc616cc4476022c0029" - code_ContractScenario004_deployErc20TronToken = "60c0604052600660808190527f54726f6e6978000000000000000000000000000000000000000000000000000060a090815261003e916000919061013c565b506040805180820190915260038082527f545258000000000000000000000000000000000000000000000000000000000060209092019182526100839160019161013c565b506006600281905560006005558054600160a860020a03191690553480156100aa57600080fd5b50604051602080610abc83398101604081815291516006805461010060a860020a031916336101000217905567016345785d8a00006005819055600160a060020a03821660008181526003602090815286822084905592855294519294909390927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506101d7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785556101aa565b828001600101855582156101aa579182015b828111156101aa57825182559160200191906001019061018f565b506101b69291506101ba565b5090565b6101d491905b808211156101b657600081556001016101c0565b90565b6108d6806101e66000396000f3006080604052600436106100cf5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100d457806307da68f51461015e578063095ea7b31461017557806318160ddd146101ad57806323b872dd146101d4578063313ce567146101fe57806342966c681461021357806370a082311461022b57806375f12b211461024c57806395d89b4114610261578063a9059cbb14610276578063be9a65551461029a578063c47f0027146102af578063dd62ed3e14610308575b600080fd5b3480156100e057600080fd5b506100e961032f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561012357818101518382015260200161010b565b50505050905090810190601f1680156101505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016a57600080fd5b506101736103bd565b005b34801561018157600080fd5b50610199600160a060020a03600435166024356103e5565b604080519115158252519081900360200190f35b3480156101b957600080fd5b506101c261049e565b60408051918252519081900360200190f35b3480156101e057600080fd5b50610199600160a060020a03600435811690602435166044356104a4565b34801561020a57600080fd5b506101c26105c1565b34801561021f57600080fd5b506101736004356105c7565b34801561023757600080fd5b506101c2600160a060020a036004351661065e565b34801561025857600080fd5b50610199610670565b34801561026d57600080fd5b506100e9610679565b34801561028257600080fd5b50610199600160a060020a03600435166024356106d3565b3480156102a657600080fd5b5061017361079d565b3480156102bb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101739436949293602493928401919081908401838280828437509497506107c29650505050505050565b34801561031457600080fd5b506101c2600160a060020a03600435811690602435166107f2565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103b55780601f1061038a576101008083540402835291602001916103b5565b820191906000526020600020905b81548152906001019060200180831161039857829003601f168201915b505050505081565b6006546101009004600160a060020a031633146103d657fe5b6006805460ff19166001179055565b60065460009060ff16156103f557fe5b3315156103fe57fe5b81158061042c5750336000908152600460209081526040808320600160a060020a0387168452909152902054155b151561043757600080fd5b336000818152600460209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60055481565b60065460009060ff16156104b457fe5b3315156104bd57fe5b600160a060020a0384166000908152600360205260409020548211156104e257600080fd5b600160a060020a038316600090815260036020526040902054828101101561050957600080fd5b600160a060020a038416600090815260046020908152604080832033845290915290205482111561053957600080fd5b600160a060020a03808416600081815260036020908152604080832080548801905593881680835284832080548890039055600482528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025481565b336000908152600360205260409020548111156105e357600080fd5b336000818152600360209081526040808320805486900390558280527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff805486019055805185815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350565b60036020526000908152604090205481565b60065460ff1681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103b55780601f1061038a576101008083540402835291602001916103b5565b60065460009060ff16156106e357fe5b3315156106ec57fe5b3360009081526003602052604090205482111561070857600080fd5b600160a060020a038316600090815260036020526040902054828101101561072f57600080fd5b33600081815260036020908152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b6006546101009004600160a060020a031633146107b657fe5b6006805460ff19169055565b6006546101009004600160a060020a031633146107db57fe5b80516107ee90600090602084019061080f565b5050565b600460209081526000928352604080842090915290825290205481565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061085057805160ff191683800117855561087d565b8280016001018555821561087d579182015b8281111561087d578251825591602001919060010190610862565b5061088992915061088d565b5090565b6108a791905b808211156108895760008155600101610893565b905600a165627a7a72305820d00bcb788ca406de94859b8bc4bda50c3c65ca67e1217ccccee92f59a92ae5e20029" - code_ContractScenario005_deployIcoContract = "60c0604052600660808190527f54726f6e6978000000000000000000000000000000000000000000000000000060a090815261003e916000919061013c565b506040805180820190915260038082527f545258000000000000000000000000000000000000000000000000000000000060209092019182526100839160019161013c565b506006600281905560006005558054600160a860020a03191690553480156100aa57600080fd5b50604051602080610abc83398101604081815291516006805461010060a860020a031916336101000217905567016345785d8a00006005819055600160a060020a03821660008181526003602090815286822084905592855294519294909390927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506101d7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785556101aa565b828001600101855582156101aa579182015b828111156101aa57825182559160200191906001019061018f565b506101b69291506101ba565b5090565b6101d491905b808211156101b657600081556001016101c0565b90565b6108d6806101e66000396000f3006080604052600436106100cf5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100d457806307da68f51461015e578063095ea7b31461017557806318160ddd146101ad57806323b872dd146101d4578063313ce567146101fe57806342966c681461021357806370a082311461022b57806375f12b211461024c57806395d89b4114610261578063a9059cbb14610276578063be9a65551461029a578063c47f0027146102af578063dd62ed3e14610308575b600080fd5b3480156100e057600080fd5b506100e961032f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561012357818101518382015260200161010b565b50505050905090810190601f1680156101505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016a57600080fd5b506101736103bd565b005b34801561018157600080fd5b50610199600160a060020a03600435166024356103e5565b604080519115158252519081900360200190f35b3480156101b957600080fd5b506101c261049e565b60408051918252519081900360200190f35b3480156101e057600080fd5b50610199600160a060020a03600435811690602435166044356104a4565b34801561020a57600080fd5b506101c26105c1565b34801561021f57600080fd5b506101736004356105c7565b34801561023757600080fd5b506101c2600160a060020a036004351661065e565b34801561025857600080fd5b50610199610670565b34801561026d57600080fd5b506100e9610679565b34801561028257600080fd5b50610199600160a060020a03600435166024356106d3565b3480156102a657600080fd5b5061017361079d565b3480156102bb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101739436949293602493928401919081908401838280828437509497506107c29650505050505050565b34801561031457600080fd5b506101c2600160a060020a03600435811690602435166107f2565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103b55780601f1061038a576101008083540402835291602001916103b5565b820191906000526020600020905b81548152906001019060200180831161039857829003601f168201915b505050505081565b6006546101009004600160a060020a031633146103d657fe5b6006805460ff19166001179055565b60065460009060ff16156103f557fe5b3315156103fe57fe5b81158061042c5750336000908152600460209081526040808320600160a060020a0387168452909152902054155b151561043757600080fd5b336000818152600460209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60055481565b60065460009060ff16156104b457fe5b3315156104bd57fe5b600160a060020a0384166000908152600360205260409020548211156104e257600080fd5b600160a060020a038316600090815260036020526040902054828101101561050957600080fd5b600160a060020a038416600090815260046020908152604080832033845290915290205482111561053957600080fd5b600160a060020a03808416600081815260036020908152604080832080548801905593881680835284832080548890039055600482528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025481565b336000908152600360205260409020548111156105e357600080fd5b336000818152600360209081526040808320805486900390558280527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff805486019055805185815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350565b60036020526000908152604090205481565b60065460ff1681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103b55780601f1061038a576101008083540402835291602001916103b5565b60065460009060ff16156106e357fe5b3315156106ec57fe5b3360009081526003602052604090205482111561070857600080fd5b600160a060020a038316600090815260036020526040902054828101101561072f57600080fd5b33600081815260036020908152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b6006546101009004600160a060020a031633146107b657fe5b6006805460ff19169055565b6006546101009004600160a060020a031633146107db57fe5b80516107ee90600090602084019061080f565b5050565b600460209081526000928352604080842090915290825290205481565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061085057805160ff191683800117855561087d565b8280016001018555821561087d579182015b8281111561087d578251825591602001919060010190610862565b5061088992915061088d565b5090565b6108a791905b808211156108895760008155600101610893565b905600a165627a7a72305820d00bcb788ca406de94859b8bc4bda50c3c65ca67e1217ccccee92f59a92ae5e20029" - code_ContractScenario006_deployFomo3D = "60c0604052600660808190527f464f4d4f3344000000000000000000000000000000000000000000000000000060a0908152620000409160009190620000b8565b506040805180820190915260038082527f463344000000000000000000000000000000000000000000000000000000000060209092019182526200008791600191620000b8565b5068056bc75e2d631000006002556000600855600b805460ff19169055348015620000b157600080fd5b506200015d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000fb57805160ff19168380011785556200012b565b828001600101855582156200012b579182015b828111156200012b5782518255916020019190600101906200010e565b50620001399291506200013d565b5090565b6200015a91905b8082111562000139576000815560010162000144565b90565b611688806200016d6000396000f3006080604052600436106101685763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166265318b811461017657806306fdde03146101a957806310d0ffdd1461023357806318160ddd1461024b578063226093731461026057806327defa1f14610278578063313ce567146102a1578063392efb52146102cc5780633ccfd60b146102e45780634b750334146102fb57806356d399e814610310578063688abbf7146103255780636b2f46321461033f57806370a08231146103545780638328b610146103755780638620410b1461038d57806389135ae9146103a25780638fea64bd146103bf578063949e8acd146103d457806395d89b41146103e9578063a8e04f34146103fe578063a9059cbb14610413578063b84c824614610437578063c47f002714610490578063e4849b32146104e9578063e9fad8ee14610501578063f088d54714610516578063fdb5a03e1461052a575b61017334600061053f565b50005b34801561018257600080fd5b50610197600160a060020a0360043516610b15565b60408051918252519081900360200190f35b3480156101b557600080fd5b506101be610b50565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f85781810151838201526020016101e0565b50505050905090810190601f1680156102255780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023f57600080fd5b50610197600435610bde565b34801561025757600080fd5b50610197610c0e565b34801561026c57600080fd5b50610197600435610c15565b34801561028457600080fd5b5061028d610c4e565b604080519115158252519081900360200190f35b3480156102ad57600080fd5b506102b6610c57565b6040805160ff9092168252519081900360200190f35b3480156102d857600080fd5b5061028d600435610c5c565b3480156102f057600080fd5b506102f9610c71565b005b34801561030757600080fd5b50610197610d44565b34801561031c57600080fd5b50610197610d98565b34801561033157600080fd5b506101976004351515610d9e565b34801561034b57600080fd5b50610197610de1565b34801561036057600080fd5b50610197600160a060020a0360043516610de6565b34801561038157600080fd5b506102f9600435610e01565b34801561039957600080fd5b50610197610e48565b3480156103ae57600080fd5b506102f96004356024351515610e90565b3480156103cb57600080fd5b506102f9610ef2565b3480156103e057600080fd5b50610197610ef4565b3480156103f557600080fd5b506101be610f07565b34801561040a57600080fd5b506102f9610f61565b34801561041f57600080fd5b5061028d600160a060020a0360043516602435610faf565b34801561044357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102f99436949293602493928401919081908401838280828437509497506111699650505050505050565b34801561049c57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102f99436949293602493928401919081908401838280828437509497506111c29650505050505050565b3480156104f557600080fd5b506102f9600435611216565b34801561050d57600080fd5b506102f9611367565b610197600160a060020a0360043516611394565b34801561053657600080fd5b506102f96113a0565b60008060008060008060008060008a6000339050600b60009054906101000a900460ff16801561058157506801158e460913d000008261057d610de1565b0311155b1561088e57600160a060020a03811660009081526003602052604090205460ff16151560011480156105d65750600160a060020a038116600090815260076020526040902054670de0b6b3a764000090830111155b15156105e157600080fd5b600160a060020a0381166000908152600760205260409020546106049083611456565b600160a060020a03821660009081526007602052604090205533995061062b8d600561146c565b985061063889600361146c565b97506106448989611483565b96506106508d8a611483565b955061065b86611495565b9450680100000000000000008702935060008511801561068557506008546106838682611456565b115b151561069057600080fd5b600160a060020a038c16158015906106ba575089600160a060020a03168c600160a060020a031614155b80156106e05750600254600160a060020a038d1660009081526004602052604090205410155b1561072657600160a060020a038c166000908152600560205260409020546107089089611456565b600160a060020a038d16600090815260056020526040902055610741565b6107308789611456565b965068010000000000000000870293505b600060085411156107a55761075860085486611456565b600881905568010000000000000000880281151561077257fe5b6009805492909104909101905560085468010000000000000000880281151561079757fe5b0485028403840393506107ab565b60088590555b600160a060020a038a166000908152600460205260409020546107ce9086611456565b600460008c600160a060020a0316600160a060020a031681526020019081526020016000208190555083856009540203925082600660008c600160a060020a0316600160a060020a03168152602001908152602001600020600082825401925050819055508b600160a060020a03168a600160a060020a03167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a50610b05565b600b805460ff191690553399506108a68d600561146c565b98506108b389600361146c565b97506108bf8989611483565b96506108cb8d8a611483565b95506108d686611495565b9450680100000000000000008702935060008511801561090057506008546108fe8682611456565b115b151561090b57600080fd5b600160a060020a038c1615801590610935575089600160a060020a03168c600160a060020a031614155b801561095b5750600254600160a060020a038d1660009081526004602052604090205410155b156109a157600160a060020a038c166000908152600560205260409020546109839089611456565b600160a060020a038d166000908152600560205260409020556109bc565b6109ab8789611456565b965068010000000000000000870293505b60006008541115610a20576109d360085486611456565b60088190556801000000000000000088028115156109ed57fe5b60098054929091049091019055600854680100000000000000008802811515610a1257fe5b048502840384039350610a26565b60088590555b600160a060020a038a16600090815260046020526040902054610a499086611456565b600460008c600160a060020a0316600160a060020a031681526020019081526020016000208190555083856009540203925082600660008c600160a060020a0316600160a060020a03168152602001908152602001600020600082825401925050819055508b600160a060020a03168a600160a060020a03167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a505b5050505050505050505092915050565b600160a060020a0316600090815260066020908152604080832054600490925290912054600954680100000000000000009102919091030490565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b505050505081565b6000808080610bee85600561146c565b9250610bfa8584611483565b9150610c0582611495565b95945050505050565b6008545b90565b6000806000806008548511151515610c2c57600080fd5b610c358561152d565b9250610c4283600561146c565b9150610c058383611483565b600b5460ff1681565b601281565b600a6020526000908152604090205460ff1681565b6000806000610c806001610d9e565b11610c8a57600080fd5b339150610c976000610d9e565b600160a060020a038316600081815260066020908152604080832080546801000000000000000087020190556005909152808220805490839055905193019350909183156108fc0291849190818181858888f19350505050158015610d00573d6000803e3d6000fd5b50604080518281529051600160a060020a038416917fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc919081900360200190a25050565b60008060008060085460001415610d62576414f46b04009350610d92565b610d73670de0b6b3a764000061152d565b9250610d8083600561146c565b9150610d8c8383611483565b90508093505b50505090565b60025481565b60003382610db457610daf81610b15565b610dd8565b600160a060020a038116600090815260056020526040902054610dd682610b15565b015b91505b50919050565b303190565b600160a060020a031660009081526004602052604090205490565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610e4257600080fd5b50600255565b60008060008060085460001415610e665764199c82cc009350610d92565b610e77670de0b6b3a764000061152d565b9250610e8483600561146c565b9150610d8c8383611456565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610ed157600080fd5b506000918252600a6020526040909120805460ff1916911515919091179055565b565b600033610f0081610de6565b91505b5090565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bd65780601f10610bab57610100808354040283529160200191610bd6565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610fa257600080fd5b50600b805460ff19169055565b600080600080600080610fc0610ef4565b11610fca57600080fd5b600b5433945060ff16158015610ff85750600160a060020a0384166000908152600460205260409020548611155b151561100357600080fd5b600061100f6001610d9e565b111561101d5761101d610c71565b61102886600561146c565b92506110348684611483565b915061103f8361152d565b905061104d60085484611483565b600855600160a060020a0384166000908152600460205260409020546110739087611483565b600160a060020a0380861660009081526004602052604080822093909355908916815220546110a29083611456565b600160a060020a0388811660008181526004602090815260408083209590955560098054948a16835260069091528482208054948c02909403909355825491815292909220805492850290920190915554600854611116919068010000000000000000840281151561111057fe5b04611456565b600955604080518381529051600160a060020a03808a1692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019695505050505050565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff1615156111aa57600080fd5b81516111bd9060019060208501906115ce565b505050565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff16151561120357600080fd5b81516111bd9060009060208501906115ce565b6000806000806000806000611229610ef4565b1161123357600080fd5b3360008181526004602052604090205490965087111561125257600080fd5b86945061125e8561152d565b935061126b84600561146c565b92506112778484611483565b915061128560085486611483565b600855600160a060020a0386166000908152600460205260409020546112ab9086611483565b600160a060020a0387166000908152600460209081526040808320939093556009546006909152918120805492880268010000000000000000860201928390039055600854919250101561131b5761131760095460085468010000000000000000860281151561111057fe5b6009555b60408051868152602081018490528151600160a060020a038916927fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a31139928290030190a250505050505050565b33600081815260046020526040812054908111156113885761138881611216565b611390610c71565b5050565b6000610ddb348361053f565b6000806000806113b06001610d9e565b116113ba57600080fd5b6113c46000610d9e565b3360008181526006602090815260408083208054680100000000000000008702019055600590915281208054908290559092019450925061140690849061053f565b905081600160a060020a03167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588483604051808381526020018281526020019250505060405180910390a2505050565b60008282018381101561146557fe5b9392505050565b600080828481151561147a57fe5b04949350505050565b60008282111561148f57fe5b50900390565b6008546000906c01431e0fae6d7217caa00000009082906402540be40061151a611514730380d4bd8a8678c1bb542c80deb4800000000000880268056bc75e2d631000006002860a02017005e0a1fd2712875988becaad0000000000850201780197d4df19d605767337e9f14d3eec8920e40000000000000001611599565b85611483565b81151561152357fe5b0403949350505050565b600854600090670de0b6b3a76400008381019181019083906115866414f46b04008285046402540be40002018702600283670de0b6b3a763ffff1982890a8b900301046402540be4000281151561158057fe5b04611483565b81151561158f57fe5b0495945050505050565b80600260018201045b81811015610ddb5780915060028182858115156115bb57fe5b04018115156115c657fe5b0490506115a2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061160f57805160ff191683800117855561163c565b8280016001018555821561163c579182015b8281111561163c578251825591602001919060010190611621565b50610f0392610c129250905b80821115610f0357600081556001016116485600a165627a7a723058202986f1ef7924e33e9f5613300f260c5fd9f05700de3217343d70f3a5fea5f76d0029" - code_ContractScenario007_deployErc721CardMigration = "6000805460a060020a60ff021916905560e0604052602360808190527f68747470733a2f2f6170692e676f6473756e636861696e65642e636f6d2f636160a09081527f72642f000000000000000000000000000000000000000000000000000000000060c0526200007491601091906200023e565b503480156200008257600080fd5b5060405160208062004212833981016040525160008054600160a060020a03191633179055620000db7f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b6200010f7f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b620001437f4f558e7900000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b620001777f780e9d6300000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b620001ab7f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b60158054600160a060020a031916600160a060020a0392909216919091179055620002e3565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200020157600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600c60205260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028157805160ff1916838001178555620002b1565b82800160010185558215620002b1579182015b82811115620002b157825182559160200191906001019062000294565b50620002bf929150620002c3565b5090565b620002e091905b80821115620002bf5760008155600101620002ca565b90565b613f1f80620002f36000396000f3006080604052600436106103425763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461034757806305c4af9d1461037d57806306fdde031461040c578063081812fc14610496578063095ea7b3146104ca5780630bbe0ee3146104f05780630c340a241461055b5780630e359f1614610570578063100cdd911461058857806318160ddd146105dd57806319fa8f50146106045780631fa24aa71461063657806323b872dd1461065157806324a96d701461067b5780632f745c59146106c5578063396ed600146106e95780633cb4ff3c146107015780633f4ba83a1461071657806342842e0e1461072b57806342966c6814610755578063454b06081461076d5780634cc90115146107855780634f558e791461079d5780634f6ccce7146107b55780634fb31a6a146107cd578063524773ce1461080d5780635bd9d9a5146108225780635c975abb1461083d5780635dcbd8bb146108525780636352211e1461087b57806367025dcf1461089357806370a08231146108e95780637a8b9b851461090a578063818d4b5d14610925578063821f830f146109495780638456cb591461096a578063850e37601461097f5780638dc10768146109b15780638e7e879f146109ea5780639188d31214610a3f578063943b82f114610a5757806395d89b4114610a97578063986e82f214610aac578063a22cb46514610ac8578063a3f4df7e14610aee578063a5487e5114610b03578063a71aec7314610b1b578063a9059cbb14610b37578063ad94d90114610b4e578063b5cab1ce14610bb1578063b84c139214610bc6578063b88d4fde14610bde578063bc734f0f14610c4d578063bcb3962114610c62578063c42cf53514610c77578063c87b56dd14610c98578063c968aab314610cb0578063caa1916814610ccb578063ce9fdb7014610ced578063ced28d7714610d2c578063d7643e1814610d78578063d80f862114610d8d578063dfb6a75f14610da5578063e3c7336b14610dea578063e7cf548c14611007578063e985e9c51461101c578063eeffbe4e14611043578063f03034521461105b578063f5f23b52146110be578063f76f8d78146110d9578063fb36eba1146110ee575b600080fd5b34801561035357600080fd5b50610369600160e060020a03196004351661111c565b604080519115158252519081900360200190f35b34801561038957600080fd5b5061039961ffff6004351661113b565b604080518a1515815260ff808b166020830152898116928201929092529087166060820152608081018660048111156103ce57fe5b60ff90811682529586166020820152938516604080860191909152928516606085015250909216608082015290519081900360a00195509350505050f35b34801561041857600080fd5b50610421611296565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045b578181015183820152602001610443565b50505050905090810190601f1680156104885780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104a257600080fd5b506104ae6004356112ce565b60408051600160a060020a039092168252519081900360200190f35b3480156104d657600080fd5b506104ee600160a060020a03600435166024356112e9565b005b3480156104fc57600080fd5b5060408051602060046044358181013583810280860185019096528085526104ee958335600160a060020a0390811696602480359092169636969560649592949301928291850190849080828437509497506113299650505050505050565b34801561056757600080fd5b506104ae611365565b34801561057c57600080fd5b50610369600435611374565b34801561059457600080fd5b50604080516020600480358082013583810280860185019096528085526104ee953695939460249493850192918291850190849080828437509497506113899650505050505050565b3480156105e957600080fd5b506105f26113bd565b60408051918252519081900360200190f35b34801561061057600080fd5b506106196113c3565b60408051600160e060020a03199092168252519081900360200190f35b34801561064257600080fd5b506104ee60ff600435166113e7565b34801561065d57600080fd5b506104ee600160a060020a036004358116906024351660443561143c565b34801561068757600080fd5b506106ae61ffff6004351660ff602435811690604435811690606435166084351515611469565b6040805161ffff9092168252519081900360200190f35b3480156106d157600080fd5b506105f2600160a060020a03600435166024356114ff565b3480156106f557600080fd5b506106ae60043561156f565b34801561070d57600080fd5b506105f26115a5565b34801561072257600080fd5b506104ee6115b8565b34801561073757600080fd5b506104ee600160a060020a036004358116906024351660443561162e565b34801561076157600080fd5b506104ee600435611660565b34801561077957600080fd5b506104ee600435611691565b34801561079157600080fd5b506106ae60043561180c565b3480156107a957600080fd5b5061036960043561181a565b3480156107c157600080fd5b506105f2600435611837565b3480156107d957600080fd5b506104ee61ffff6004351660ff60243581169060443581169060643581169060843581169060a43581169060c43516611850565b34801561081957600080fd5b506105f2611b03565b34801561082e57600080fd5b5061036960ff60043516611b09565b34801561084957600080fd5b50610369611b1e565b34801561085e57600080fd5b506104ee61ffff6004351667ffffffffffffffff60243516611b2e565b34801561088757600080fd5b506104ae600435611c0c565b6040805160206004602480358281013584810280870186019097528086526104ee968435600160a060020a031696369660449591949091019291829185019084908082843750949750611c369650505050505050565b3480156108f557600080fd5b506105f2600160a060020a0360043516611c6b565b34801561091657600080fd5b5061036960ff60043516611c86565b34801561093157600080fd5b50610369600160a060020a0360043516602435611c9b565b34801561095557600080fd5b506104ee600160a060020a0360043516611cc1565b34801561097657600080fd5b506104ee611d37565b34801561098b57600080fd5b5061099b61ffff60043516611db2565b6040805160ff9092168252519081900360200190f35b3480156109bd57600080fd5b506109c9600435611dc0565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156109f657600080fd5b50604080516020600480358082013583810280860185019096528085526104ee95369593946024949385019291829185019084908082843750949750611ded9650505050505050565b348015610a4b57600080fd5b506109c9600435611e21565b348015610a6357600080fd5b50610a7361ffff60043516611e75565b6040805167ffffffffffffffff909316835290151560208301528051918290030190f35b348015610aa357600080fd5b50610421611ecc565b348015610ab857600080fd5b50610a7361ffff60043516611f03565b348015610ad457600080fd5b506104ee600160a060020a03600435166024351515611f30565b348015610afa57600080fd5b50610421611fb4565b348015610b0f57600080fd5b506106ae600435611feb565b348015610b2757600080fd5b5061036961ffff60043516611ff9565b6104ee600160a060020a0360043516602435612029565b348015610b5a57600080fd5b50604080516020600460248035828101358481028087018601909752808652610369968435600160a060020a0316963696604495919490910192918291850190849080828437509497506120849650505050505050565b348015610bbd57600080fd5b506104216120e8565b348015610bd257600080fd5b506104ae600435612176565b348015610bea57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526104ee94600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061219e9650505050505050565b348015610c5957600080fd5b506104ee6121d6565b348015610c6e57600080fd5b5061099b61225e565b348015610c8357600080fd5b506104ee600160a060020a0360043516612267565b348015610ca457600080fd5b506104216004356122ad565b348015610cbc57600080fd5b506104ee60ff6004351661234f565b348015610cd757600080fd5b506106ae60ff6004351661ffff602435166123a0565b348015610cf957600080fd5b506106ae61ffff6004351660ff60243581169060443581169060643581169060843581169060a4351660c4351515612534565b348015610d3857600080fd5b506106ae61ffff6004351660ff60243581169060443581169060643581169060843581169060a43581169060c43581169060e435166101043515156125cc565b348015610d8457600080fd5b506106ae61266c565b348015610d9957600080fd5b506106ae60043561267b565b348015610db157600080fd5b506106ae61ffff6004351660ff60243581169060443581169060643581169060843581169060a43581169060c4351660e4351515612689565b348015610df657600080fd5b50604080516020600480358082013583810280860185019096528085526106ae95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506127269650505050505050565b34801561101357600080fd5b506105f26128b5565b34801561102857600080fd5b50610369600160a060020a03600435811690602435166128bb565b34801561104f57600080fd5b506106ae6004356128e9565b34801561106757600080fd5b506040805160206004602480358281013584810280870186019097528086526104ee968435600160a060020a0316963696604495919490910192918291850190849080828437509497506128f79650505050505050565b3480156110ca57600080fd5b506104ee60ff6004351661292c565b3480156110e557600080fd5b50610421612961565b3480156110fa57600080fd5b506105f2600160a060020a036004351661ffff60243581169060443516612998565b600160e060020a0319166000908152600c602052604090205460ff1690565b6000806000806000806000806000611151613df2565b61ffff8b16600090815260066020908152604091829020825161012081018452815460ff8082161515835261010082048116948301949094526201000081048416948201949094526301000000840483166060820152929091608084019164010000000090041660048111156111c357fe5b60048111156111ce57fe5b81526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff1681526020016000820160079054906101000a900460ff1660ff1660ff1681526020016000820160089054906101000a900460ff1660ff1660ff16815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b60408051808201909152600e81527f476f647320556e636861696e656400000000000000000000000000000000000060208201525b90565b6000908152600e6020526040902054600160a060020a031690565b6113106001828154811015156112fb57fe5b60009182526020909120015461ffff16611ff9565b151561131b57600080fd5b6113258282612b50565b5050565b60005b815181101561135f576113578484848481518110151561134857fe5b9060200190602002015161143c565b60010161132c565b50505050565b600054600160a060020a031681565b60166020526000908152604090205460ff1681565b60005b8151811015611325576113b582828151811015156113a657fe5b90602001906020020151611660565b60010161138c565b60015490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b600054600160a060020a031633146113fe57600080fd5b60ff80821660009081526003602052604090205416151561141e57600080fd5b60ff166000908152600460205260409020805460ff19166001179055565b61144e6001828154811015156112fb57fe5b151561145957600080fd5b611464838383612c06565b505050565b6000611473613df2565b600054600160a060020a0316331461148a57600080fd5b6040805161012081018252600180825260ff808a16602084015260055416928201929092526060810191909152608081018660048111156114c757fe5b815260ff861660208201526000604082018190526060820181905260809091015290506114f5878285612c99565b5095945050505050565b600061150a83611c6b565b821061151557600080fd5b600160a060020a038316600090815260116020526040902080548390811061153957fe5b90600052602060002090600691828204019190066005029054906101000a900464ffffffffff1664ffffffffff16905092915050565b600b80548290811061157d57fe5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b60006013546115b26113bd565b03905090565b600054600160a060020a031633146115cf57600080fd5b60005460a060020a900460ff1615156115e757600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b80611639338261312c565b151561164457600080fd5b61135f848484602060405190810160405280600081525061219e565b803361166b82611c0c565b600160a060020a03161461167e57600080fd5b601380546001019055611325338361318b565b6000818152601660205260408120548190819060ff16156116b157600080fd5b6000848152601660209081526040808320805460ff1916600117905560155481517f6352211e000000000000000000000000000000000000000000000000000000008152600481018990529151600160a060020a0390911693636352211e93602480850194919392918390030190829087803b15801561173057600080fd5b505af1158015611744573d6000803e3d6000fd5b505050506040513d602081101561175a57600080fd5b5051601554604080517f9188d312000000000000000000000000000000000000000000000000000000008152600481018890528151939650600160a060020a0390921692639188d3129260248082019392918290030181600087803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b505050506040513d60408110156117ec57600080fd5b50805160209091015190925090506118058383836131c9565b5050505050565b600780548290811061157d57fe5b6000908152600d6020526040902054600160a060020a0316151590565b60006118416113bd565b821061184c57600080fd5b5090565b611858613df2565b600054600160a060020a0316331461186f57600080fd5b61ffff8816600090815260066020908152604091829020825161012081018452815460ff8082161515835261010082048116948301949094526201000081048416948201949094526301000000840483166060820152929091608084019164010000000090041660048111156118e157fe5b60048111156118ec57fe5b8152905460ff650100000000008204811660208085019190915266010000000000008304821660408086019190915267010000000000000084048316606086015268010000000000000000909304821660809094019390935283820151811660009081526003909352912054919250161561196657600080fd5b610120604051908101604052806001151581526020018860ff168152602001826040015160ff1681526020018760ff168152602001826080015160048111156119ab57fe5b815260ff87811660208084019190915287821660408085019190915287831660608086019190915287841660809586015261ffff8e166000908152600684528290208651815494880151938801519288015160ff199095169015151761ff001916610100938616939093029290921762ff0000191662010000918516919091021763ff00000019166301000000929093169190910291909117808255918301519091829064ff000000001916640100000000836004811115611a6957fe5b021790555060a0820151815460c084015160e08501516101009095015165ff0000000000199092166501000000000060ff948516021766ff00000000000019166601000000000000918416919091021767ff000000000000001916670100000000000000948316949094029390931768ff000000000000000019166801000000000000000091909316029190911790555050505050505050565b60135481565b60046020526000908152604090205460ff1681565b60005460a060020a900460ff1681565b611b36613e3e565b600054600160a060020a03163314611b4d57600080fd5b5061ffff821660009081526002602090815260409182902082518084019093525467ffffffffffffffff8116835268010000000000000000900460ff1615801591830191909152611b9d57600080fd5b5060408051808201825267ffffffffffffffff92831681526001602080830191825261ffff90951660009081526002909552919093209251835491511515680100000000000000000268ff0000000000000000199190931667ffffffffffffffff199092169190911716179055565b6000818152600d6020526040812054600160a060020a0316801515611c3057600080fd5b92915050565b60005b815181101561146457611c63838383815181101515611c5457fe5b90602001906020020151612029565b600101611c39565b600160a060020a031660009081526011602052604090205490565b60036020526000908152604090205460ff1681565b600082600160a060020a0316611cb083611c0c565b600160a060020a0316149392505050565b600054600160a060020a03163314611cd857600080fd5b601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314611d4e57600080fd5b60005460a060020a900460ff1615611d6557600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b6103e861ffff919091160490565b6001805482908110611dce57fe5b60009182526020909120015461ffff8082169250620100009091041682565b60005b815181101561132557611e198282815181101515611e0a57fe5b90602001906020020151611691565b600101611df0565b600080611e2c613e3e565b6001805485908110611e3a57fe5b60009182526020918290206040805180820190915291015461ffff808216808452620100009092041691909201819052909590945092505050565b600080611e80613e3e565b50505061ffff1660009081526002602090815260409182902082518084019093525467ffffffffffffffff81168084526801000000000000000090910460ff1615159290910182905291565b60408051808201909152600481527f474f445300000000000000000000000000000000000000000000000000000000602082015290565b60026020526000908152604090205467ffffffffffffffff81169068010000000000000000900460ff1682565b600160a060020a038216331415611f4657600080fd5b336000818152600f60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60408051808201909152600e81527f476f647320556e636861696e6564000000000000000000000000000000000000602082015281565b600a80548290811061157d57fe5b61ffff1660009081526006602090815260408083205462010000900460ff90811684526003909252909120541690565b803361203482611c0c565b600160a060020a03161461204757600080fd5b6120596001838154811015156112fb57fe5b151561206457600080fd5b600160a060020a038316151561207957600080fd5b6114643384846132ae565b6000806000835111151561209757600080fd5b5060005b82518110156120dc576120c58484838151811015156120b657fe5b90602001906020020151611c9b565b15156120d457600091506120e1565b60010161209b565b600191505b5092915050565b6010805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561216e5780601f106121435761010080835404028352916020019161216e565b820191906000526020600020905b81548152906001019060200180831161215157829003601f168201915b505050505081565b601480548290811061218457fe5b600091825260209091200154600160a060020a0316905081565b816121a9338261312c565b15156121b457600080fd5b6121bf85858561143c565b6121cb85858585613300565b151561180557600080fd5b600054600160a060020a031633146121ed57600080fd5b60055460ff908116111561220057600080fd5b6005805460ff8082166001011660ff199091161790556000612223600782613e55565b506000612231600882613e55565b50600061223f600982613e55565b50600061224d600a82613e55565b50600061225b600b82613e55565b50565b60055460ff1681565b600054600160a060020a0316331461227e57600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6010805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152606093611c30939192909183018282801561233c5780601f106123115761010080835404028352916020019161233c565b820191906000526020600020905b81548152906001019060200180831161231f57829003601f168201915b505050505061234a8461346d565b613560565b600054600160a060020a0316331461236657600080fd5b60ff808216600090815260046020526040902054161561238557600080fd5b60ff166000908152600360205260409020805460ff19169055565b600080808080808760048111156123b357fe5b141561240357600b805461ffff88168115156123cb57fe5b068154811015156123d857fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff16945061252a565b600187600481111561241157fe5b141561242957600a805461ffff88168115156123cb57fe5b600287600481111561243757fe5b141561244f576009805461ffff88168115156123cb57fe5b600387600481111561245d57fe5b1415612475576008805461ffff88168115156123cb57fe5b600487600481111561248357fe5b1415610342575060005b600754811015612518576007805461ffff881683018115156124ab57fe5b068154811015156124b857fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1693506124e784611e75565b9093509150818015612503575060008367ffffffffffffffff16115b156125105783945061252a565b60010161248d565b6008805461ffff88168115156123cb57fe5b5050505092915050565b600061253e613df2565b600054600160a060020a0316331461255557600080fd5b60408051610120810182526001815260ff808b1660208301526005541691810191909152600360608201526080810188600481111561259057fe5b815260ff8089166020830152878116604083015286166060820152600060809091015290506125c0898285612c99565b50979650505050505050565b60006125d6613df2565b600054600160a060020a031633146125ed57600080fd5b60408051610120810182526001815260ff808d1660208301526005548116928201929092529086166060820152608081018a600481111561262a57fe5b81526020018960ff1681526020018860ff1681526020018760ff1681526020018560ff16815250905061265e8b8285612c99565b509998505050505050505050565b600554610100900461ffff1681565b600980548290811061157d57fe5b6000612693613df2565b600054600160a060020a031633146126aa57600080fd5b60408051610120810182526001815260ff808c166020830152600554169181019190915260026060820152608081018960048111156126e557fe5b81526020018860ff1681526020018760ff1681526020018660ff1681526020018560ff1681525090506127198a8285612c99565b5098975050505050505050565b600080612731613df2565b600054600160a060020a0316331461274857600080fd5b600091505b8b518210156128a657610120604051908101604052806001151581526020018c8481518110151561277a57fe5b602090810290910181015160ff9081168352600554169082015287516040909101908890859081106127a857fe5b9060200190602002015160ff1681526020018b848151811015156127c857fe5b9060200190602002015160048111156127dd57fe5b81526020018a848151811015156127f057fe5b9060200190602002015160ff168152602001898481518110151561281057fe5b9060200190602002015160ff168152602001888481518110151561283057fe5b9060200190602002015160ff168152602001868481518110151561285057fe5b9060200190602002015160ff16815250905061289b8c8381518110151561287357fe5b9060200190602002015182868581518110151561288c57fe5b90602001906020020151612c99565b60019091019061274d565b50509998505050505050505050565b60135490565b600160a060020a039182166000908152600f6020908152604080832093909416825291909152205460ff1690565b600880548290811061157d57fe5b60005b81518110156114645761292483838381518110151561291557fe5b906020019060200201516112e9565b6001016128fa565b600054600160a060020a0316331461294357600080fd5b60ff166000908152600360205260409020805460ff19166001179055565b60408051808201909152600481527f474f445300000000000000000000000000000000000000000000000000000000602082015281565b60006129a2613df2565b60008054819060a060020a900460ff16156129bc57600080fd5b6129c461359c565b15156129cf57600080fd5b61ffff8616600090815260066020908152604091829020825161012081018452815460ff808216151583526101008204811694830194909452620100008104841694820194909452630100000084048316606082015292909160808401916401000000009004166004811115612a4157fe5b6004811115612a4c57fe5b8152905460ff6501000000000082048116602084015266010000000000008204811660408085019190915267010000000000000083048216606085015268010000000000000000909204811660809093019290925260055490830151929550918116911614612aba57600080fd5b600483608001516004811115612acc57fe5b1415612b3a57612adb86611e75565b9092509050801580612af7575060008267ffffffffffffffff16115b1515612b0257600080fd5b61ffff86166000908152600260205260409020805467ffffffffffffffff19811667ffffffffffffffff918216600019019091161790555b612b458787876131c9565b979650505050505050565b6000612b5b82611c0c565b9050600160a060020a038381169082161415612b7657600080fd5b33600160a060020a0382161480612b925750612b9281336128bb565b1515612b9d57600080fd5b6000828152600e6020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80612c11338261312c565b1515612c1c57600080fd5b600160a060020a0384161515612c3157600080fd5b600160a060020a0383161515612c4657600080fd5b612c5084836135ed565b612c5a848361365c565b612c6483836138bd565b8183600160a060020a031685600160a060020a0316600080516020613ed483398151915260405160405180910390a450505050565b61ffff831660009081526006602052604081205460ff1615612cba57600080fd5b6001835261ffff8416600090815260066020908152604091829020855181549287015193870151606088015160ff199094169115159190911761ff00191661010060ff958616021762ff0000191662010000918516919091021763ff000000191663010000009390921692909202178082556080850151859291829064ff000000001916640100000000836004811115612d5057fe5b021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055509050506005600181819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550507f2f7e8f79713fd202353aaa4d413bb73a3bc66d59a540f646415fd9acee7e59c684600560009054906101000a900460ff16856020015186608001518760a001518860c001518960e001518a606001518b61010001518b604051808b61ffff1661ffff1681526020018a60ff1660ff1681526020018960ff1660ff168152602001886004811115612e9f57fe5b60ff90811682529788166020820152958716604080880191909152948716606087015250918516608085015290931660a083015291151560c082015290519081900360e001945092505050a1811561135f575060808201516000816004811115612f0557fe5b1415612f6857600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960108204018054600f9092166002026101000a61ffff818102199093169287160291909117905561135f565b6001816004811115612f7657fe5b1415612fd957600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a860108204018054600f9092166002026101000a61ffff818102199093169287160291909117905561135f565b6002816004811115612fe757fe5b141561304a57600980546001810182556000919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60108204018054600f9092166002026101000a61ffff818102199093169287160291909117905561135f565b600381600481111561305857fe5b14156130bb57600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360108204018054600f9092166002026101000a61ffff818102199093169287160291909117905561135f565b60048160048111156130c957fe5b141561034257600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860108204018054600f9092166002026101000a61ffff818102199093169287160291909117905561135f565b60008061313883611c0c565b905080600160a060020a031684600160a060020a03161480613173575083600160a060020a0316613168846112ce565b600160a060020a0316145b80613183575061318381856128bb565b949350505050565b61319582826135ed565b61319f828261365c565b6040518190600090600160a060020a03851690600080516020613ed4833981519152908390a45050565b60006131d3613e3e565b506040805180820190915261ffff80851682528381166020830190815260018054808201825560009190915283517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68201805493518516620100000263ffff0000199290951661ffff199094169390931716929092179055613255868261398e565b6040805161ffff808816825286166020820152600160a060020a03881681830152905182917fe8a3345b7ca502cc541c08a705987fa4c03d9f59c0427175387a64cbd8f46594919081900360600190a295945050505050565b6132b883826135ed565b6132c2838261365c565b6132cc82826138bd565b8082600160a060020a031684600160a060020a0316600080516020613ed483398151915260405160405180910390a4505050565b60008061331585600160a060020a03166139d7565b15156133245760019150613464565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156133b757818101518382015260200161339f565b50505050905090810190601f1680156133e45780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561340657600080fd5b505af115801561341a573d6000803e3d6000fd5b505050506040513d602081101561343057600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606060008082818515156134b65760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450613557565b8593505b83156134d157600190920191600a840493506134ba565b826040519080825280601f01601f1916602001820160405280156134ff578160200160208202803883390190505b5091505060001982015b851561355357815160001982019160f860020a6030600a8a06010291849190811061353057fe5b906020010190600160f860020a031916908160001a905350600a86049550613509565b8194505b50505050919050565b6040805160208181018352600080835283518083018552818152845192830190945281526060926135959286928692906139df565b9392505050565b6000805b6014548110156135e55760148054829081106135b857fe5b600091825260209091200154600160a060020a03163314156135dd576001915061184c565b6001016135a0565b600091505090565b81600160a060020a031661360082611c0c565b600160a060020a03161461361357600080fd5b6000818152600e6020526040902054600160a060020a031615611325576000908152600e60205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600080600061366b8585613c40565b601280548590811061367957fe5b60009182526020808320600883040154600160a060020a0389168452601190915260409092205460079091166004026101000a90910463ffffffff90811694506136c79190600190613c9216565b600160a060020a0386166000908152601160205260409020805491935090839081106136ef57fe5b90600052602060002090600691828204019190066005029054906101000a900464ffffffffff169050806011600087600160a060020a0316600160a060020a031681526020019081526020016000208463ffffffff1681548110151561375157fe5b90600052602060002090600691828204019190066005026101000a81548164ffffffffff021916908364ffffffffff16021790555060006011600087600160a060020a0316600160a060020a03168152602001908152602001600020838154811015156137ba57fe5b90600052602060002090600691828204019190066005026101000a81548164ffffffffff021916908364ffffffffff1602179055506011600086600160a060020a0316600160a060020a031681526020019081526020016000208054809190600190036138279190613e89565b50600060128581548110151561383957fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055508260128264ffffffffff1681548110151561388357fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b60006138c98383613ca4565b50600160a060020a03821660009081526011602052604090205463ffffffff811681146138f557600080fd5b600160a060020a038316600090815260116020908152604082208054600181018255908352912060068083049091018054919092066005026101000a64ffffffffff8181021990921691851602179055601280548291908490811061395657fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550505050565b600160a060020a03821615156139a357600080fd5b6139ad8282613d01565b6040518190600160a060020a03841690600090600080516020613ed4833981519152908290a45050565b6000903b1190565b6060806060806060806060806000808e98508d97508c96508b95508a94508451865188518a518c51010101016040519080825280601f01601f191660200182016040528015613a38578160200160208202803883390190505b50935083925060009150600090505b8851811015613aa5578881815181101515613a5e57fe5b90602001015160f860020a900460f860020a028383806001019450815181101515613a8557fe5b906020010190600160f860020a031916908160001a905350600101613a47565b5060005b8751811015613b07578781815181101515613ac057fe5b90602001015160f860020a900460f860020a028383806001019450815181101515613ae757fe5b906020010190600160f860020a031916908160001a905350600101613aa9565b5060005b8651811015613b69578681815181101515613b2257fe5b90602001015160f860020a900460f860020a028383806001019450815181101515613b4957fe5b906020010190600160f860020a031916908160001a905350600101613b0b565b5060005b8551811015613bcb578581815181101515613b8457fe5b90602001015160f860020a900460f860020a028383806001019450815181101515613bab57fe5b906020010190600160f860020a031916908160001a905350600101613b6d565b5060005b8451811015613c2d578481815181101515613be657fe5b90602001015160f860020a900460f860020a028383806001019450815181101515613c0d57fe5b906020010190600160f860020a031916908160001a905350600101613bcf565b50909d9c50505050505050505050505050565b81600160a060020a0316613c5382611c0c565b600160a060020a031614613c6657600080fd5b6000908152600d60205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600082821115613c9e57fe5b50900390565b6000818152600d6020526040902054600160a060020a031615613cc657600080fd5b6000908152600d60205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000613d0d8383613ca4565b50600160a060020a03821660009081526011602052604090205463ffffffff81168114613d3957600080fd5b600160a060020a039290921660009081526011602090815260408220805460018082018355918452918320600680840490910180549190930660050261010090810a64ffffffffff818102199093169690921691909102949094179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344460088204018054600790921660040290920a63ffffffff818102199092169190931692909202919091179055565b6040805161012081018252600080825260208201819052918101829052606081018290529060808201908152600060208201819052604082018190526060820181905260809091015290565b604080518082019091526000808252602082015290565b81548183558181111561146457600f016010900481600f016010900483600052602060002091820191016114649190613eb9565b81548183558181111561146457600501600690048160050160069004836000526020600020918201910161146491905b6112cb91905b8082111561184c5760008155600101613ebf5600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582010fa10dfd0372688e0f7a010b360af415423fe495c99c201f4e1bfab3b1c44210029000000000000000000000000512fbd15bde6570ff09e4438af27ede604024515" - code_ContractScenario008_deployErc721CryptoKitties = "606060409081526002805460a060020a60ff02191690556101c090519081016040908152603c82526078602083015261012c9082015261025860608201526107086080820152610e1060a0820152611c2060c082015261384060e082015261708061010082015261e100610120820152620151806101408201526202a3006101608201526205460061018082015262093a806101a0820152620000a790600390600e620004e4565b50600f60055566071afd498d0000600e553415620000c457600080fd5b6002805460008054600160a060020a033316600160a060020a03199182168117835560a060020a60ff02199093167401000000000000000000000000000000000000000017169091179091556200012f90808060001981640100000000620028f06200013682021704565b5062000649565b6000806200014362000587565b600063ffffffff891689146200015857600080fd5b63ffffffff881688146200016b57600080fd5b61ffff871687146200017c57600080fd5b600287049250600d8361ffff1611156200019557600d92505b61010060405190810160409081528782526001604060020a0342166020830152600090820181905263ffffffff808c1660608401528a16608083015260a082015261ffff80851660c0830152881660e082015260068054919350600191808301620002018382620005cb565b6000928352602090922085916002020181518155602082015160018201805467ffffffffffffffff19166001604060020a039290921691909117905560408201518160010160086101000a8154816001604060020a0302191690836001604060020a0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e08201516001909101805461ffff929092167e0100000000000000000000000000000000000000000000000000000000000002600160f060020a039092169190911790555003905063ffffffff811681146200035e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168651604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a1620003ef60008683640100000000620025e0620003fb82021704565b98975050505050505050565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a03191690911790558316156200048f57600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b600283019183908215620005755791602002820160005b838211156200054157835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620004fb565b8015620005735782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000541565b505b5062000583929150620005ff565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005fa57600202816002028360005260206000209182019101620005fa919062000626565b505050565b6200062391905b808211156200058357805463ffffffff1916815560010162000606565b90565b6200062391905b808211156200058357600080825560018201556002016200062d565b61309380620006596000396000f3006060604052600436106102a55763ffffffff60e060020a60003504166301ffc9a781146102dd5780630519ce79146103295780630560ff441461035857806305e45546146103f157806306fdde0314610416578063095ea7b3146104295780630a0f81681461044b5780630e583df01461045e57806314001f4c1461047157806318160ddd14610490578063183a7947146104a35780631940a936146104b657806319c2f201146104cc57806321717ebf146104df57806323b872dd146104f257806324e7a38a1461051a57806327d7874c146105395780632ba73c15146105585780633d7d3f5a146105775780633f4ba83a1461059657806346116e6f146105a957806346d22c70146105bf578063481af3d3146105d85780634ad8c938146105ee5780634b85fd551461060d5780634dfff04f146106235780634e0a33791461064557806356129134146106645780635663896e146106865780635c975abb1461069c5780635fd8c710146106af5780636352211e146106c2578063680eba27146106d85780636af04a57146106eb5780636fbde40d146106fe57806370a082311461071d578063715879881461073c5780637a7d49371461075b5780638456cb591461076e5780638462151c1461078157806388c2a0bf146107f357806391876e571461080957806395d89b411461081c5780639d6fac6f1461082f578063a45f4bfc1461085e578063a9059cbb14610874578063b047fb5014610896578063b0c35c05146108a9578063bc4006f5146108bc578063c3bea9af146108cf578063d3e6f49f146108e5578063defb9584146108fb578063e17b25af1461090e578063e6cbe3511461092d578063e98b7f4d14610940578063ed60ade6146109ae578063f1ca9410146109bc578063f2b47d52146109cf578063f7d8c883146109e2575b600b5433600160a060020a03908116911614806102d05750600c5433600160a060020a039081169116145b15156102db57600080fd5b005b34156102e857600080fd5b6103157fffffffff00000000000000000000000000000000000000000000000000000000600435166109f0565b604051901515815260200160405180910390f35b341561033457600080fd5b61033c610c77565b604051600160a060020a03909116815260200160405180910390f35b341561036357600080fd5b61037a600480359060248035908101910135610c86565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103b657808201518382015260200161039e565b50505050905090810190601f1680156103e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103fc57600080fd5b610404610d63565b60405190815260200160405180910390f35b341561042157600080fd5b61037a610d69565b341561043457600080fd5b6102db600160a060020a0360043516602435610da0565b341561045657600080fd5b61033c610e2a565b341561046957600080fd5b610404610e39565b341561047c57600080fd5b6102db600160a060020a0360043516610e44565b341561049b57600080fd5b610404610ef1565b34156104ae57600080fd5b610404610efc565b34156104c157600080fd5b610315600435610f02565b34156104d757600080fd5b610404610f47565b34156104ea57600080fd5b61033c610f4e565b34156104fd57600080fd5b6102db600160a060020a0360043581169060243516604435610f5d565b341561052557600080fd5b6102db600160a060020a0360043516610fe4565b341561054457600080fd5b6102db600160a060020a0360043516611091565b341561056357600080fd5b6102db600160a060020a03600435166110e3565b341561058257600080fd5b6102db600435602435604435606435611135565b34156105a157600080fd5b6102db611214565b34156105b457600080fd5b61033c6004356112ac565b34156105ca57600080fd5b6103156004356024356112c7565b34156105e357600080fd5b61033c600435611347565b34156105f957600080fd5b6102db600435602435604435606435611362565b341561061857600080fd5b6102db600435611428565b341561062e57600080fd5b6102db600160a060020a0360043516602435611448565b341561065057600080fd5b6102db600160a060020a03600435166114a2565b341561066f57600080fd5b6102db600435600160a060020a03602435166114f4565b341561069157600080fd5b6102db600435611560565b34156106a757600080fd5b6103156115c8565b34156106ba57600080fd5b6102db6115d8565b34156106cd57600080fd5b61033c600435611649565b34156106e357600080fd5b61040461166d565b34156106f657600080fd5b61033c611673565b341561070957600080fd5b6102db600160a060020a0360043516611682565b341561072857600080fd5b610404600160a060020a036004351661172f565b341561074757600080fd5b6102db600160a060020a036004351661174a565b341561076657600080fd5b6104046117d8565b341561077957600080fd5b6102db6117de565b341561078c57600080fd5b6107a0600160a060020a036004351661186a565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156107df5780820151838201526020016107c7565b505050509050019250505060405180910390f35b34156107fe57600080fd5b61040460043561194b565b341561081457600080fd5b6102db611c1b565b341561082757600080fd5b61037a611d0e565b341561083a57600080fd5b610845600435611d45565b60405163ffffffff909116815260200160405180910390f35b341561086957600080fd5b61033c600435611d72565b341561087f57600080fd5b6102db600160a060020a0360043516602435611d8d565b34156108a157600080fd5b61033c611e30565b34156108b457600080fd5b610404611e3f565b34156108c757600080fd5b61033c611e45565b34156108da57600080fd5b6102db600435611e54565b34156108f057600080fd5b610315600435611f47565b341561090657600080fd5b610404612010565b341561091957600080fd5b6102db600160a060020a0360043516612016565b341561093857600080fd5b61033c612053565b341561094b57600080fd5b610956600435612062565b6040519915158a5297151560208a01526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390f35b6102db6004356024356121c3565b34156109c757600080fd5b610404612316565b34156109da57600080fd5b61033c61231c565b6102db60043560243561232b565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610c6f57506040517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152601d0160405180910390206040517f746f6b656e734f664f776e657228616464726573732900000000000000000000815260160160405180910390206040517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602082015260250160405180910390206040517f7472616e7366657228616464726573732c75696e743235362900000000000000815260190160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390206040517f62616c616e63654f662861646472657373290000000000000000000000000000815260120160405180910390206040517f746f74616c537570706c792829000000000000000000000000000000000000008152600d0160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d652829000000000000000000000000000000000000000000000000000081526006016040518091039020181818181818181818600160e060020a03191682600160e060020a031916145b90505b919050565b600154600160a060020a031681565b610c8e612fa0565b610c96612fb2565b600d54600090600160a060020a03161515610cb057600080fd5b600d54600160a060020a031663cb4799f2878787600060405160a0015260405160e060020a63ffffffff861602815260048101848152604060248301908152604483018490529091606401848480828437820191505094505050505060a060405180830381600087803b1515610d2557600080fd5b6102c65a03f11515610d3657600080fd5b50505060405180608001805160209091016040529092509050610d59828261251d565b9695505050505050565b60115481565b60408051908101604052600d81527f43727970746f4b69747469657300000000000000000000000000000000000000602082015281565b60025460a060020a900460ff1615610db757600080fd5b610dc13382612572565b1515610dcc57600080fd5b610dd68183612592565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b600054600160a060020a031681565b662386f26fc1000081565b6000805433600160a060020a03908116911614610e6057600080fd5b5080600160a060020a0381166376190f8f6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ea857600080fd5b6102c65a03f11515610eb957600080fd5b505050604051805190501515610ece57600080fd5b600c8054600160a060020a031916600160a060020a039290921691909117905550565b600654600019015b90565b600f5481565b6000808211610f1057600080fd5b6006805483908110610f1e57fe5b600091825260209091206002909102016001015460c060020a900463ffffffff16151592915050565b6201518081565b600c54600160a060020a031681565b60025460a060020a900460ff1615610f7457600080fd5b600160a060020a0382161515610f8957600080fd5b30600160a060020a031682600160a060020a031614151515610faa57600080fd5b610fb433826125c0565b1515610fbf57600080fd5b610fc98382612572565b1515610fd457600080fd5b610fdf8383836125e0565b505050565b6000805433600160a060020a0390811691161461100057600080fd5b5080600160a060020a0381166354c15b826000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561104857600080fd5b6102c65a03f1151561105957600080fd5b50505060405180519050151561106e57600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b60005433600160a060020a039081169116146110ac57600080fd5b600160a060020a03811615156110c157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146110fe57600080fd5b600160a060020a038116151561111357600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60025460a060020a900460ff161561114c57600080fd5b6111563385612572565b151561116157600080fd5b61116a84610f02565b1561117457600080fd5b600b5461118b908590600160a060020a0316612592565b600b54600160a060020a03166327ebe40a858585853360405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b15156111fa57600080fd5b6102c65a03f1151561120b57600080fd5b50505050505050565b60005433600160a060020a0390811691161461122f57600080fd5b60025460a060020a900460ff16151561124757600080fd5b600b54600160a060020a0316151561125e57600080fd5b600c54600160a060020a0316151561127557600080fd5b601054600160a060020a0316151561128c57600080fd5b601354600160a060020a0316156112a257600080fd5b6112aa6126c8565b565b600a60205260009081526040902054600160a060020a031681565b600080808085116112d757600080fd5b600084116112e457600080fd5b60068054869081106112f257fe5b9060005260206000209060020201915060068481548110151561131157fe5b9060005260206000209060020201905061132d8286838761271b565b801561133e575061133e848661289b565b95945050505050565b600960205260009081526040902054600160a060020a031681565b60025460a060020a900460ff161561137957600080fd5b6113833385612572565b151561138e57600080fd5b61139784611f47565b15156113a257600080fd5b600c546113b9908590600160a060020a0316612592565b600c54600160a060020a03166327ebe40a858585853360405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b15156111fa57600080fd5b60025433600160a060020a0390811691161461144357600080fd5b600e55565b60025460a060020a900460ff161561145f57600080fd5b6114693382612572565b151561147457600080fd5b6000908152600a602052604090208054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146114bd57600080fd5b600160a060020a03811615156114d257600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60025460009033600160a060020a0390811691161461151257600080fd5b5080600160a060020a03811615156115325750600254600160a060020a03165b601154611388901061154357600080fd5b60118054600101905561155a6000808086856128f0565b50505050565b60025433600160a060020a039081169116148061158b575060005433600160a060020a039081169116145b806115a4575060015433600160a060020a039081169116145b15156115af57600080fd5b60035463ffffffff1681106115c357600080fd5b600555565b60025460a060020a900460ff1681565b600154600090819033600160a060020a039081169116146115f857600080fd5b30600160a060020a0316319150600e54600f546001010290508082111561164557600154600160a060020a031681830380156108fc0290604051600060405180830381858888f150505050505b5050565b600081815260076020526040902054600160a060020a0316801515610c7257600080fd5b61afc881565b601354600160a060020a031681565b6000805433600160a060020a0390811691161461169e57600080fd5b5080600160a060020a0381166385b861886000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156116e657600080fd5b6102c65a03f115156116f757600080fd5b50505060405180519050151561170c57600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550565b600160a060020a031660009081526008602052604090205490565b60005433600160a060020a0390811691161461176557600080fd5b60025460a060020a900460ff16151561177d57600080fd5b60138054600160a060020a031916600160a060020a0383161790557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051600160a060020a03909116815260200160405180910390a150565b60055481565b60025433600160a060020a0390811691161480611809575060005433600160a060020a039081169116145b80611822575060015433600160a060020a039081169116145b151561182d57600080fd5b60025460a060020a900460ff161561184457600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b611872612fa0565b600061187c612fa0565b600080600061188a8761172f565b94508415156118ba5760006040518059106118a25750595b90808252806020026020018201604052509550611941565b846040518059106118c85750595b908082528060200260200182016040525093506118e3610ef1565b925060009150600190505b82811161193d57600081815260076020526040902054600160a060020a0388811691161415611935578084838151811061192457fe5b602090810290910101526001909101905b6001016118ee565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561197357600080fd5b600680548a90811061198157fe5b60009182526020909120600290910201600181015490975067ffffffffffffffff1615156119ae57600080fd5b611a438761010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612b9c565b1515611a4e57600080fd5b60018701546006805460c060020a90920463ffffffff1697509087908110611a7257fe5b600091825260209091206001808a015460029093029091019081015490965061ffff60f060020a92839004811696509190041684901115611ac057600185015460f060020a900461ffff1693505b6010548754865460018a0154600160a060020a0390931692630d9f5aed92919068010000000000000000900467ffffffffffffffff166000190160006040516020015260405160e060020a63ffffffff86160281526004810193909352602483019190915267ffffffffffffffff166044820152606401602060405180830381600087803b1515611b5057600080fd5b6102c65a03f11515611b6157600080fd5b505050604051805160008b81526007602052604090205460018a810154929650600160a060020a039091169450611bb092508b9160c060020a900463ffffffff1690870161ffff1686866128f0565b6001880180547bffffffff00000000000000000000000000000000000000000000000019169055600f8054600019019055600e54909150600160a060020a0333169080156108fc0290604051600060405180830381858888f150939c9b505050505050505050505050565b60025433600160a060020a0390811691161480611c46575060005433600160a060020a039081169116145b80611c5f575060015433600160a060020a039081169116145b1515611c6a57600080fd5b600b54600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611ca957600080fd5b6102c65a03f11515611cba57600080fd5b5050600c54600160a060020a03169050635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611cfd57600080fd5b6102c65a03f11515610fdf57600080fd5b60408051908101604052600281527f434b000000000000000000000000000000000000000000000000000000000000602082015281565b600381600e8110611d5257fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600760205260009081526040902054600160a060020a031681565b60025460a060020a900460ff1615611da457600080fd5b600160a060020a0382161515611db957600080fd5b30600160a060020a031682600160a060020a031614151515611dda57600080fd5b600b54600160a060020a0383811691161415611df557600080fd5b600c54600160a060020a0383811691161415611e1057600080fd5b611e1a3382612572565b1515611e2557600080fd5b6116453383836125e0565b600254600160a060020a031681565b600e5481565b600d54600160a060020a031681565b60025460009033600160a060020a03908116911614611e7257600080fd5b60125461afc89010611e8357600080fd5b611e92600080600085306128f0565b600b54909150611eac908290600160a060020a0316612592565b600b54600160a060020a03166327ebe40a82611ec6612bd4565b6000620151803060405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b1515611f2657600080fd5b6102c65a03f11515611f3757600080fd5b5050601280546001019055505050565b600080808311611f5657600080fd5b6006805484908110611f6457fe5b906000526020600020906002020190506120098161010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b9392505050565b61138881565b60005433600160a060020a0390811691161461203157600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600b54600160a060020a031681565b600080600080600080600080600080600060068c81548110151561208257fe5b906000526020600020906002020190508060010160189054906101000a900463ffffffff1663ffffffff16600014159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b60025460009060a060020a900460ff16156121dd57600080fd5b6121e73383612572565b15156121f257600080fd5b6121fb82611f47565b151561220657600080fd5b6122108284612cb9565b151561221b57600080fd5b600c54600160a060020a031663c55d0f568460006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561226c57600080fd5b6102c65a03f1151561227d57600080fd5b5050506040518051600e549092508201341015905061229b57600080fd5b600c54600e54600160a060020a039091169063454a2ab39034038560405160e060020a63ffffffff851602815260048101919091526024016000604051808303818588803b15156122eb57600080fd5b6125ee5a03f115156122fc57600080fd5b50505050610fdf8263ffffffff168463ffffffff16612d08565b60125481565b601054600160a060020a031681565b600254600090819060a060020a900460ff161561234757600080fd5b600e5434101561235657600080fd5b6123603385612572565b151561236b57600080fd5b612375838561289b565b151561238057600080fd5b600680548590811061238e57fe5b906000526020600020906002020191506124338261010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b151561243e57600080fd5b600680548490811061244c57fe5b906000526020600020906002020190506124f18161010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b15156124fc57600080fd5b6125088285838661271b565b151561251357600080fd5b61155a8484612d08565b612525612fa0565b61252d612fa0565b6000808460405180591061253e5750595b818152601f19601f8301168101602001604052905092505060208201905084612568828287612e72565b5090949350505050565b600090815260076020526040902054600160a060020a0391821691161490565b6000918252600960205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260096020526040902054600160a060020a0391821691161490565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a031916909117905583161561267357600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60005433600160a060020a039081169116146126e357600080fd5b60025460a060020a900460ff1615156126fb57600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b60008184141561272d57506000612893565b6001850154608060020a900463ffffffff1682148061275c5750600185015460a060020a900463ffffffff1682145b1561276957506000612893565b6001830154608060020a900463ffffffff168414806127985750600183015460a060020a900463ffffffff1684145b156127a557506000612893565b6001830154608060020a900463ffffffff1615806127d257506001850154608060020a900463ffffffff16155b156127df57506001612893565b60018581015490840154608060020a9182900463ffffffff9081169290910416148061282a575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b1561283757506000612893565b6001808601549084015460a060020a900463ffffffff908116608060020a90920416148061288257506001858101549084015460a060020a9182900463ffffffff9081169290910416145b1561288f57506000612893565b5060015b949350505050565b6000818152600760205260408082205484835290822054600160a060020a0391821691168082148061133e57506000858152600a6020526040902054600160a060020a03908116908316149250505092915050565b6000806128fb612fdb565b600063ffffffff8916891461290f57600080fd5b63ffffffff8816881461292157600080fd5b61ffff8716871461293157600080fd5b600287049250600d8361ffff16111561294957600d92505b610100604051908101604090815287825267ffffffffffffffff42166020830152600090820181905263ffffffff808c1660608401528a16608083015260a082015261ffff80851660c0830152881660e0820152600680549193506001918083016129b4838261301f565b6000928352602090922085916002020181518155602082015160018201805467ffffffffffffffff191667ffffffffffffffff9290921691909117905560408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e08201516001909101805461ffff9290921660f060020a027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003905063ffffffff81168114612b0f57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168651604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a1612b90600086836125e0565b98975050505050505050565b60008160a0015163ffffffff1615801590610c6f57504367ffffffffffffffff16826040015167ffffffffffffffff16111592915050565b600b5460009081908190600160a060020a031663eac9d94c82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612c2257600080fd5b6102c65a03f11515612c3357600080fd5b50505060405180519250506fffffffffffffffffffffffffffffffff82168214612c5c57600080fd5b50600281048101662386f26fc10000811015612c7c5750662386f26fc100005b92915050565b60008160a0015163ffffffff16158015610c6f57504367ffffffffffffffff16826040015167ffffffffffffffff16111592915050565b6000806000600685815481101515612ccd57fe5b90600052602060002090600202019150600684815481101515612cec57fe5b9060005260206000209060020201905061133e8286838761271b565b600080600683815481101515612d1a57fe5b90600052602060002090600202019150600684815481101515612d3957fe5b600091825260209091206002909102016001810180547bffffffff000000000000000000000000000000000000000000000000191660c060020a63ffffffff8716021790559050612d8982612eb7565b612d9281612eb7565b6000848152600a602090815260408083208054600160a060020a031990811690915586845281842080549091169055600f8054600190810190915587845260079092529182902054908301547f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b8092600160a060020a0390921691879187916801000000000000000090910467ffffffffffffffff1690518085600160a060020a0316600160a060020a031681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210612e985782518452602084019350602083019250602082039150612e75565b6001826020036101000a03905080198351168185511617909352505050565b600554600182015443919060039060e060020a900461ffff16600e8110612eda57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811515612f0557fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60e060020a90910461ffff161015612f9d576001818101805461ffff60e060020a8083048216909401169092027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b50565b60206040519081016040526000815290565b60806040519081016040526004815b60008152600019919091019060200181612fc15790505090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511610fdf57600083815260209020610fdf91610ef99160029182028101918502015b808211156130635760008082556001820155600201613049565b50905600a165627a7a72305820a6465fc1ce7ab1a92906ff7206b23d80a21bbd50b85b4bde6a91f8e6b2e3edde0029" - code_ContractScenario009_deployContainLibraryContract = "608060405234801561001057600080fd5b50610139806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663f207564e8114610045575b600080fd5b34801561005157600080fd5b5061005d60043561005f565b005b73610199610030600b82828239805160001a6073146000811461002057610022565bfe5b5030600052607381538281f300730000000000000000000000000000000000000000301460806040526004361061006d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663483b8a1481146100725780636ce8e081146100a1578063831cb739146100bc575b600080fd5b81801561007e57600080fd5b5061008d6004356024356100d7565b604080519115158252519081900360200190f35b8180156100ad57600080fd5b5061008d600435602435610117565b8180156100c857600080fd5b5061008d60043560243561012d565b60008181526020839052604081205460ff1615156100f757506000610111565b506000818152602083905260409020805460ff1916905560015b92915050565b6000908152602091909152604090205460ff1690565b60008181526020839052604081205460ff161561014c57506000610111565b50600090815260209190915260409020805460ff19166001908117909155905600a165627a7a723058200bc4068752b78840d32288f8eeffe2618c356d76fe09451d92f808cf28d4d22e0029" - code_ContractScenario010_deployContainLibraryContract = "608060405234801561001057600080fd5b50610731806100206000396000f3006080604052600436106100a35763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100a8578063095ea7b31461013257806318160ddd146101585780632f745c591461017f5780636352211e146101a35780636914db60146101d757806370a08231146101ef57806395d89b4114610210578063a9059cbb14610225578063b2e6ceeb14610249575b600080fd5b3480156100b457600080fd5b506100bd610261565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013e57600080fd5b50610156600160a060020a0360043516602435610298565b005b34801561016457600080fd5b5061016d61032d565b60408051918252519081900360200190f35b34801561018b57600080fd5b5061016d600160a060020a0360043516602435610336565b3480156101af57600080fd5b506101bb60043561035e565b60408051600160a060020a039092168252519081900360200190f35b3480156101e357600080fd5b506100bd600435610397565b3480156101fb57600080fd5b5061016d600160a060020a0360043516610438565b34801561021c57600080fd5b506100bd610453565b34801561023157600080fd5b50610156600160a060020a036004351660243561048a565b34801561025557600080fd5b5061015660043561059d565b60408051808201909152601181527f54726f6e2045524337323120546f6b656e000000000000000000000000000000602082015290565b6102a18161035e565b600160a060020a031633146102b557600080fd5b33600160a060020a03831614156102cb57600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020859055805185815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35050565b64e8d4a5100090565b600160a060020a03919091166000908152600460209081526040808320938352929052205490565b60008181526002602052604081205460ff16151561037b57600080fd5b50600090815260016020526040902054600160a060020a031690565b60008181526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b50505050509050919050565b600160a060020a031660009081526020819052604090205490565b60408051808201909152600581527f5437323154000000000000000000000000000000000000000000000000000000602082015290565b6000818152600260205260408120543391849160ff1615156104ab57600080fd5b6104b48461035e565b600160a060020a038481169116146104cb57600080fd5b600160a060020a0383811690831614156104e457600080fd5b600160a060020a03821615156104f957600080fd5b508161050581856106a7565b600160a060020a0381811660008181526020818152604080832080546000190190558883526001808352818420805473ffffffffffffffffffffffffffffffffffffffff19169689169687179055858452838352928190208054909301909255815188815291517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050505050565b600081815260026020526040812054819060ff1615156105bc57600080fd5b6105c58361035e565b9150339050600160a060020a0382168114156105e057600080fd5b600160a060020a03808316600090815260036020908152604080832093851683529290522054831461061157600080fd5b600160a060020a0382811660008181526020818152604080832080546000190190558783526001808352818420805473ffffffffffffffffffffffffffffffffffffffff19169688169687179055858452838352928190208054909301909255815187815291517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505050565b60005b600160a060020a0383166000908152600460209081526040808320848452909152902054821461070057600160a060020a03831660009081526004602090815260408083208484529091528120556001016106aa565b5050505600a165627a7a72305820d3ca2ca957b72f4c5028c633a6ad4bafe13572bf949793fabe72e34eb640d2c50029" - code_ContractScenario012_deployTransactionCoin = "60806040526000805561029f806100176000396000f3006080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166312065fe0811461009d5780632e52d606146100b7578063483f5a7f146100cc5780634f8632ba146100e25780635896476c146101135780638b47145f14610128578063b6b55f2514610144578063f46771d91461014f578063ff18253b14610163575b600080fd5b6100a561019b565b60408051918252519081900360200190f35b3480156100c357600080fd5b506100a56101a0565b6100e0600160a060020a03600435166101a6565b005b3480156100ee57600080fd5b506100f76101df565b60408051600160a060020a039092168252519081900360200190f35b34801561011f57600080fd5b506100e06101ee565b6101306101f9565b604080519115158252519081900360200190f35b610130600435610217565b6100e0600160a060020a036004351661023a565b34801561016f57600080fd5b5061017861026c565b60408051600160a060020a03909316835260208301919091528051918290030190f35b303190565b60005481565b604051600160a060020a038216903480156108fc02916000818181858888f193505050501580156101db573d6000803e3d6000fd5b5050565b600154600160a060020a031681565b600080546001019055565b6040516000903390829060019082818181858883f194505050505090565b604051600090339083156108fc0290849084818181858888f19695505050505050565b604051600160a060020a0382169060009060059082818181858883f193505050501580156101db573d6000803e3d6000fd5b33803190915600a165627a7a72305820fd081d59bd77b97252e4a657177023ae7352e1fe802dd638ec6b9fa5df59d6110029" - code_ContractScenario013_deployTronTrxAndSunContract = "6080604052348015600f57600080fd5b50600180141515601e57600080fd5b603c80141515602c57600080fd5b610e1080141515603b57600080fd5b6201518080141515604b57600080fd5b62093a8080141515605b57600080fd5b6301e1338080141515606c57600080fd5b620f424080141515607c57600080fd5b60358060896000396000f3006080604052600080fd00a165627a7a723058206a36395ee2292959a89e7956d6826a7107c490331e4505fc319010873c26392b0029" - code_ContractScenario013_triggerTronTrxAndSunContract = "608060405234801561001057600080fd5b5061011a806100206000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806316ada547146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b6000600180141515607c57600080fd5b603c80141515608a57600080fd5b610e1080141515609957600080fd5b620151808014151560a957600080fd5b62093a808014151560b957600080fd5b6301e133808014151560ca57600080fd5b620f42408014151560da57600080fd5b60018014151560e857600080fd5b429050905600a165627a7a72305820eacfee595582d9244a2fb5f052905bd240f87864fb8f602f85fd31fe3b89cda80029" - code_ContractScenario014_testTripleTrigger = "608060405260d2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633d96d24c81146043575b600080fd5b606273ffffffffffffffffffffffffffffffffffffffff600435166064565b005b60405173ffffffffffffffffffffffffffffffffffffffff82169060009060059082818181858883f1935050505015801560a2573d6000803e3d6000fd5b50505600a165627a7a72305820e2d0e2bbf60a802771a52693e71a934ef01e5c5f6a584b5a3f24f5088866de4d0029" - code1_ContractScenario014_testTripleTrigger = "6080604052604051602080610263833981016040525160008054600160a060020a03909216600160a060020a031990921691909117905561021e806100456000396000f30060806040526004361061003d5763ffffffff60e060020a600035041663b3b638ab8114610042578063df5dd9c814610065578063ecb0b86214610086575b600080fd5b61006373ffffffffffffffffffffffffffffffffffffffff600435166100c4565b005b61006373ffffffffffffffffffffffffffffffffffffffff6004351661014e565b34801561009257600080fd5b5061009b6101d6565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60008054604080517f73656e643553756e546f526563656976657228616464726573732900000000008152815190819003601b01812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff8681166004840152925192909316936024808301939192829003018183875af150505050600080fd5b60008054604080517f73656e643553756e546f526563656976657228616464726573732900000000008152815190819003601b01812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff8681166004840152925192909316936024808301939192829003018183875af15050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a7230582065632ad682ad1abe06031e0f1471af18b8caeaddc98c67de6765b9f01ce8aa320029" - code2_ContractScenario014_testTripleTrigger = "60806040526040516020806101df833981016040525160008054600160a060020a03909216600160a060020a031990921691909117905561019a806100456000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025750698114610050578063ecb0b86214610073575b600080fd5b61007173ffffffffffffffffffffffffffffffffffffffff600435166100b1565b005b34801561007f57600080fd5b50610088610152565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60008054604080517f74726967676572436f6e747261637431286164647265737329000000000000008152815190819003601901812063ffffffff7c010000000000000000000000000000000000000000000000000000000091829004908116909102825273ffffffffffffffffffffffffffffffffffffffff8681166004840152925192909316936024808301939192829003018183875af15050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058205a66bc83322abbfb01da52698e6f5a6b2ca2ff7c17793c1ff9db3a6c7e7f6cb10029" - code_TronDice_tronDice = "6080604052620ef420600155600060678190558054600160a060020a03191633179055610699806100316000396000f3006080604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633ccfd60b81146100875780638da5cb5b146100ae578063acfff377146100df578063d0e30db0146100ea578063d263b7eb146100f4578063f2fde38b14610109578063fd2ba8b01461012a575b600080fd5b34801561009357600080fd5b5061009c61013f565b60408051918252519081900360200190f35b3480156100ba57600080fd5b506100c3610221565b60408051600160a060020a039092168252519081900360200190f35b61009c600435610230565b6100f26104b8565b005b34801561010057600080fd5b506100f2610504565b34801561011557600080fd5b506100f2600160a060020a0360043516610529565b34801561013657600080fd5b5061009c6105bd565b3360009081526002602052604081205481811161015b57600080fd5b336000818152600260205260408082208290555183156108fc0291849190818181858888f19350505050151561019057600080fd5b33600360646067548115156101a157fe5b06606481106101ac57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055606780546001019055604080513381526020810183905281517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364929181900390910190a1919050565b600054600160a060020a031681565b600080600080600080600080600060618a10801561024e575060018a115b151561025957600080fd5b620f42403410158015610270575064174876e80034105b151561027b57600080fd5b336003606460675481151561028c57fe5b066064811061029757fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556067805460010190553497504360001901409650600360648806606481106102e757fe5b015460675460408051600160a060020a039093168a81014182019081014201909301845290519283900360200190922091975095506064900660010193508984101561045c576103388a60016105d0565b9250610346600154846105e4565b91507fdef9eb05d56d654703e420fad711aa89f7a03dc78c4d1c9a9d6d2548dad540653031610377846127106105e4565b60408051928352349190910260208301528051918290030190a161039d826127106105e4565b34023031116103ab57600080fd5b6103c06103b88984610622565b6127106105e4565b336000908152600260205260409020549091506103dd9082610646565b3360008181526002602090815260409182902093909355805191825234928201929092528082018c9052606081018690526080810185905260a0810184905260c0810183905260e081018a905290517fec1c9e10dd62d178aa9c345b3dc5e131cd479d8388331e77b668a16b8f95bdc0918190036101000190a16104aa565b604080513381523460208201528082018c905260608101869052608081018a905290517fc16d5d73a3ed9d2611bf92d1b1bcfa0568410a9b7c94ba5c70135d3a4657a8989181900360a00190a15b509198975050505050505050565b600054600160a060020a031633146104cf57600080fd5b6040805134815290517f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269181900360200190a1565b600054600160a060020a0316331461051b57600080fd5b600054600160a060020a0316ff5b600054600160a060020a0316331461054057600080fd5b600160a060020a038116151561055557600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526002602052604090205490565b60006105de8383111561065e565b50900390565b6000806105f36000841161065e565b82848115156105fe57fe5b04905061061b838581151561060f57fe5b0682850201851461065e565b9392505050565b600082820261061b841580610641575083858381151561063e57fe5b04145b61065e565b600082820161061b8482108015906106415750838210155b80151561066a57600080fd5b505600a165627a7a7230582094b570d711e59ef03fa2e2ac5e6b4b46cd0bec830c732bc75460783f0392ea000029" - code_TvmContract_deployErc721CryptoKitties = "606060409081526002805460a060020a60ff02191690556101c090519081016040908152603c82526078602083015261012c9082015261025860608201526107086080820152610e1060a0820152611c2060c082015261384060e082015261708061010082015261e100610120820152620151806101408201526202a3006101608201526205460061018082015262093a806101a0820152620000a790600390600e620004e4565b50600f60055566071afd498d0000600e553415620000c457600080fd5b6002805460008054600160a060020a033316600160a060020a03199182168117835560a060020a60ff02199093167401000000000000000000000000000000000000000017169091179091556200012f90808060001981640100000000620028f06200013682021704565b5062000649565b6000806200014362000587565b600063ffffffff891689146200015857600080fd5b63ffffffff881688146200016b57600080fd5b61ffff871687146200017c57600080fd5b600287049250600d8361ffff1611156200019557600d92505b61010060405190810160409081528782526001604060020a0342166020830152600090820181905263ffffffff808c1660608401528a16608083015260a082015261ffff80851660c0830152881660e082015260068054919350600191808301620002018382620005cb565b6000928352602090922085916002020181518155602082015160018201805467ffffffffffffffff19166001604060020a039290921691909117905560408201518160010160086101000a8154816001604060020a0302191690836001604060020a0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e08201516001909101805461ffff929092167e0100000000000000000000000000000000000000000000000000000000000002600160f060020a039092169190911790555003905063ffffffff811681146200035e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168651604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a1620003ef60008683640100000000620025e0620003fb82021704565b98975050505050505050565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a03191690911790558316156200048f57600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b600283019183908215620005755791602002820160005b838211156200054157835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620004fb565b8015620005735782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000541565b505b5062000583929150620005ff565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005fa57600202816002028360005260206000209182019101620005fa919062000626565b505050565b6200062391905b808211156200058357805463ffffffff1916815560010162000606565b90565b6200062391905b808211156200058357600080825560018201556002016200062d565b61309380620006596000396000f3006060604052600436106102a55763ffffffff60e060020a60003504166301ffc9a781146102dd5780630519ce79146103295780630560ff441461035857806305e45546146103f157806306fdde0314610416578063095ea7b3146104295780630a0f81681461044b5780630e583df01461045e57806314001f4c1461047157806318160ddd14610490578063183a7947146104a35780631940a936146104b657806319c2f201146104cc57806321717ebf146104df57806323b872dd146104f257806324e7a38a1461051a57806327d7874c146105395780632ba73c15146105585780633d7d3f5a146105775780633f4ba83a1461059657806346116e6f146105a957806346d22c70146105bf578063481af3d3146105d85780634ad8c938146105ee5780634b85fd551461060d5780634dfff04f146106235780634e0a33791461064557806356129134146106645780635663896e146106865780635c975abb1461069c5780635fd8c710146106af5780636352211e146106c2578063680eba27146106d85780636af04a57146106eb5780636fbde40d146106fe57806370a082311461071d578063715879881461073c5780637a7d49371461075b5780638456cb591461076e5780638462151c1461078157806388c2a0bf146107f357806391876e571461080957806395d89b411461081c5780639d6fac6f1461082f578063a45f4bfc1461085e578063a9059cbb14610874578063b047fb5014610896578063b0c35c05146108a9578063bc4006f5146108bc578063c3bea9af146108cf578063d3e6f49f146108e5578063defb9584146108fb578063e17b25af1461090e578063e6cbe3511461092d578063e98b7f4d14610940578063ed60ade6146109ae578063f1ca9410146109bc578063f2b47d52146109cf578063f7d8c883146109e2575b600b5433600160a060020a03908116911614806102d05750600c5433600160a060020a039081169116145b15156102db57600080fd5b005b34156102e857600080fd5b6103157fffffffff00000000000000000000000000000000000000000000000000000000600435166109f0565b604051901515815260200160405180910390f35b341561033457600080fd5b61033c610c77565b604051600160a060020a03909116815260200160405180910390f35b341561036357600080fd5b61037a600480359060248035908101910135610c86565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103b657808201518382015260200161039e565b50505050905090810190601f1680156103e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103fc57600080fd5b610404610d63565b60405190815260200160405180910390f35b341561042157600080fd5b61037a610d69565b341561043457600080fd5b6102db600160a060020a0360043516602435610da0565b341561045657600080fd5b61033c610e2a565b341561046957600080fd5b610404610e39565b341561047c57600080fd5b6102db600160a060020a0360043516610e44565b341561049b57600080fd5b610404610ef1565b34156104ae57600080fd5b610404610efc565b34156104c157600080fd5b610315600435610f02565b34156104d757600080fd5b610404610f47565b34156104ea57600080fd5b61033c610f4e565b34156104fd57600080fd5b6102db600160a060020a0360043581169060243516604435610f5d565b341561052557600080fd5b6102db600160a060020a0360043516610fe4565b341561054457600080fd5b6102db600160a060020a0360043516611091565b341561056357600080fd5b6102db600160a060020a03600435166110e3565b341561058257600080fd5b6102db600435602435604435606435611135565b34156105a157600080fd5b6102db611214565b34156105b457600080fd5b61033c6004356112ac565b34156105ca57600080fd5b6103156004356024356112c7565b34156105e357600080fd5b61033c600435611347565b34156105f957600080fd5b6102db600435602435604435606435611362565b341561061857600080fd5b6102db600435611428565b341561062e57600080fd5b6102db600160a060020a0360043516602435611448565b341561065057600080fd5b6102db600160a060020a03600435166114a2565b341561066f57600080fd5b6102db600435600160a060020a03602435166114f4565b341561069157600080fd5b6102db600435611560565b34156106a757600080fd5b6103156115c8565b34156106ba57600080fd5b6102db6115d8565b34156106cd57600080fd5b61033c600435611649565b34156106e357600080fd5b61040461166d565b34156106f657600080fd5b61033c611673565b341561070957600080fd5b6102db600160a060020a0360043516611682565b341561072857600080fd5b610404600160a060020a036004351661172f565b341561074757600080fd5b6102db600160a060020a036004351661174a565b341561076657600080fd5b6104046117d8565b341561077957600080fd5b6102db6117de565b341561078c57600080fd5b6107a0600160a060020a036004351661186a565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156107df5780820151838201526020016107c7565b505050509050019250505060405180910390f35b34156107fe57600080fd5b61040460043561194b565b341561081457600080fd5b6102db611c1b565b341561082757600080fd5b61037a611d0e565b341561083a57600080fd5b610845600435611d45565b60405163ffffffff909116815260200160405180910390f35b341561086957600080fd5b61033c600435611d72565b341561087f57600080fd5b6102db600160a060020a0360043516602435611d8d565b34156108a157600080fd5b61033c611e30565b34156108b457600080fd5b610404611e3f565b34156108c757600080fd5b61033c611e45565b34156108da57600080fd5b6102db600435611e54565b34156108f057600080fd5b610315600435611f47565b341561090657600080fd5b610404612010565b341561091957600080fd5b6102db600160a060020a0360043516612016565b341561093857600080fd5b61033c612053565b341561094b57600080fd5b610956600435612062565b6040519915158a5297151560208a01526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390f35b6102db6004356024356121c3565b34156109c757600080fd5b610404612316565b34156109da57600080fd5b61033c61231c565b6102db60043560243561232b565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610c6f57506040517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152601d0160405180910390206040517f746f6b656e734f664f776e657228616464726573732900000000000000000000815260160160405180910390206040517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602082015260250160405180910390206040517f7472616e7366657228616464726573732c75696e743235362900000000000000815260190160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390206040517f62616c616e63654f662861646472657373290000000000000000000000000000815260120160405180910390206040517f746f74616c537570706c792829000000000000000000000000000000000000008152600d0160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d652829000000000000000000000000000000000000000000000000000081526006016040518091039020181818181818181818600160e060020a03191682600160e060020a031916145b90505b919050565b600154600160a060020a031681565b610c8e612fa0565b610c96612fb2565b600d54600090600160a060020a03161515610cb057600080fd5b600d54600160a060020a031663cb4799f2878787600060405160a0015260405160e060020a63ffffffff861602815260048101848152604060248301908152604483018490529091606401848480828437820191505094505050505060a060405180830381600087803b1515610d2557600080fd5b6102c65a03f11515610d3657600080fd5b50505060405180608001805160209091016040529092509050610d59828261251d565b9695505050505050565b60115481565b60408051908101604052600d81527f43727970746f4b69747469657300000000000000000000000000000000000000602082015281565b60025460a060020a900460ff1615610db757600080fd5b610dc13382612572565b1515610dcc57600080fd5b610dd68183612592565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b600054600160a060020a031681565b662386f26fc1000081565b6000805433600160a060020a03908116911614610e6057600080fd5b5080600160a060020a0381166376190f8f6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ea857600080fd5b6102c65a03f11515610eb957600080fd5b505050604051805190501515610ece57600080fd5b600c8054600160a060020a031916600160a060020a039290921691909117905550565b600654600019015b90565b600f5481565b6000808211610f1057600080fd5b6006805483908110610f1e57fe5b600091825260209091206002909102016001015460c060020a900463ffffffff16151592915050565b6201518081565b600c54600160a060020a031681565b60025460a060020a900460ff1615610f7457600080fd5b600160a060020a0382161515610f8957600080fd5b30600160a060020a031682600160a060020a031614151515610faa57600080fd5b610fb433826125c0565b1515610fbf57600080fd5b610fc98382612572565b1515610fd457600080fd5b610fdf8383836125e0565b505050565b6000805433600160a060020a0390811691161461100057600080fd5b5080600160a060020a0381166354c15b826000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561104857600080fd5b6102c65a03f1151561105957600080fd5b50505060405180519050151561106e57600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b60005433600160a060020a039081169116146110ac57600080fd5b600160a060020a03811615156110c157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146110fe57600080fd5b600160a060020a038116151561111357600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60025460a060020a900460ff161561114c57600080fd5b6111563385612572565b151561116157600080fd5b61116a84610f02565b1561117457600080fd5b600b5461118b908590600160a060020a0316612592565b600b54600160a060020a03166327ebe40a858585853360405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b15156111fa57600080fd5b6102c65a03f1151561120b57600080fd5b50505050505050565b60005433600160a060020a0390811691161461122f57600080fd5b60025460a060020a900460ff16151561124757600080fd5b600b54600160a060020a0316151561125e57600080fd5b600c54600160a060020a0316151561127557600080fd5b601054600160a060020a0316151561128c57600080fd5b601354600160a060020a0316156112a257600080fd5b6112aa6126c8565b565b600a60205260009081526040902054600160a060020a031681565b600080808085116112d757600080fd5b600084116112e457600080fd5b60068054869081106112f257fe5b9060005260206000209060020201915060068481548110151561131157fe5b9060005260206000209060020201905061132d8286838761271b565b801561133e575061133e848661289b565b95945050505050565b600960205260009081526040902054600160a060020a031681565b60025460a060020a900460ff161561137957600080fd5b6113833385612572565b151561138e57600080fd5b61139784611f47565b15156113a257600080fd5b600c546113b9908590600160a060020a0316612592565b600c54600160a060020a03166327ebe40a858585853360405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b15156111fa57600080fd5b60025433600160a060020a0390811691161461144357600080fd5b600e55565b60025460a060020a900460ff161561145f57600080fd5b6114693382612572565b151561147457600080fd5b6000908152600a602052604090208054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146114bd57600080fd5b600160a060020a03811615156114d257600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60025460009033600160a060020a0390811691161461151257600080fd5b5080600160a060020a03811615156115325750600254600160a060020a03165b601154611388901061154357600080fd5b60118054600101905561155a6000808086856128f0565b50505050565b60025433600160a060020a039081169116148061158b575060005433600160a060020a039081169116145b806115a4575060015433600160a060020a039081169116145b15156115af57600080fd5b60035463ffffffff1681106115c357600080fd5b600555565b60025460a060020a900460ff1681565b600154600090819033600160a060020a039081169116146115f857600080fd5b30600160a060020a0316319150600e54600f546001010290508082111561164557600154600160a060020a031681830380156108fc0290604051600060405180830381858888f150505050505b5050565b600081815260076020526040902054600160a060020a0316801515610c7257600080fd5b61afc881565b601354600160a060020a031681565b6000805433600160a060020a0390811691161461169e57600080fd5b5080600160a060020a0381166385b861886000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156116e657600080fd5b6102c65a03f115156116f757600080fd5b50505060405180519050151561170c57600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550565b600160a060020a031660009081526008602052604090205490565b60005433600160a060020a0390811691161461176557600080fd5b60025460a060020a900460ff16151561177d57600080fd5b60138054600160a060020a031916600160a060020a0383161790557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051600160a060020a03909116815260200160405180910390a150565b60055481565b60025433600160a060020a0390811691161480611809575060005433600160a060020a039081169116145b80611822575060015433600160a060020a039081169116145b151561182d57600080fd5b60025460a060020a900460ff161561184457600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b611872612fa0565b600061187c612fa0565b600080600061188a8761172f565b94508415156118ba5760006040518059106118a25750595b90808252806020026020018201604052509550611941565b846040518059106118c85750595b908082528060200260200182016040525093506118e3610ef1565b925060009150600190505b82811161193d57600081815260076020526040902054600160a060020a0388811691161415611935578084838151811061192457fe5b602090810290910101526001909101905b6001016118ee565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561197357600080fd5b600680548a90811061198157fe5b60009182526020909120600290910201600181015490975067ffffffffffffffff1615156119ae57600080fd5b611a438761010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612b9c565b1515611a4e57600080fd5b60018701546006805460c060020a90920463ffffffff1697509087908110611a7257fe5b600091825260209091206001808a015460029093029091019081015490965061ffff60f060020a92839004811696509190041684901115611ac057600185015460f060020a900461ffff1693505b6010548754865460018a0154600160a060020a0390931692630d9f5aed92919068010000000000000000900467ffffffffffffffff166000190160006040516020015260405160e060020a63ffffffff86160281526004810193909352602483019190915267ffffffffffffffff166044820152606401602060405180830381600087803b1515611b5057600080fd5b6102c65a03f11515611b6157600080fd5b505050604051805160008b81526007602052604090205460018a810154929650600160a060020a039091169450611bb092508b9160c060020a900463ffffffff1690870161ffff1686866128f0565b6001880180547bffffffff00000000000000000000000000000000000000000000000019169055600f8054600019019055600e54909150600160a060020a0333169080156108fc0290604051600060405180830381858888f150939c9b505050505050505050505050565b60025433600160a060020a0390811691161480611c46575060005433600160a060020a039081169116145b80611c5f575060015433600160a060020a039081169116145b1515611c6a57600080fd5b600b54600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611ca957600080fd5b6102c65a03f11515611cba57600080fd5b5050600c54600160a060020a03169050635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611cfd57600080fd5b6102c65a03f11515610fdf57600080fd5b60408051908101604052600281527f434b000000000000000000000000000000000000000000000000000000000000602082015281565b600381600e8110611d5257fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600760205260009081526040902054600160a060020a031681565b60025460a060020a900460ff1615611da457600080fd5b600160a060020a0382161515611db957600080fd5b30600160a060020a031682600160a060020a031614151515611dda57600080fd5b600b54600160a060020a0383811691161415611df557600080fd5b600c54600160a060020a0383811691161415611e1057600080fd5b611e1a3382612572565b1515611e2557600080fd5b6116453383836125e0565b600254600160a060020a031681565b600e5481565b600d54600160a060020a031681565b60025460009033600160a060020a03908116911614611e7257600080fd5b60125461afc89010611e8357600080fd5b611e92600080600085306128f0565b600b54909150611eac908290600160a060020a0316612592565b600b54600160a060020a03166327ebe40a82611ec6612bd4565b6000620151803060405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152600160a060020a0316608482015260a401600060405180830381600087803b1515611f2657600080fd5b6102c65a03f11515611f3757600080fd5b5050601280546001019055505050565b600080808311611f5657600080fd5b6006805484908110611f6457fe5b906000526020600020906002020190506120098161010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b9392505050565b61138881565b60005433600160a060020a0390811691161461203157600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600b54600160a060020a031681565b600080600080600080600080600080600060068c81548110151561208257fe5b906000526020600020906002020190508060010160189054906101000a900463ffffffff1663ffffffff16600014159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b60025460009060a060020a900460ff16156121dd57600080fd5b6121e73383612572565b15156121f257600080fd5b6121fb82611f47565b151561220657600080fd5b6122108284612cb9565b151561221b57600080fd5b600c54600160a060020a031663c55d0f568460006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561226c57600080fd5b6102c65a03f1151561227d57600080fd5b5050506040518051600e549092508201341015905061229b57600080fd5b600c54600e54600160a060020a039091169063454a2ab39034038560405160e060020a63ffffffff851602815260048101919091526024016000604051808303818588803b15156122eb57600080fd5b6125ee5a03f115156122fc57600080fd5b50505050610fdf8263ffffffff168463ffffffff16612d08565b60125481565b601054600160a060020a031681565b600254600090819060a060020a900460ff161561234757600080fd5b600e5434101561235657600080fd5b6123603385612572565b151561236b57600080fd5b612375838561289b565b151561238057600080fd5b600680548590811061238e57fe5b906000526020600020906002020191506124338261010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b151561243e57600080fd5b600680548490811061244c57fe5b906000526020600020906002020190506124f18161010060405190810160409081528254825260019092015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152612c82565b15156124fc57600080fd5b6125088285838661271b565b151561251357600080fd5b61155a8484612d08565b612525612fa0565b61252d612fa0565b6000808460405180591061253e5750595b818152601f19601f8301168101602001604052905092505060208201905084612568828287612e72565b5090949350505050565b600090815260076020526040902054600160a060020a0391821691161490565b6000918252600960205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260096020526040902054600160a060020a0391821691161490565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a031916909117905583161561267357600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60005433600160a060020a039081169116146126e357600080fd5b60025460a060020a900460ff1615156126fb57600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b60008184141561272d57506000612893565b6001850154608060020a900463ffffffff1682148061275c5750600185015460a060020a900463ffffffff1682145b1561276957506000612893565b6001830154608060020a900463ffffffff168414806127985750600183015460a060020a900463ffffffff1684145b156127a557506000612893565b6001830154608060020a900463ffffffff1615806127d257506001850154608060020a900463ffffffff16155b156127df57506001612893565b60018581015490840154608060020a9182900463ffffffff9081169290910416148061282a575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b1561283757506000612893565b6001808601549084015460a060020a900463ffffffff908116608060020a90920416148061288257506001858101549084015460a060020a9182900463ffffffff9081169290910416145b1561288f57506000612893565b5060015b949350505050565b6000818152600760205260408082205484835290822054600160a060020a0391821691168082148061133e57506000858152600a6020526040902054600160a060020a03908116908316149250505092915050565b6000806128fb612fdb565b600063ffffffff8916891461290f57600080fd5b63ffffffff8816881461292157600080fd5b61ffff8716871461293157600080fd5b600287049250600d8361ffff16111561294957600d92505b610100604051908101604090815287825267ffffffffffffffff42166020830152600090820181905263ffffffff808c1660608401528a16608083015260a082015261ffff80851660c0830152881660e0820152600680549193506001918083016129b4838261301f565b6000928352602090922085916002020181518155602082015160018201805467ffffffffffffffff191667ffffffffffffffff9290921691909117905560408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e08201516001909101805461ffff9290921660f060020a027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003905063ffffffff81168114612b0f57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168651604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a1612b90600086836125e0565b98975050505050505050565b60008160a0015163ffffffff1615801590610c6f57504367ffffffffffffffff16826040015167ffffffffffffffff16111592915050565b600b5460009081908190600160a060020a031663eac9d94c82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612c2257600080fd5b6102c65a03f11515612c3357600080fd5b50505060405180519250506fffffffffffffffffffffffffffffffff82168214612c5c57600080fd5b50600281048101662386f26fc10000811015612c7c5750662386f26fc100005b92915050565b60008160a0015163ffffffff16158015610c6f57504367ffffffffffffffff16826040015167ffffffffffffffff16111592915050565b6000806000600685815481101515612ccd57fe5b90600052602060002090600202019150600684815481101515612cec57fe5b9060005260206000209060020201905061133e8286838761271b565b600080600683815481101515612d1a57fe5b90600052602060002090600202019150600684815481101515612d3957fe5b600091825260209091206002909102016001810180547bffffffff000000000000000000000000000000000000000000000000191660c060020a63ffffffff8716021790559050612d8982612eb7565b612d9281612eb7565b6000848152600a602090815260408083208054600160a060020a031990811690915586845281842080549091169055600f8054600190810190915587845260079092529182902054908301547f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b8092600160a060020a0390921691879187916801000000000000000090910467ffffffffffffffff1690518085600160a060020a0316600160a060020a031681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210612e985782518452602084019350602083019250602082039150612e75565b6001826020036101000a03905080198351168185511617909352505050565b600554600182015443919060039060e060020a900461ffff16600e8110612eda57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811515612f0557fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60e060020a90910461ffff161015612f9d576001818101805461ffff60e060020a8083048216909401169092027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b50565b60206040519081016040526000815290565b60806040519081016040526004815b60008152600019919091019060200181612fc15790505090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511610fdf57600083815260209020610fdf91610ef99160029182028101918502015b808211156130635760008082556001820155600201613049565b50905600a165627a7a72305820a6465fc1ce7ab1a92906ff7206b23d80a21bbd50b85b4bde6a91f8e6b2e3edde0029" - code_ContractScenario011_deployErc721KittyCore = "6002805460a060020a60ff0219169055610240604052603c6080908152607860a05261012c60c05261025860e05261070861010052610e1061012052611c2061014052613840610160526170806101805261e1006101a052620151806101c0526202a3006101e052620546006102005262093a80610220526200008790600390600e620004e3565b50600f6005556301312d00600e55348015620000a257600080fd5b506002805460008054600160a060020a031990811633908117835560a060020a60ff0219909316740100000000000000000000000000000000000000001716909117909155620001019080806000198164010000000062000108810204565b50620005f1565b6000806200011562000586565b600063ffffffff891689146200012a57600080fd5b63ffffffff881688146200013d57600080fd5b61ffff871687146200014e57600080fd5b600287049250600d8361ffff1611156200016757600d92505b505060408051610100810182528581524267ffffffffffffffff90811660208301908152600093830184815263ffffffff8c8116606086019081528c82166080870190815260a0870188815261ffff8a811660c08a019081528f821660e08b01908152600680546001810182559c528a517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60028e029081019190915598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909901805498519651955194519251915167ffffffffffffffff19909916998b1699909917604060020a608060020a0319166801000000000000000096909a169590950298909817608060020a63ffffffff021916700100000000000000000000000000000000938616939093029290921760a060020a63ffffffff02191674010000000000000000000000000000000000000000918516919091021760c060020a63ffffffff0219167801000000000000000000000000000000000000000000000000968416969096029590951760e060020a61ffff0219167c01000000000000000000000000000000000000000000000000000000009186169190910217600160f060020a03167e010000000000000000000000000000000000000000000000000000000000009290941691909102929092179055909190811681146200036f57600080fd5b606080830151608080850151855160408051600160a060020a038c1681526020810188905263ffffffff95861681830152929094169482019490945290810192909252517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1620003f46000868364010000000062000400810204565b98975050505050505050565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a03191690911790558316156200049457600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600283019183908215620005745791602002820160005b838211156200054057835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620004fa565b8015620005725782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000540565b505b5062000582929150620005ca565b5090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b620005ee91905b808211156200058257805463ffffffff19168155600101620005d1565b90565b6130f380620006016000396000f3006080604052600436106102a55763ffffffff60e060020a60003504166301ffc9a781146102d55780630519ce79146103205780630560ff441461035157806305e45546146103ea57806306fdde0314610411578063095ea7b3146104265780630a0f81681461044a5780630e583df01461045f57806314001f4c1461047457806318160ddd14610495578063183a7947146104aa5780631940a936146104bf57806319c2f201146104d757806321717ebf146104ec57806323b872dd1461050157806324e7a38a1461052b57806327d7874c1461054c5780632ba73c151461056d5780633d7d3f5a1461058e5780633f4ba83a146105af57806346116e6f146105c457806346d22c70146105dc578063481af3d3146105f75780634ad8c9381461060f5780634b85fd55146106305780634dfff04f146106485780634e0a33791461066c578063561291341461068d5780635663896e146106b15780635c975abb146106c95780635fd8c710146106de5780636352211e146106f3578063680eba271461070b5780636af04a57146107205780636fbde40d1461073557806370a082311461075657806371587988146107775780637a7d4937146107985780638456cb59146107ad5780638462151c146107c257806388c2a0bf1461083357806391876e571461084b57806395d89b41146108605780639d6fac6f14610875578063a45f4bfc146108a6578063a9059cbb146108be578063b047fb50146108e2578063b0c35c05146108f7578063bc4006f51461090c578063c3bea9af14610921578063d3e6f49f14610939578063defb958414610951578063e17b25af14610966578063e6cbe35114610987578063e98b7f4d1461099c578063ed60ade614610a06578063f1ca941014610a14578063f2b47d5214610a29578063f7d8c88314610a3e575b600b54600160a060020a03163314806102c85750600c54600160a060020a031633145b15156102d357600080fd5b005b3480156102e157600080fd5b5061030c7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610a4c565b604080519115158252519081900360200190f35b34801561032c57600080fd5b50610335610cdf565b60408051600160a060020a039092168252519081900360200190f35b34801561035d57600080fd5b50610375600480359060248035908101910135610cee565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506103ff610df1565b60408051918252519081900360200190f35b34801561041d57600080fd5b50610375610df7565b34801561043257600080fd5b506102d3600160a060020a0360043516602435610e2e565b34801561045657600080fd5b50610335610eb0565b34801561046b57600080fd5b506103ff610ebf565b34801561048057600080fd5b506102d3600160a060020a0360043516610ec6565b3480156104a157600080fd5b506103ff610f79565b3480156104b657600080fd5b506103ff610f83565b3480156104cb57600080fd5b5061030c600435610f89565b3480156104e357600080fd5b506103ff610fce565b3480156104f857600080fd5b50610335610fd5565b34801561050d57600080fd5b506102d3600160a060020a0360043581169060243516604435610fe4565b34801561053757600080fd5b506102d3600160a060020a0360043516611060565b34801561055857600080fd5b506102d3600160a060020a0360043516611113565b34801561057957600080fd5b506102d3600160a060020a0360043516611161565b34801561059a57600080fd5b506102d36004356024356044356064356111af565b3480156105bb57600080fd5b506102d36112a4565b3480156105d057600080fd5b50610335600435611338565b3480156105e857600080fd5b5061030c600435602435611353565b34801561060357600080fd5b506103356004356113d3565b34801561061b57600080fd5b506102d36004356024356044356064356113ee565b34801561063c57600080fd5b506102d36004356114c6565b34801561065457600080fd5b506102d3600160a060020a03600435166024356114e2565b34801561067857600080fd5b506102d3600160a060020a036004351661153c565b34801561069957600080fd5b506102d3600435600160a060020a036024351661158a565b3480156106bd57600080fd5b506102d36004356115f1565b3480156106d557600080fd5b5061030c61164d565b3480156106ea57600080fd5b506102d361165d565b3480156106ff57600080fd5b506103356004356116c1565b34801561071757600080fd5b506103ff6116e5565b34801561072c57600080fd5b506103356116eb565b34801561074157600080fd5b506102d3600160a060020a03600435166116fa565b34801561076257600080fd5b506103ff600160a060020a03600435166117ad565b34801561078357600080fd5b506102d3600160a060020a03600435166117c8565b3480156107a457600080fd5b506103ff61184b565b3480156107b957600080fd5b506102d3611851565b3480156107ce57600080fd5b506107e3600160a060020a03600435166118d1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561081f578181015183820152602001610807565b505050509050019250505060405180910390f35b34801561083f57600080fd5b506103ff6004356119a3565b34801561085757600080fd5b506102d3611c7f565b34801561086c57600080fd5b50610375611d94565b34801561088157600080fd5b5061088d600435611dcb565b6040805163ffffffff9092168252519081900360200190f35b3480156108b257600080fd5b50610335600435611df8565b3480156108ca57600080fd5b506102d3600160a060020a0360043516602435611e13565b3480156108ee57600080fd5b50610335611eab565b34801561090357600080fd5b506103ff611eba565b34801561091857600080fd5b50610335611ec0565b34801561092d57600080fd5b506102d3600435611ecf565b34801561094557600080fd5b5061030c600435611fb9565b34801561095d57600080fd5b506103ff612088565b34801561097257600080fd5b506102d3600160a060020a036004351661208e565b34801561099357600080fd5b506103356120c7565b3480156109a857600080fd5b506109b46004356120d6565b604080519a15158b5298151560208b0152898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6102d3600435602435612237565b348015610a2057600080fd5b506103ff6123d1565b348015610a3557600080fd5b506103356123d7565b6102d36004356024356123e6565b604080517f737570706f727473496e74657266616365286279746573342900000000000000815290519081900360190190206000907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1983811691161480610cd75750604080517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152815190819003601d0181207f746f6b656e734f664f776e657228616464726573732900000000000000000000825282519182900360160182207f7472616e7366657246726f6d28616464726573732c616464726573732c75696e83527f7432353629000000000000000000000000000000000000000000000000000000602084015283519283900360250183207f7472616e7366657228616464726573732c75696e743235362900000000000000845284519384900360190184207f617070726f766528616464726573732c75696e74323536290000000000000000855285519485900360180185207f6f776e65724f662875696e743235362900000000000000000000000000000000865286519586900360100186207f62616c616e63654f662861646472657373290000000000000000000000000000875287519687900360120187207f746f74616c537570706c792829000000000000000000000000000000000000008852885197889003600d0188207f73796d626f6c2829000000000000000000000000000000000000000000000000895289519889900360080189207f6e616d65282900000000000000000000000000000000000000000000000000008a529951988990036006019098207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198c811691909a189098181818181818181891909116145b90505b919050565b600154600160a060020a031681565b6060610cf8613064565b600d54600090600160a060020a03161515610d1257600080fd5b600d54604080517fcb4799f2000000000000000000000000000000000000000000000000000000008152600481018981526024820192835260448201889052600160a060020a039093169263cb4799f2928a928a928a929091606401848480828437820191505094505050505060a060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525060a0811015610dd257600080fd5b5060808101519092509050610de782826125e4565b9695505050505050565b60115481565b60408051808201909152600d81527f43727970746f4b69747469657300000000000000000000000000000000000000602082015281565b60025460a060020a900460ff1615610e4557600080fd5b610e4f3382612638565b1515610e5a57600080fd5b610e648183612658565b60408051338152600160a060020a038416602082015280820183905290517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360600190a15050565b600054600160a060020a031681565b6298968081565b60008054600160a060020a03163314610ede57600080fd5b81905080600160a060020a03166376190f8f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f1f57600080fd5b505af1158015610f33573d6000803e3d6000fd5b505050506040513d6020811015610f4957600080fd5b50511515610f5657600080fd5b600c8054600160a060020a031916600160a060020a039290921691909117905550565b6006546000190190565b600f5481565b6000808211610f9757600080fd5b6006805483908110610fa557fe5b600091825260209091206002909102016001015460c060020a900463ffffffff16151592915050565b6201518081565b600c54600160a060020a031681565b60025460a060020a900460ff1615610ffb57600080fd5b600160a060020a038216151561101057600080fd5b600160a060020a03821630141561102657600080fd5b6110303382612686565b151561103b57600080fd5b6110458382612638565b151561105057600080fd5b61105b8383836126a6565b505050565b60008054600160a060020a0316331461107857600080fd5b81905080600160a060020a03166354c15b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b505050506040513d60208110156110e357600080fd5b505115156110f057600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b600054600160a060020a0316331461112a57600080fd5b600160a060020a038116151561113f57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a0316331461117857600080fd5b600160a060020a038116151561118d57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60025460a060020a900460ff16156111c657600080fd5b6111d03385612638565b15156111db57600080fd5b6111e484610f89565b156111ee57600080fd5b600b54611205908590600160a060020a0316612658565b600b54604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b5050505050505050565b600054600160a060020a031633146112bb57600080fd5b60025460a060020a900460ff1615156112d357600080fd5b600b54600160a060020a031615156112ea57600080fd5b600c54600160a060020a0316151561130157600080fd5b601054600160a060020a0316151561131857600080fd5b601354600160a060020a03161561132e57600080fd5b611336612788565b565b600a60205260009081526040902054600160a060020a031681565b6000808080851161136357600080fd5b6000841161137057600080fd5b600680548690811061137e57fe5b9060005260206000209060020201915060068481548110151561139d57fe5b906000526020600020906002020190506113b9828683876127d7565b80156113ca57506113ca8486612957565b95945050505050565b600960205260009081526040902054600160a060020a031681565b60025460a060020a900460ff161561140557600080fd5b61140f3385612638565b151561141a57600080fd5b61142384611fb9565b151561142e57600080fd5b600c54611445908590600160a060020a0316612658565b600c54604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561128657600080fd5b600254600160a060020a031633146114dd57600080fd5b600e55565b60025460a060020a900460ff16156114f957600080fd5b6115033382612638565b151561150e57600080fd5b6000908152600a602052604090208054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a0316331461155357600080fd5b600160a060020a038116151561156857600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b600254600090600160a060020a031633146115a457600080fd5b5080600160a060020a03811615156115c45750600254600160a060020a03165b601154611388116115d457600080fd5b6011805460010190556115eb6000808086856129ac565b50505050565b600254600160a060020a03163314806116145750600054600160a060020a031633145b806116295750600154600160a060020a031633145b151561163457600080fd5b60035463ffffffff16811061164857600080fd5b600555565b60025460a060020a900460ff1681565b6001546000908190600160a060020a0316331461167957600080fd5b5050600e54600f54303191600190910102808211156116bd57600154604051600160a060020a039091169082840380156108fc02916000818181858888f150505050505b5050565b600081815260076020526040902054600160a060020a0316801515610cda57600080fd5b61afc881565b601354600160a060020a031681565b60008054600160a060020a0316331461171257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050506040513d602081101561177d57600080fd5b5051151561178a57600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550565b600160a060020a031660009081526008602052604090205490565b600054600160a060020a031633146117df57600080fd5b60025460a060020a900460ff1615156117f757600080fd5b60138054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b60055481565b600254600160a060020a03163314806118745750600054600160a060020a031633145b806118895750600154600160a060020a031633145b151561189457600080fd5b60025460a060020a900460ff16156118ab57600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b60606000606060008060006118e5876117ad565b9450841515611904576040805160008152602081019091529550611999565b8460405190808252806020026020018201604052801561192e578160200160208202803883390190505b509350611939610f79565b925060009150600190505b82811161199557600081815260076020526040902054600160a060020a038881169116141561198d5780848381518110151561197c57fe5b602090810290910101526001909101905b600101611944565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff161515156119cb57600080fd5b600680548a9081106119d957fe5b60009182526020909120600290910201600181015490975067ffffffffffffffff161515611a0657600080fd5b604080516101008101825288548152600189015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152611a9790612c89565b1515611aa257600080fd5b60018701546006805460c060020a90920463ffffffff1697509087908110611ac657fe5b600091825260209091206001808a015460029093029091019081015490965061ffff60f060020a928390048116965091900416841015611b1357600185015460f060020a900461ffff1693505b6010548754865460018a0154604080517f0d9f5aed0000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260001967ffffffffffffffff6801000000000000000090920482160116604483015251600160a060020a0390921691630d9f5aed916064808201926020929091908290030181600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b505050506040513d6020811015611bd757600080fd5b505160008a815260076020526040902054600189810154929550600160a060020a039091169350611c20918b9160c060020a90910463ffffffff1690870161ffff1686866129ac565b6001880180547bffffffff00000000000000000000000000000000000000000000000019169055600f8054600019019055600e54604051919250339181156108fc0291906000818181858888f150939c9b505050505050505050505050565b600254600160a060020a0316331480611ca25750600054600160a060020a031633145b80611cb75750600154600160a060020a031633145b1515611cc257600080fd5b600b60009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d1557600080fd5b505af1158015611d29573d6000803e3d6000fd5b50505050600c60009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d8057600080fd5b505af11580156115eb573d6000803e3d6000fd5b60408051808201909152600281527f434b000000000000000000000000000000000000000000000000000000000000602082015281565b600381600e8110611dd857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600760205260009081526040902054600160a060020a031681565b60025460a060020a900460ff1615611e2a57600080fd5b600160a060020a0382161515611e3f57600080fd5b600160a060020a038216301415611e5557600080fd5b600b54600160a060020a0383811691161415611e7057600080fd5b600c54600160a060020a0383811691161415611e8b57600080fd5b611e953382612638565b1515611ea057600080fd5b6116bd3383836126a6565b600254600160a060020a031681565b600e5481565b600d54600160a060020a031681565b600254600090600160a060020a03163314611ee957600080fd5b60125461afc811611ef957600080fd5b611f08600080600085306129ac565b600b54909150611f22908290600160a060020a0316612658565b600b54600160a060020a03166327ebe40a82611f3c612cb9565b6040805160e060020a63ffffffff861602815260048101939093526024830191909152600060448301819052620151806064840152306084840152905160a48084019382900301818387803b158015611f9457600080fd5b505af1158015611fa8573d6000803e3d6000fd5b505060128054600101905550505050565b600080808311611fc857600080fd5b6006805484908110611fd657fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e082015290915061208190612d7b565b9392505050565b61138881565b600054600160a060020a031633146120a557600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600b54600160a060020a031681565b600080600080600080600080600080600060068c8154811015156120f657fe5b906000526020600020906002020190508060010160189054906101000a900463ffffffff1663ffffffff16600014159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b60025460009060a060020a900460ff161561225157600080fd5b61225b3383612638565b151561226657600080fd5b61226f82611fb9565b151561227a57600080fd5b6122848284612daa565b151561228f57600080fd5b600c54604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156122f657600080fd5b505af115801561230a573d6000803e3d6000fd5b505050506040513d602081101561232057600080fd5b5051600e54909150810134101561233657600080fd5b600c54600e54604080517f454a2ab3000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a039093169263454a2ab39234039160248082019260009290919082900301818588803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b505050505061105b8263ffffffff168463ffffffff16612df9565b60125481565b601054600160a060020a031681565b600254600090819060a060020a900460ff161561240257600080fd5b600e5434101561241157600080fd5b61241b3385612638565b151561242657600080fd5b6124308385612957565b151561243b57600080fd5b600680548590811061244957fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e08201529092506124f490612d7b565b15156124ff57600080fd5b600680548490811061250d57fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e08201529091506125b890612d7b565b15156125c357600080fd5b6125cf828583866127d7565b15156125da57600080fd5b6115eb8484612df9565b606080600080846040519080825280601f01601f191660200182016040528015612618578160200160208202803883390190505b509250506020820190508461262e828287612f37565b5090949350505050565b600090815260076020526040902054600160a060020a0391821691161490565b6000918252600960205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260096020526040902054600160a060020a0391821691161490565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a031916909117905583161561273957600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600054600160a060020a0316331461279f57600080fd5b60025460a060020a900460ff1615156127b757600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b6000818414156127e95750600061294f565b6001850154608060020a900463ffffffff168214806128185750600185015460a060020a900463ffffffff1682145b156128255750600061294f565b6001830154608060020a900463ffffffff168414806128545750600183015460a060020a900463ffffffff1684145b156128615750600061294f565b6001830154608060020a900463ffffffff16158061288e57506001850154608060020a900463ffffffff16155b1561289b5750600161294f565b60018581015490840154608060020a9182900463ffffffff908116929091041614806128e6575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156128f35750600061294f565b6001808601549084015460a060020a900463ffffffff908116608060020a90920416148061293e57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b1561294b5750600061294f565b5060015b949350505050565b6000818152600760205260408082205484835290822054600160a060020a039182169116808214806113ca57506000858152600a6020526040902054600160a060020a03908116908316149250505092915050565b6000806129b7613083565b600063ffffffff891689146129cb57600080fd5b63ffffffff881688146129dd57600080fd5b61ffff871687146129ed57600080fd5b600287049250600d8361ffff161115612a0557600d92505b505060408051610100810182528581524267ffffffffffffffff90811660208301908152600093830184815263ffffffff8c8116606086019081528c82166080870190815260a0870188815261ffff8a811660c08a019081528f821660e08b01908152600680546001810182559c528a517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60028e029081019190915598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909901805498519651955194519251915167ffffffffffffffff19909916998b16999099176fffffffffffffffff000000000000000019166801000000000000000096909a16959095029890981773ffffffff000000000000000000000000000000001916608060020a938616939093029290921777ffffffff0000000000000000000000000000000000000000191660a060020a91851691909102177bffffffff000000000000000000000000000000000000000000000000191660c060020a96841696909602959095177fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a91861691909102177dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f060020a929094169190910292909217905590919081168114612c0357600080fd5b606080830151608080850151855160408051600160a060020a038c1681526020810188905263ffffffff95861681830152929094169482019490945290810192909252517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612c7d600086836126a6565b98975050505050505050565b60008160a0015163ffffffff16600014158015610cd75750506040015167ffffffffffffffff4381169116111590565b6000806000600b60009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1157600080fd5b505af1158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d5d57600080fd5b5060028104810162989680811015612d755750629896805b92915050565b60008160a0015163ffffffff166000148015610cd75750506040015167ffffffffffffffff4381169116111590565b6000806000600685815481101515612dbe57fe5b90600052602060002090600202019150600684815481101515612ddd57fe5b906000526020600020906002020190506113ca828683876127d7565b600080600683815481101515612e0b57fe5b90600052602060002090600202019150600684815481101515612e2a57fe5b600091825260209091206002909102016001810180547bffffffff000000000000000000000000000000000000000000000000191660c060020a63ffffffff8716021790559050612e7a82612f7b565b612e8381612f7b565b6000848152600a602090815260408083208054600160a060020a031990811690915586845281842080549091169055600f80546001908101909155878452600783529281902054928401548151600160a060020a0390941684529183018790528281018690526801000000000000000090910467ffffffffffffffff166060830152517f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80916080908290030190a150505050565b60005b60208210612f5c578251845260209384019390920191601f1990910190612f3a565b50905182516020929092036101000a6000190180199091169116179052565b600554600182015443919060039060e060020a900461ffff16600e8110612f9e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811515612fc957fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60e060020a90910461ffff161015613061576001818101805461ffff60e060020a8083048216909401169092027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b50565b6080604051908101604052806004906020820280388339509192915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152905600a165627a7a723058201424bf1db41fa7ec76f5506a53d8bbcb84ed5b5a6ade2df0bac8deaacb118a8b0029" - code_ContractScenario011_deploySaleClockAuction = "60806040526000805460a060020a60ff02191690556004805460ff1916600117905534801561002d57600080fd5b50604051604080610ee883398101604052805160209091015160008054600160a060020a031916331781558290829061271082111561006b57600080fd5b506002819055604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f9a20483d00000000000000000000000000000000000000000000000000000000600482015290518391600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156100f557600080fd5b505af1158015610109573d6000803e3d6000fd5b505050506040513d602081101561011f57600080fd5b5051151561012c57600080fd5b60018054600160a060020a03909216600160a060020a031990921691909117905550505050610d88806101606000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166327ebe40a81146101005780633f4ba83a1461012f578063454a2ab314610158578063484eccb4146101635780635c975abb1461018d5780635fd8c710146101a257806378bd7935146101b757806383b5ff8b146102045780638456cb591461021957806385b861881461022e578063878eb368146102435780638a98a9cc1461025b5780638da5cb5b1461027057806396b5a755146102a1578063c55d0f56146102b9578063dd1b7a0f146102d1578063eac9d94c146102e6578063f2fde38b146102fb575b600080fd5b34801561010c57600080fd5b5061012d600435602435604435606435600160a060020a036084351661031c565b005b34801561013b57600080fd5b50610144610414565b604080519115158252519081900360200190f35b61012d60043561048f565b34801561016f57600080fd5b5061017b6004356104f9565b60408051918252519081900360200190f35b34801561019957600080fd5b5061014461050d565b3480156101ae57600080fd5b5061012d61051d565b3480156101c357600080fd5b506101cf60043561057a565b60408051600160a060020a03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561021057600080fd5b5061017b610610565b34801561022557600080fd5b50610144610616565b34801561023a57600080fd5b50610144610696565b34801561024f57600080fd5b5061012d60043561069f565b34801561026757600080fd5b5061017b61070c565b34801561027c57600080fd5b50610285610712565b60408051600160a060020a039092168252519081900360200190f35b3480156102ad57600080fd5b5061012d600435610721565b3480156102c557600080fd5b5061017b600435610766565b3480156102dd57600080fd5b50610285610798565b3480156102f257600080fd5b5061017b6107a7565b34801561030757600080fd5b5061012d600160a060020a03600435166107db565b610324610d2e565b6fffffffffffffffffffffffffffffffff8516851461034257600080fd5b6fffffffffffffffffffffffffffffffff8416841461036057600080fd5b67ffffffffffffffff8316831461037657600080fd5b600154600160a060020a0316331461038d57600080fd5b610397828761082d565b60a06040519081016040528083600160a060020a03168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061040c86826108b5565b505050505050565b60008054600160a060020a0316331461042c57600080fd5b60005460a060020a900460ff16151561044457600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a150600190565b600081815260036020526040812054600160a060020a0316906104b28334610a09565b90506104be3384610b2f565b600154600160a060020a03838116911614156104f45760058054829160069106600581106104e857fe5b01556005805460010190555b505050565b6006816005811061050657fe5b0154905081565b60005460a060020a900460ff1681565b60015460008054600160a060020a039283169216331480610546575033600160a060020a038316145b151561055157600080fd5b604051600160a060020a03831690303180156108fc02916000818181858888f150505050505050565b6000818152600360205260408120819081908190819061059981610b9d565b15156105a457600080fd5b80546001820154600290920154600160a060020a03909116986fffffffffffffffffffffffffffffffff8084169950700100000000000000000000000000000000909304909216965067ffffffffffffffff808216965068010000000000000000909104169350915050565b60025481565b60008054600160a060020a0316331461062e57600080fd5b60005460a060020a900460ff161561064557600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a150600190565b60045460ff1681565b6000805460a060020a900460ff1615156106b857600080fd5b600054600160a060020a031633146106cf57600080fd5b5060008181526003602052604090206106e781610b9d565b15156106f257600080fd5b8054610708908390600160a060020a0316610bbe565b5050565b60055481565b600054600160a060020a031681565b60008181526003602052604081209061073982610b9d565b151561074457600080fd5b508054600160a060020a031633811461075c57600080fd5b6104f48382610bbe565b600081815260036020526040812061077d81610b9d565b151561078857600080fd5b61079181610c08565b9392505050565b600154600160a060020a031681565b600080805b60058110156107d157600681600581106107c257fe5b015491909101906001016107ac565b5060059004919050565b600054600160a060020a031633146107f257600080fd5b600160a060020a0381161561082a576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b1580156108a157600080fd5b505af115801561040c573d6000803e3d6000fd5b603c816060015167ffffffffffffffff16101515156108d357600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff1990911617815581840151600182018054858701516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080870151600290940180546080808a015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190981667ffffffffffffffff1990931683171696909617909155865189815295860192909252848601929092529083015291517fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba7929181900390910190a15050565b60008281526003602052604081208180808080610a2586610b9d565b1515610a3057600080fd5b610a3986610c08565b945084881015610a4857600080fd5b8554600160a060020a03169350610a5e89610c98565b6000851115610ab057610a7085610ce5565b6040519093508386039250600160a060020a0385169083156108fc029084906000818181858888f19350505050158015610aae573d6000803e3d6000fd5b505b5060405184880390339082156108fc029083906000818181858888f19350505050158015610ae2573d6000803e3d6000fd5b50604080518a815260208101879052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a15092979650505050505050565b600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163a9059cbb91604480830192600092919082900301818387803b1580156108a157600080fd5b6002015460006801000000000000000090910467ffffffffffffffff161190565b610bc782610c98565b610bd18183610b2f565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6002810154600090819068010000000000000000900467ffffffffffffffff16421115610c4e5750600282015468010000000000000000900467ffffffffffffffff1642035b60018301546002840154610791916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff1684610cf1565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6000808080858510610d0557869350610d23565b878703925085858402811515610d1757fe5b05915081880190508093505b505050949350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a723058203c3d7d4039d9d9a82dd65c7bc046590e8fe3580af952a66fe24052959889bef50029" - code_ContractScenario011_deploySiringClockAuction = "60806040526000805460a060020a60ff02191690556004805460ff1916600117905534801561002d57600080fd5b50604051604080610e1a83398101604052805160209091015160008054600160a060020a031916331781558290829061271082111561006b57600080fd5b506002819055604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f9a20483d00000000000000000000000000000000000000000000000000000000600482015290518391600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156100f557600080fd5b505af1158015610109573d6000803e3d6000fd5b505050506040513d602081101561011f57600080fd5b5051151561012c57600080fd5b60018054600160a060020a03909216600160a060020a031990921691909117905550505050610cba806101606000396000f3006080604052600436106100da5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166327ebe40a81146100df5780633f4ba83a1461010e578063454a2ab3146101375780635c975abb146101425780635fd8c7101461015757806376190f8f1461016c57806378bd79351461018157806383b5ff8b146101ce5780638456cb59146101f5578063878eb3681461020a5780638da5cb5b1461022257806396b5a75514610253578063c55d0f561461026b578063dd1b7a0f14610283578063f2fde38b14610298575b600080fd5b3480156100eb57600080fd5b5061010c600435602435604435606435600160a060020a03608435166102b9565b005b34801561011a57600080fd5b506101236103b1565b604080519115158252519081900360200190f35b61010c60043561042c565b34801561014e57600080fd5b50610123610478565b34801561016357600080fd5b5061010c610488565b34801561017857600080fd5b506101236104e5565b34801561018d57600080fd5b506101996004356104ee565b60408051600160a060020a03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156101da57600080fd5b506101e3610584565b60408051918252519081900360200190f35b34801561020157600080fd5b5061012361058a565b34801561021657600080fd5b5061010c60043561060a565b34801561022e57600080fd5b50610237610673565b60408051600160a060020a039092168252519081900360200190f35b34801561025f57600080fd5b5061010c600435610682565b34801561027757600080fd5b506101e36004356106cc565b34801561028f57600080fd5b506102376106fe565b3480156102a457600080fd5b5061010c600160a060020a036004351661070d565b6102c1610c60565b6fffffffffffffffffffffffffffffffff851685146102df57600080fd5b6fffffffffffffffffffffffffffffffff841684146102fd57600080fd5b67ffffffffffffffff8316831461031357600080fd5b600154600160a060020a0316331461032a57600080fd5b610334828761075f565b60a06040519081016040528083600160a060020a03168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506103a986826107e7565b505050505050565b60008054600160a060020a031633146103c957600080fd5b60005460a060020a900460ff1615156103e157600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a150600190565b600154600090600160a060020a0316331461044657600080fd5b50600081815260036020526040902054600160a060020a0316610469823461093b565b506104748183610a61565b5050565b60005460a060020a900460ff1681565b60015460008054600160a060020a0392831692163314806104b1575033600160a060020a038316145b15156104bc57600080fd5b604051600160a060020a03831690303180156108fc02916000818181858888f150505050505050565b60045460ff1681565b6000818152600360205260408120819081908190819061050d81610acf565b151561051857600080fd5b80546001820154600290920154600160a060020a03909116986fffffffffffffffffffffffffffffffff8084169950700100000000000000000000000000000000909304909216965067ffffffffffffffff808216965068010000000000000000909104169350915050565b60025481565b60008054600160a060020a031633146105a257600080fd5b60005460a060020a900460ff16156105b957600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a150600190565b6000805460a060020a900460ff16151561062357600080fd5b600054600160a060020a0316331461063a57600080fd5b50600081815260036020526040902061065281610acf565b151561065d57600080fd5b8054610474908390600160a060020a0316610af0565b600054600160a060020a031681565b60008181526003602052604081209061069a82610acf565b15156106a557600080fd5b508054600160a060020a03163381146106bd57600080fd5b6106c78382610af0565b505050565b60008181526003602052604081206106e381610acf565b15156106ee57600080fd5b6106f781610b3a565b9392505050565b600154600160a060020a031681565b600054600160a060020a0316331461072457600080fd5b600160a060020a0381161561075c576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b1580156107d357600080fd5b505af11580156103a9573d6000803e3d6000fd5b603c816060015167ffffffffffffffff161015151561080557600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff1990911617815581840151600182018054858701516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080870151600290940180546080808a015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190981667ffffffffffffffff1990931683171696909617909155865189815295860192909252848601929092529083015291517fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba7929181900390910190a15050565b6000828152600360205260408120818080808061095786610acf565b151561096257600080fd5b61096b86610b3a565b94508488101561097a57600080fd5b8554600160a060020a0316935061099089610bca565b60008511156109e2576109a285610c17565b6040519093508386039250600160a060020a0385169083156108fc029084906000818181858888f193505050501580156109e0573d6000803e3d6000fd5b505b5060405184880390339082156108fc029083906000818181858888f19350505050158015610a14573d6000803e3d6000fd5b50604080518a815260208101879052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a15092979650505050505050565b600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163a9059cbb91604480830192600092919082900301818387803b1580156107d357600080fd5b6002015460006801000000000000000090910467ffffffffffffffff161190565b610af982610bca565b610b038183610a61565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6002810154600090819068010000000000000000900467ffffffffffffffff16421115610b805750600282015468010000000000000000900467ffffffffffffffff1642035b600183015460028401546106f7916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff1684610c23565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6000808080858510610c3757869350610c55565b878703925085858402811515610c4957fe5b05915081880190508093505b505050949350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a723058208d1842c4569ecc7005642ae981f6c77b856b1d9a921f3792bdb4219144ae25e00029" - code_ContractScenario011_deployGeneScienceInterface = "608060405234801561001057600080fd5b5060dc8061001f6000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630d9f5aed8114604d57806354c15b8214607a575b600080fd5b348015605857600080fd5b50606860043560243560443560a0565b60408051918252519081900360200190f35b348015608557600080fd5b50608c60ab565b604080519115158252519081900360200190f35b600292909101010490565b6001905600a165627a7a72305820d9550024d511527e5124d542daf0a0f3168b9bece6a238bcbccba8b61d3f0bdb0029" - code_WalletTestAccount012_storageAndCpu = "608060405234801561001057600080fd5b5061045c806100206000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304c58438146100725780634f2be91f1461009f578063812db772146100b657806393cd5755146100e3578063d1cd64e914610189575b600080fd5b34801561007e57600080fd5b5061009d600480360381019080803590602001909291905050506101a0565b005b3480156100ab57600080fd5b506100b4610230565b005b3480156100c257600080fd5b506100e1600480360381019080803590602001909291905050506102a2565b005b3480156100ef57600080fd5b5061010e600480360381019080803590602001909291905050506102c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561014e578082015181840152602081019050610133565b50505050905090810190601f16801561017b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561019557600080fd5b5061019e61037e565b005b6000600190505b8181101561022c5760008060018154018082558091505090600182039060005260206000200160006040805190810160405280600881526020017f31323334353637380000000000000000000000000000000000000000000000008152509091909150908051906020019061021d92919061038b565b505080806001019150506101a7565b5050565b60008060018154018082558091505090600182039060005260206000200160006040805190810160405280600881526020017f61626364656667680000000000000000000000000000000000000000000000008152509091909150908051906020019061029e92919061038b565b5050565b6000600190505b81811115156102bf5780806001019150506102a9565b5050565b6000818154811015156102d257fe5b906000526020600020016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103765780601f1061034b57610100808354040283529160200191610376565b820191906000526020600020905b81548152906001019060200180831161035957829003601f168201915b505050505081565b6000808060010191505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103cc57805160ff19168380011785556103fa565b828001600101855582156103fa579182015b828111156103f95782518255916020019190600101906103de565b5b509050610407919061040b565b5090565b61042d91905b80821115610429576000816000905550600101610411565b5090565b905600a165627a7a7230582087d9880a135295a17100f63b8941457f4369204d3ccc9ce4a1abf99820eb68480029" - code_TestExceptionCodeAndAbi_testtimeout = "6080604052600060035534801561001557600080fd5b5061027b806100256000396000f3006080604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633755cd3c81146100875780637d965688146100b1578063a05b2577146100c9578063b0d6304d146100e1578063bbe1d75b14610115578063f8a8fd6d1461012a578063fe75faab14610141575b600080fd5b34801561009357600080fd5b5061009f600435610159565b60408051918252519081900360200190f35b3480156100bd57600080fd5b5061009f600435610178565b3480156100d557600080fd5b5061009f600435610198565b3480156100ed57600080fd5b5061009f73ffffffffffffffffffffffffffffffffffffffff600435811690602435166101e2565b34801561012157600080fd5b5061009f6101ff565b34801561013657600080fd5b5061013f610205565b005b34801561014d57600080fd5b5061009f600435610218565b600080548290811061016757fe5b600091825260209091200154905081565b600080805b83811015610191576001918201910161017d565b5092915050565b600080805b838110156101915760008054600181810183559180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301829055918201910161019d565b600260209081526000928352604080842090915290825290205481565b60015481565b600380546001019055610216610205565b565b60006102238261022e565b600181905592915050565b600061023c6002830361022e565b6102486001840361022e565b01929150505600a165627a7a7230582077fd7ac1cd0908622d05db388922d485d6f8e3a546590b97ec8398f87f0c8a580029" - code_TestMapBigLongAndNumbers_deployErc721KittyCore = "608060405234801561001057600080fd5b506108e3806100206000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663058294c5811461009d5780630f8286c61461011d57806327e235e3146101b35780634a53ac83146101e65780637d9656881461020757806386b714e21461021f578063931fdba214610234578063babfe8e114610258578063e68c24ae146102bc575b600080fd5b3480156100a957600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261010194369492936024939284019190819084018382808284375094975050509235600160a060020a031693506102e092505050565b60408051600160a060020a039092168252519081900360200190f35b34801561012957600080fd5b5061013e600160a060020a0360043516610310565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610178578181015183820152602001610160565b50505050905090810190601f1680156101a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101bf57600080fd5b506101d4600160a060020a03600435166103aa565b60408051918252519081900360200190f35b3480156101f257600080fd5b5061013e600160a060020a03600435166103bc565b34801561021357600080fd5b506101d4600435610422565b34801561022b57600080fd5b5061013e610442565b34801561024057600080fd5b50610101600160a060020a036004351660243561049d565b34801561026457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261010194369492936024939284019190819084018382808284375094975050509235600160a060020a0316935061066892505050565b3480156102c857600080fd5b50610101600435600160a060020a0360243516610690565b600160a060020a03811660009081526002602090815260408220845161030892860190610790565b509092915050565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f81018390048302840183019094528383529192908301828280156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b505050505081565b60006020819052908152604090205481565b600260208181526000928352604092839020805484516001821615610100026000190190911693909304601f81018390048302840183019094528383529192908301828280156103a25780601f10610377576101008083540402835291602001916103a2565b600080805b8381101561043b5760019182019101610427565b5092915050565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103a25780601f10610377576101008083540402835291602001916103a2565b6040805180820190915260018082527f6100000000000000000000000000000000000000000000000000000000000000602090920191825260009182916104e691600391610790565b50600090505b82811015610619576003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181526105fc9361058e93919290918301828280156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b50505050506106af565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526105f093909290918301828280156105845780601f1061055957610100808354040283529160200191610584565b9063ffffffff6106d516565b805161061091600391602090910190610790565b506001016104ec565b60036001600086600160a060020a0316600160a060020a03168152602001908152602001600020908054600181600116156101000203166002900461065f92919061080e565b50929392505050565b600160a060020a03811660009081526001602090815260408220845161030892860190610790565b600160a060020a03811660009081526020819052604090209190915590565b6106b7610883565b50604080518082019091528151815260209182019181019190915290565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015610712578160200160208202803883390190505b50915060208201905061072e818660200151876000015161074c565b845160208501518551610744928401919061074c565b509392505050565b60005b60208210610771578251845260209384019390920191601f199091019061074f565b50905182516020929092036101000a6000190180199091169116179052565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106107d157805160ff19168380011785556107fe565b828001600101855582156107fe579182015b828111156107fe5782518255916020019190600101906107e3565b5061080a92915061089a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061084757805485556107fe565b828001600101855582156107fe57600052602060002091601f016020900482015b828111156107fe578254825591600101919060010190610868565b604080518082019091526000808252602082015290565b6108b491905b8082111561080a57600081556001016108a0565b905600a165627a7a72305820f826fbe07a4ee048e7cd47a00e3ca43677011f846fb9e00e1f8202a84a5159540029" - code_TestNetErc721Cat_deployErc721KittyCore = "6002805460a060020a60ff0219169055610240604052603c6080908152607860a05261012c60c05261025860e05261070861010052610e1061012052611c2061014052613840610160526170806101805261e1006101a052620151806101c0526202a3006101e052620546006102005262093a80610220526200008790600390600e620004e3565b50600f6005556301312d00600e55348015620000a257600080fd5b506002805460008054600160a060020a031990811633908117835560a060020a60ff0219909316740100000000000000000000000000000000000000001716909117909155620001019080806000198164010000000062000108810204565b50620005f1565b6000806200011562000586565b600063ffffffff891689146200012a57600080fd5b63ffffffff881688146200013d57600080fd5b61ffff871687146200014e57600080fd5b600287049250600d8361ffff1611156200016757600d92505b505060408051610100810182528581524267ffffffffffffffff90811660208301908152600093830184815263ffffffff8c8116606086019081528c82166080870190815260a0870188815261ffff8a811660c08a019081528f821660e08b01908152600680546001810182559c528a517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60028e029081019190915598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909901805498519651955194519251915167ffffffffffffffff19909916998b1699909917604060020a608060020a0319166801000000000000000096909a169590950298909817608060020a63ffffffff021916700100000000000000000000000000000000938616939093029290921760a060020a63ffffffff02191674010000000000000000000000000000000000000000918516919091021760c060020a63ffffffff0219167801000000000000000000000000000000000000000000000000968416969096029590951760e060020a61ffff0219167c01000000000000000000000000000000000000000000000000000000009186169190910217600160f060020a03167e010000000000000000000000000000000000000000000000000000000000009290941691909102929092179055909190811681146200036f57600080fd5b606080830151608080850151855160408051600160a060020a038c1681526020810188905263ffffffff95861681830152929094169482019490945290810192909252517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1620003f46000868364010000000062000400810204565b98975050505050505050565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a03191690911790558316156200049457600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600283019183908215620005745791602002820160005b838211156200054057835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620004fa565b8015620005725782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000540565b505b5062000582929150620005ca565b5090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b620005ee91905b808211156200058257805463ffffffff19168155600101620005d1565b90565b6130f380620006016000396000f3006080604052600436106102a55763ffffffff60e060020a60003504166301ffc9a781146102d55780630519ce79146103205780630560ff441461035157806305e45546146103ea57806306fdde0314610411578063095ea7b3146104265780630a0f81681461044a5780630e583df01461045f57806314001f4c1461047457806318160ddd14610495578063183a7947146104aa5780631940a936146104bf57806319c2f201146104d757806321717ebf146104ec57806323b872dd1461050157806324e7a38a1461052b57806327d7874c1461054c5780632ba73c151461056d5780633d7d3f5a1461058e5780633f4ba83a146105af57806346116e6f146105c457806346d22c70146105dc578063481af3d3146105f75780634ad8c9381461060f5780634b85fd55146106305780634dfff04f146106485780634e0a33791461066c578063561291341461068d5780635663896e146106b15780635c975abb146106c95780635fd8c710146106de5780636352211e146106f3578063680eba271461070b5780636af04a57146107205780636fbde40d1461073557806370a082311461075657806371587988146107775780637a7d4937146107985780638456cb59146107ad5780638462151c146107c257806388c2a0bf1461083357806391876e571461084b57806395d89b41146108605780639d6fac6f14610875578063a45f4bfc146108a6578063a9059cbb146108be578063b047fb50146108e2578063b0c35c05146108f7578063bc4006f51461090c578063c3bea9af14610921578063d3e6f49f14610939578063defb958414610951578063e17b25af14610966578063e6cbe35114610987578063e98b7f4d1461099c578063ed60ade614610a06578063f1ca941014610a14578063f2b47d5214610a29578063f7d8c88314610a3e575b600b54600160a060020a03163314806102c85750600c54600160a060020a031633145b15156102d357600080fd5b005b3480156102e157600080fd5b5061030c7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610a4c565b604080519115158252519081900360200190f35b34801561032c57600080fd5b50610335610cdf565b60408051600160a060020a039092168252519081900360200190f35b34801561035d57600080fd5b50610375600480359060248035908101910135610cee565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506103ff610df1565b60408051918252519081900360200190f35b34801561041d57600080fd5b50610375610df7565b34801561043257600080fd5b506102d3600160a060020a0360043516602435610e2e565b34801561045657600080fd5b50610335610eb0565b34801561046b57600080fd5b506103ff610ebf565b34801561048057600080fd5b506102d3600160a060020a0360043516610ec6565b3480156104a157600080fd5b506103ff610f79565b3480156104b657600080fd5b506103ff610f83565b3480156104cb57600080fd5b5061030c600435610f89565b3480156104e357600080fd5b506103ff610fce565b3480156104f857600080fd5b50610335610fd5565b34801561050d57600080fd5b506102d3600160a060020a0360043581169060243516604435610fe4565b34801561053757600080fd5b506102d3600160a060020a0360043516611060565b34801561055857600080fd5b506102d3600160a060020a0360043516611113565b34801561057957600080fd5b506102d3600160a060020a0360043516611161565b34801561059a57600080fd5b506102d36004356024356044356064356111af565b3480156105bb57600080fd5b506102d36112a4565b3480156105d057600080fd5b50610335600435611338565b3480156105e857600080fd5b5061030c600435602435611353565b34801561060357600080fd5b506103356004356113d3565b34801561061b57600080fd5b506102d36004356024356044356064356113ee565b34801561063c57600080fd5b506102d36004356114c6565b34801561065457600080fd5b506102d3600160a060020a03600435166024356114e2565b34801561067857600080fd5b506102d3600160a060020a036004351661153c565b34801561069957600080fd5b506102d3600435600160a060020a036024351661158a565b3480156106bd57600080fd5b506102d36004356115f1565b3480156106d557600080fd5b5061030c61164d565b3480156106ea57600080fd5b506102d361165d565b3480156106ff57600080fd5b506103356004356116c1565b34801561071757600080fd5b506103ff6116e5565b34801561072c57600080fd5b506103356116eb565b34801561074157600080fd5b506102d3600160a060020a03600435166116fa565b34801561076257600080fd5b506103ff600160a060020a03600435166117ad565b34801561078357600080fd5b506102d3600160a060020a03600435166117c8565b3480156107a457600080fd5b506103ff61184b565b3480156107b957600080fd5b506102d3611851565b3480156107ce57600080fd5b506107e3600160a060020a03600435166118d1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561081f578181015183820152602001610807565b505050509050019250505060405180910390f35b34801561083f57600080fd5b506103ff6004356119a3565b34801561085757600080fd5b506102d3611c7f565b34801561086c57600080fd5b50610375611d94565b34801561088157600080fd5b5061088d600435611dcb565b6040805163ffffffff9092168252519081900360200190f35b3480156108b257600080fd5b50610335600435611df8565b3480156108ca57600080fd5b506102d3600160a060020a0360043516602435611e13565b3480156108ee57600080fd5b50610335611eab565b34801561090357600080fd5b506103ff611eba565b34801561091857600080fd5b50610335611ec0565b34801561092d57600080fd5b506102d3600435611ecf565b34801561094557600080fd5b5061030c600435611fb9565b34801561095d57600080fd5b506103ff612088565b34801561097257600080fd5b506102d3600160a060020a036004351661208e565b34801561099357600080fd5b506103356120c7565b3480156109a857600080fd5b506109b46004356120d6565b604080519a15158b5298151560208b0152898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6102d3600435602435612237565b348015610a2057600080fd5b506103ff6123d1565b348015610a3557600080fd5b506103356123d7565b6102d36004356024356123e6565b604080517f737570706f727473496e74657266616365286279746573342900000000000000815290519081900360190190206000907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1983811691161480610cd75750604080517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152815190819003601d0181207f746f6b656e734f664f776e657228616464726573732900000000000000000000825282519182900360160182207f7472616e7366657246726f6d28616464726573732c616464726573732c75696e83527f7432353629000000000000000000000000000000000000000000000000000000602084015283519283900360250183207f7472616e7366657228616464726573732c75696e743235362900000000000000845284519384900360190184207f617070726f766528616464726573732c75696e74323536290000000000000000855285519485900360180185207f6f776e65724f662875696e743235362900000000000000000000000000000000865286519586900360100186207f62616c616e63654f662861646472657373290000000000000000000000000000875287519687900360120187207f746f74616c537570706c792829000000000000000000000000000000000000008852885197889003600d0188207f73796d626f6c2829000000000000000000000000000000000000000000000000895289519889900360080189207f6e616d65282900000000000000000000000000000000000000000000000000008a529951988990036006019098207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198c811691909a189098181818181818181891909116145b90505b919050565b600154600160a060020a031681565b6060610cf8613064565b600d54600090600160a060020a03161515610d1257600080fd5b600d54604080517fcb4799f2000000000000000000000000000000000000000000000000000000008152600481018981526024820192835260448201889052600160a060020a039093169263cb4799f2928a928a928a929091606401848480828437820191505094505050505060a060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525060a0811015610dd257600080fd5b5060808101519092509050610de782826125e4565b9695505050505050565b60115481565b60408051808201909152600d81527f43727970746f4b69747469657300000000000000000000000000000000000000602082015281565b60025460a060020a900460ff1615610e4557600080fd5b610e4f3382612638565b1515610e5a57600080fd5b610e648183612658565b60408051338152600160a060020a038416602082015280820183905290517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360600190a15050565b600054600160a060020a031681565b6298968081565b60008054600160a060020a03163314610ede57600080fd5b81905080600160a060020a03166376190f8f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f1f57600080fd5b505af1158015610f33573d6000803e3d6000fd5b505050506040513d6020811015610f4957600080fd5b50511515610f5657600080fd5b600c8054600160a060020a031916600160a060020a039290921691909117905550565b6006546000190190565b600f5481565b6000808211610f9757600080fd5b6006805483908110610fa557fe5b600091825260209091206002909102016001015460c060020a900463ffffffff16151592915050565b6201518081565b600c54600160a060020a031681565b60025460a060020a900460ff1615610ffb57600080fd5b600160a060020a038216151561101057600080fd5b600160a060020a03821630141561102657600080fd5b6110303382612686565b151561103b57600080fd5b6110458382612638565b151561105057600080fd5b61105b8383836126a6565b505050565b60008054600160a060020a0316331461107857600080fd5b81905080600160a060020a03166354c15b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b505050506040513d60208110156110e357600080fd5b505115156110f057600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b600054600160a060020a0316331461112a57600080fd5b600160a060020a038116151561113f57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a0316331461117857600080fd5b600160a060020a038116151561118d57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60025460a060020a900460ff16156111c657600080fd5b6111d03385612638565b15156111db57600080fd5b6111e484610f89565b156111ee57600080fd5b600b54611205908590600160a060020a0316612658565b600b54604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b5050505050505050565b600054600160a060020a031633146112bb57600080fd5b60025460a060020a900460ff1615156112d357600080fd5b600b54600160a060020a031615156112ea57600080fd5b600c54600160a060020a0316151561130157600080fd5b601054600160a060020a0316151561131857600080fd5b601354600160a060020a03161561132e57600080fd5b611336612788565b565b600a60205260009081526040902054600160a060020a031681565b6000808080851161136357600080fd5b6000841161137057600080fd5b600680548690811061137e57fe5b9060005260206000209060020201915060068481548110151561139d57fe5b906000526020600020906002020190506113b9828683876127d7565b80156113ca57506113ca8486612957565b95945050505050565b600960205260009081526040902054600160a060020a031681565b60025460a060020a900460ff161561140557600080fd5b61140f3385612638565b151561141a57600080fd5b61142384611fb9565b151561142e57600080fd5b600c54611445908590600160a060020a0316612658565b600c54604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561128657600080fd5b600254600160a060020a031633146114dd57600080fd5b600e55565b60025460a060020a900460ff16156114f957600080fd5b6115033382612638565b151561150e57600080fd5b6000908152600a602052604090208054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a0316331461155357600080fd5b600160a060020a038116151561156857600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b600254600090600160a060020a031633146115a457600080fd5b5080600160a060020a03811615156115c45750600254600160a060020a03165b601154611388116115d457600080fd5b6011805460010190556115eb6000808086856129ac565b50505050565b600254600160a060020a03163314806116145750600054600160a060020a031633145b806116295750600154600160a060020a031633145b151561163457600080fd5b60035463ffffffff16811061164857600080fd5b600555565b60025460a060020a900460ff1681565b6001546000908190600160a060020a0316331461167957600080fd5b5050600e54600f54303191600190910102808211156116bd57600154604051600160a060020a039091169082840380156108fc02916000818181858888f150505050505b5050565b600081815260076020526040902054600160a060020a0316801515610cda57600080fd5b61afc881565b601354600160a060020a031681565b60008054600160a060020a0316331461171257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050506040513d602081101561177d57600080fd5b5051151561178a57600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550565b600160a060020a031660009081526008602052604090205490565b600054600160a060020a031633146117df57600080fd5b60025460a060020a900460ff1615156117f757600080fd5b60138054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b60055481565b600254600160a060020a03163314806118745750600054600160a060020a031633145b806118895750600154600160a060020a031633145b151561189457600080fd5b60025460a060020a900460ff16156118ab57600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b60606000606060008060006118e5876117ad565b9450841515611904576040805160008152602081019091529550611999565b8460405190808252806020026020018201604052801561192e578160200160208202803883390190505b509350611939610f79565b925060009150600190505b82811161199557600081815260076020526040902054600160a060020a038881169116141561198d5780848381518110151561197c57fe5b602090810290910101526001909101905b600101611944565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff161515156119cb57600080fd5b600680548a9081106119d957fe5b60009182526020909120600290910201600181015490975067ffffffffffffffff161515611a0657600080fd5b604080516101008101825288548152600189015467ffffffffffffffff8082166020840152680100000000000000008204169282019290925263ffffffff608060020a83048116606083015260a060020a83048116608083015260c060020a83041660a082015261ffff60e060020a8304811660c083015260f060020a90920490911660e0820152611a9790612c89565b1515611aa257600080fd5b60018701546006805460c060020a90920463ffffffff1697509087908110611ac657fe5b600091825260209091206001808a015460029093029091019081015490965061ffff60f060020a928390048116965091900416841015611b1357600185015460f060020a900461ffff1693505b6010548754865460018a0154604080517f0d9f5aed0000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260001967ffffffffffffffff6801000000000000000090920482160116604483015251600160a060020a0390921691630d9f5aed916064808201926020929091908290030181600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b505050506040513d6020811015611bd757600080fd5b505160008a815260076020526040902054600189810154929550600160a060020a039091169350611c20918b9160c060020a90910463ffffffff1690870161ffff1686866129ac565b6001880180547bffffffff00000000000000000000000000000000000000000000000019169055600f8054600019019055600e54604051919250339181156108fc0291906000818181858888f150939c9b505050505050505050505050565b600254600160a060020a0316331480611ca25750600054600160a060020a031633145b80611cb75750600154600160a060020a031633145b1515611cc257600080fd5b600b60009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d1557600080fd5b505af1158015611d29573d6000803e3d6000fd5b50505050600c60009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d8057600080fd5b505af11580156115eb573d6000803e3d6000fd5b60408051808201909152600281527f434b000000000000000000000000000000000000000000000000000000000000602082015281565b600381600e8110611dd857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600760205260009081526040902054600160a060020a031681565b60025460a060020a900460ff1615611e2a57600080fd5b600160a060020a0382161515611e3f57600080fd5b600160a060020a038216301415611e5557600080fd5b600b54600160a060020a0383811691161415611e7057600080fd5b600c54600160a060020a0383811691161415611e8b57600080fd5b611e953382612638565b1515611ea057600080fd5b6116bd3383836126a6565b600254600160a060020a031681565b600e5481565b600d54600160a060020a031681565b600254600090600160a060020a03163314611ee957600080fd5b60125461afc811611ef957600080fd5b611f08600080600085306129ac565b600b54909150611f22908290600160a060020a0316612658565b600b54600160a060020a03166327ebe40a82611f3c612cb9565b6040805160e060020a63ffffffff861602815260048101939093526024830191909152600060448301819052620151806064840152306084840152905160a48084019382900301818387803b158015611f9457600080fd5b505af1158015611fa8573d6000803e3d6000fd5b505060128054600101905550505050565b600080808311611fc857600080fd5b6006805484908110611fd657fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e082015290915061208190612d7b565b9392505050565b61138881565b600054600160a060020a031633146120a557600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600b54600160a060020a031681565b600080600080600080600080600080600060068c8154811015156120f657fe5b906000526020600020906002020190508060010160189054906101000a900463ffffffff1663ffffffff16600014159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b60025460009060a060020a900460ff161561225157600080fd5b61225b3383612638565b151561226657600080fd5b61226f82611fb9565b151561227a57600080fd5b6122848284612daa565b151561228f57600080fd5b600c54604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156122f657600080fd5b505af115801561230a573d6000803e3d6000fd5b505050506040513d602081101561232057600080fd5b5051600e54909150810134101561233657600080fd5b600c54600e54604080517f454a2ab3000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a039093169263454a2ab39234039160248082019260009290919082900301818588803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b505050505061105b8263ffffffff168463ffffffff16612df9565b60125481565b601054600160a060020a031681565b600254600090819060a060020a900460ff161561240257600080fd5b600e5434101561241157600080fd5b61241b3385612638565b151561242657600080fd5b6124308385612957565b151561243b57600080fd5b600680548590811061244957fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e08201529092506124f490612d7b565b15156124ff57600080fd5b600680548490811061250d57fe5b60009182526020918290206040805161010081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a84048116608084015260c060020a84041660a083015261ffff60e060020a8404811660c084015260f060020a90930490921660e08201529091506125b890612d7b565b15156125c357600080fd5b6125cf828583866127d7565b15156125da57600080fd5b6115eb8484612df9565b606080600080846040519080825280601f01601f191660200182016040528015612618578160200160208202803883390190505b509250506020820190508461262e828287612f37565b5090949350505050565b600090815260076020526040902054600160a060020a0391821691161490565b6000918252600960205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260096020526040902054600160a060020a0391821691161490565b600160a060020a03808316600081815260086020908152604080832080546001019055858352600790915290208054600160a060020a031916909117905583161561273957600160a060020a03831660009081526008602090815260408083208054600019019055838352600a82528083208054600160a060020a03199081169091556009909252909120805490911690555b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600054600160a060020a0316331461279f57600080fd5b60025460a060020a900460ff1615156127b757600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b6000818414156127e95750600061294f565b6001850154608060020a900463ffffffff168214806128185750600185015460a060020a900463ffffffff1682145b156128255750600061294f565b6001830154608060020a900463ffffffff168414806128545750600183015460a060020a900463ffffffff1684145b156128615750600061294f565b6001830154608060020a900463ffffffff16158061288e57506001850154608060020a900463ffffffff16155b1561289b5750600161294f565b60018581015490840154608060020a9182900463ffffffff908116929091041614806128e6575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156128f35750600061294f565b6001808601549084015460a060020a900463ffffffff908116608060020a90920416148061293e57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b1561294b5750600061294f565b5060015b949350505050565b6000818152600760205260408082205484835290822054600160a060020a039182169116808214806113ca57506000858152600a6020526040902054600160a060020a03908116908316149250505092915050565b6000806129b7613083565b600063ffffffff891689146129cb57600080fd5b63ffffffff881688146129dd57600080fd5b61ffff871687146129ed57600080fd5b600287049250600d8361ffff161115612a0557600d92505b505060408051610100810182528581524267ffffffffffffffff90811660208301908152600093830184815263ffffffff8c8116606086019081528c82166080870190815260a0870188815261ffff8a811660c08a019081528f821660e08b01908152600680546001810182559c528a517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60028e029081019190915598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909901805498519651955194519251915167ffffffffffffffff19909916998b16999099176fffffffffffffffff000000000000000019166801000000000000000096909a16959095029890981773ffffffff000000000000000000000000000000001916608060020a938616939093029290921777ffffffff0000000000000000000000000000000000000000191660a060020a91851691909102177bffffffff000000000000000000000000000000000000000000000000191660c060020a96841696909602959095177fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a91861691909102177dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f060020a929094169190910292909217905590919081168114612c0357600080fd5b606080830151608080850151855160408051600160a060020a038c1681526020810188905263ffffffff95861681830152929094169482019490945290810192909252517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612c7d600086836126a6565b98975050505050505050565b60008160a0015163ffffffff16600014158015610cd75750506040015167ffffffffffffffff4381169116111590565b6000806000600b60009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1157600080fd5b505af1158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d5d57600080fd5b5060028104810162989680811015612d755750629896805b92915050565b60008160a0015163ffffffff166000148015610cd75750506040015167ffffffffffffffff4381169116111590565b6000806000600685815481101515612dbe57fe5b90600052602060002090600202019150600684815481101515612ddd57fe5b906000526020600020906002020190506113ca828683876127d7565b600080600683815481101515612e0b57fe5b90600052602060002090600202019150600684815481101515612e2a57fe5b600091825260209091206002909102016001810180547bffffffff000000000000000000000000000000000000000000000000191660c060020a63ffffffff8716021790559050612e7a82612f7b565b612e8381612f7b565b6000848152600a602090815260408083208054600160a060020a031990811690915586845281842080549091169055600f80546001908101909155878452600783529281902054928401548151600160a060020a0390941684529183018790528281018690526801000000000000000090910467ffffffffffffffff166060830152517f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80916080908290030190a150505050565b60005b60208210612f5c578251845260209384019390920191601f1990910190612f3a565b50905182516020929092036101000a6000190180199091169116179052565b600554600182015443919060039060e060020a900461ffff16600e8110612f9e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811515612fc957fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60e060020a90910461ffff161015613061576001818101805461ffff60e060020a8083048216909401169092027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b50565b6080604051908101604052806004906020820280388339509192915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152905600a165627a7a723058201424bf1db41fa7ec76f5506a53d8bbcb84ed5b5a6ade2df0bac8deaacb118a8b0029" - code_TestNetErc721Cat_deploySaleClockAuction = "60806040526000805460a060020a60ff02191690556004805460ff1916600117905534801561002d57600080fd5b50604051604080610ee883398101604052805160209091015160008054600160a060020a031916331781558290829061271082111561006b57600080fd5b506002819055604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f9a20483d00000000000000000000000000000000000000000000000000000000600482015290518391600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156100f557600080fd5b505af1158015610109573d6000803e3d6000fd5b505050506040513d602081101561011f57600080fd5b5051151561012c57600080fd5b60018054600160a060020a03909216600160a060020a031990921691909117905550505050610d88806101606000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166327ebe40a81146101005780633f4ba83a1461012f578063454a2ab314610158578063484eccb4146101635780635c975abb1461018d5780635fd8c710146101a257806378bd7935146101b757806383b5ff8b146102045780638456cb591461021957806385b861881461022e578063878eb368146102435780638a98a9cc1461025b5780638da5cb5b1461027057806396b5a755146102a1578063c55d0f56146102b9578063dd1b7a0f146102d1578063eac9d94c146102e6578063f2fde38b146102fb575b600080fd5b34801561010c57600080fd5b5061012d600435602435604435606435600160a060020a036084351661031c565b005b34801561013b57600080fd5b50610144610414565b604080519115158252519081900360200190f35b61012d60043561048f565b34801561016f57600080fd5b5061017b6004356104f9565b60408051918252519081900360200190f35b34801561019957600080fd5b5061014461050d565b3480156101ae57600080fd5b5061012d61051d565b3480156101c357600080fd5b506101cf60043561057a565b60408051600160a060020a03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561021057600080fd5b5061017b610610565b34801561022557600080fd5b50610144610616565b34801561023a57600080fd5b50610144610696565b34801561024f57600080fd5b5061012d60043561069f565b34801561026757600080fd5b5061017b61070c565b34801561027c57600080fd5b50610285610712565b60408051600160a060020a039092168252519081900360200190f35b3480156102ad57600080fd5b5061012d600435610721565b3480156102c557600080fd5b5061017b600435610766565b3480156102dd57600080fd5b50610285610798565b3480156102f257600080fd5b5061017b6107a7565b34801561030757600080fd5b5061012d600160a060020a03600435166107db565b610324610d2e565b6fffffffffffffffffffffffffffffffff8516851461034257600080fd5b6fffffffffffffffffffffffffffffffff8416841461036057600080fd5b67ffffffffffffffff8316831461037657600080fd5b600154600160a060020a0316331461038d57600080fd5b610397828761082d565b60a06040519081016040528083600160a060020a03168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061040c86826108b5565b505050505050565b60008054600160a060020a0316331461042c57600080fd5b60005460a060020a900460ff16151561044457600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a150600190565b600081815260036020526040812054600160a060020a0316906104b28334610a09565b90506104be3384610b2f565b600154600160a060020a03838116911614156104f45760058054829160069106600581106104e857fe5b01556005805460010190555b505050565b6006816005811061050657fe5b0154905081565b60005460a060020a900460ff1681565b60015460008054600160a060020a039283169216331480610546575033600160a060020a038316145b151561055157600080fd5b604051600160a060020a03831690303180156108fc02916000818181858888f150505050505050565b6000818152600360205260408120819081908190819061059981610b9d565b15156105a457600080fd5b80546001820154600290920154600160a060020a03909116986fffffffffffffffffffffffffffffffff8084169950700100000000000000000000000000000000909304909216965067ffffffffffffffff808216965068010000000000000000909104169350915050565b60025481565b60008054600160a060020a0316331461062e57600080fd5b60005460a060020a900460ff161561064557600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a150600190565b60045460ff1681565b6000805460a060020a900460ff1615156106b857600080fd5b600054600160a060020a031633146106cf57600080fd5b5060008181526003602052604090206106e781610b9d565b15156106f257600080fd5b8054610708908390600160a060020a0316610bbe565b5050565b60055481565b600054600160a060020a031681565b60008181526003602052604081209061073982610b9d565b151561074457600080fd5b508054600160a060020a031633811461075c57600080fd5b6104f48382610bbe565b600081815260036020526040812061077d81610b9d565b151561078857600080fd5b61079181610c08565b9392505050565b600154600160a060020a031681565b600080805b60058110156107d157600681600581106107c257fe5b015491909101906001016107ac565b5060059004919050565b600054600160a060020a031633146107f257600080fd5b600160a060020a0381161561082a576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b1580156108a157600080fd5b505af115801561040c573d6000803e3d6000fd5b603c816060015167ffffffffffffffff16101515156108d357600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff1990911617815581840151600182018054858701516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080870151600290940180546080808a015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190981667ffffffffffffffff1990931683171696909617909155865189815295860192909252848601929092529083015291517fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba7929181900390910190a15050565b60008281526003602052604081208180808080610a2586610b9d565b1515610a3057600080fd5b610a3986610c08565b945084881015610a4857600080fd5b8554600160a060020a03169350610a5e89610c98565b6000851115610ab057610a7085610ce5565b6040519093508386039250600160a060020a0385169083156108fc029084906000818181858888f19350505050158015610aae573d6000803e3d6000fd5b505b5060405184880390339082156108fc029083906000818181858888f19350505050158015610ae2573d6000803e3d6000fd5b50604080518a815260208101879052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a15092979650505050505050565b600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163a9059cbb91604480830192600092919082900301818387803b1580156108a157600080fd5b6002015460006801000000000000000090910467ffffffffffffffff161190565b610bc782610c98565b610bd18183610b2f565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6002810154600090819068010000000000000000900467ffffffffffffffff16421115610c4e5750600282015468010000000000000000900467ffffffffffffffff1642035b60018301546002840154610791916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff1684610cf1565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6000808080858510610d0557869350610d23565b878703925085858402811515610d1757fe5b05915081880190508093505b505050949350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a723058203c3d7d4039d9d9a82dd65c7bc046590e8fe3580af952a66fe24052959889bef50029" - code_TestNetErc721Cat_deploySiringClockAuction = "60806040526000805460a060020a60ff02191690556004805460ff1916600117905534801561002d57600080fd5b50604051604080610e1a83398101604052805160209091015160008054600160a060020a031916331781558290829061271082111561006b57600080fd5b506002819055604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f9a20483d00000000000000000000000000000000000000000000000000000000600482015290518391600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156100f557600080fd5b505af1158015610109573d6000803e3d6000fd5b505050506040513d602081101561011f57600080fd5b5051151561012c57600080fd5b60018054600160a060020a03909216600160a060020a031990921691909117905550505050610cba806101606000396000f3006080604052600436106100da5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166327ebe40a81146100df5780633f4ba83a1461010e578063454a2ab3146101375780635c975abb146101425780635fd8c7101461015757806376190f8f1461016c57806378bd79351461018157806383b5ff8b146101ce5780638456cb59146101f5578063878eb3681461020a5780638da5cb5b1461022257806396b5a75514610253578063c55d0f561461026b578063dd1b7a0f14610283578063f2fde38b14610298575b600080fd5b3480156100eb57600080fd5b5061010c600435602435604435606435600160a060020a03608435166102b9565b005b34801561011a57600080fd5b506101236103b1565b604080519115158252519081900360200190f35b61010c60043561042c565b34801561014e57600080fd5b50610123610478565b34801561016357600080fd5b5061010c610488565b34801561017857600080fd5b506101236104e5565b34801561018d57600080fd5b506101996004356104ee565b60408051600160a060020a03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156101da57600080fd5b506101e3610584565b60408051918252519081900360200190f35b34801561020157600080fd5b5061012361058a565b34801561021657600080fd5b5061010c60043561060a565b34801561022e57600080fd5b50610237610673565b60408051600160a060020a039092168252519081900360200190f35b34801561025f57600080fd5b5061010c600435610682565b34801561027757600080fd5b506101e36004356106cc565b34801561028f57600080fd5b506102376106fe565b3480156102a457600080fd5b5061010c600160a060020a036004351661070d565b6102c1610c60565b6fffffffffffffffffffffffffffffffff851685146102df57600080fd5b6fffffffffffffffffffffffffffffffff841684146102fd57600080fd5b67ffffffffffffffff8316831461031357600080fd5b600154600160a060020a0316331461032a57600080fd5b610334828761075f565b60a06040519081016040528083600160a060020a03168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506103a986826107e7565b505050505050565b60008054600160a060020a031633146103c957600080fd5b60005460a060020a900460ff1615156103e157600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a150600190565b600154600090600160a060020a0316331461044657600080fd5b50600081815260036020526040902054600160a060020a0316610469823461093b565b506104748183610a61565b5050565b60005460a060020a900460ff1681565b60015460008054600160a060020a0392831692163314806104b1575033600160a060020a038316145b15156104bc57600080fd5b604051600160a060020a03831690303180156108fc02916000818181858888f150505050505050565b60045460ff1681565b6000818152600360205260408120819081908190819061050d81610acf565b151561051857600080fd5b80546001820154600290920154600160a060020a03909116986fffffffffffffffffffffffffffffffff8084169950700100000000000000000000000000000000909304909216965067ffffffffffffffff808216965068010000000000000000909104169350915050565b60025481565b60008054600160a060020a031633146105a257600080fd5b60005460a060020a900460ff16156105b957600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a150600190565b6000805460a060020a900460ff16151561062357600080fd5b600054600160a060020a0316331461063a57600080fd5b50600081815260036020526040902061065281610acf565b151561065d57600080fd5b8054610474908390600160a060020a0316610af0565b600054600160a060020a031681565b60008181526003602052604081209061069a82610acf565b15156106a557600080fd5b508054600160a060020a03163381146106bd57600080fd5b6106c78382610af0565b505050565b60008181526003602052604081206106e381610acf565b15156106ee57600080fd5b6106f781610b3a565b9392505050565b600154600160a060020a031681565b600054600160a060020a0316331461072457600080fd5b600160a060020a0381161561075c576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b1580156107d357600080fd5b505af11580156103a9573d6000803e3d6000fd5b603c816060015167ffffffffffffffff161015151561080557600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff1990911617815581840151600182018054858701516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080870151600290940180546080808a015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190981667ffffffffffffffff1990931683171696909617909155865189815295860192909252848601929092529083015291517fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba7929181900390910190a15050565b6000828152600360205260408120818080808061095786610acf565b151561096257600080fd5b61096b86610b3a565b94508488101561097a57600080fd5b8554600160a060020a0316935061099089610bca565b60008511156109e2576109a285610c17565b6040519093508386039250600160a060020a0385169083156108fc029084906000818181858888f193505050501580156109e0573d6000803e3d6000fd5b505b5060405184880390339082156108fc029083906000818181858888f19350505050158015610a14573d6000803e3d6000fd5b50604080518a815260208101879052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a15092979650505050505050565b600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163a9059cbb91604480830192600092919082900301818387803b1580156107d357600080fd5b6002015460006801000000000000000090910467ffffffffffffffff161190565b610af982610bca565b610b038183610a61565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6002810154600090819068010000000000000000900467ffffffffffffffff16421115610b805750600282015468010000000000000000900467ffffffffffffffff1642035b600183015460028401546106f7916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff1684610c23565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6000808080858510610c3757869350610c55565b878703925085858402811515610c4957fe5b05915081880190508093505b505050949350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a723058208d1842c4569ecc7005642ae981f6c77b856b1d9a921f3792bdb4219144ae25e00029" - code_TestNetErc721Cat_deployGeneScienceInterface = "608060405234801561001057600080fd5b5060dc8061001f6000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630d9f5aed8114604d57806354c15b8214607a575b600080fd5b348015605857600080fd5b50606860043560243560443560a0565b60408051918252519081900360200190f35b348015608557600080fd5b50608c60ab565b604080519115158252519081900360200190f35b600292909101010490565b6001905600a165627a7a72305820d9550024d511527e5124d542daf0a0f3168b9bece6a238bcbccba8b61d3f0bdb0029" - code_TestNetFomo3D_deployErc721CryptoKitties = "60c0604052600660808190527f464f4d4f3344000000000000000000000000000000000000000000000000000060a0908152620000409160009190620000b3565b506040805180820190915260038082527f463344000000000000000000000000000000000000000000000000000000000060209092019182526200008791600191620000b3565b506305f5e1006002556000600855600b805460ff19169055348015620000ac57600080fd5b5062000158565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f657805160ff191683800117855562000126565b8280016001018555821562000126579182015b828111156200012657825182559160200191906001019062000109565b506200013492915062000138565b5090565b6200015591905b808211156200013457600081556001016200013f565b90565b61165980620001686000396000f3006080604052600436106101685763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166265318b811461017657806306fdde03146101a957806310d0ffdd1461023357806318160ddd1461024b578063226093731461026057806327defa1f14610278578063313ce567146102a1578063392efb52146102cc5780633ccfd60b146102e45780634b750334146102fb57806356d399e814610310578063688abbf7146103255780636b2f46321461033f57806370a08231146103545780638328b610146103755780638620410b1461038d57806389135ae9146103a25780638fea64bd146103bf578063949e8acd146103d457806395d89b41146103e9578063a8e04f34146103fe578063a9059cbb14610413578063b84c824614610437578063c47f002714610490578063e4849b32146104e9578063e9fad8ee14610501578063f088d54714610516578063fdb5a03e1461052a575b61017334600061053f565b50005b34801561018257600080fd5b50610197600160a060020a0360043516610b15565b60408051918252519081900360200190f35b3480156101b557600080fd5b506101be610b50565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f85781810151838201526020016101e0565b50505050905090810190601f1680156102255780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023f57600080fd5b50610197600435610bde565b34801561025757600080fd5b50610197610c0e565b34801561026c57600080fd5b50610197600435610c15565b34801561028457600080fd5b5061028d610c4e565b604080519115158252519081900360200190f35b3480156102ad57600080fd5b506102b6610c57565b6040805160ff9092168252519081900360200190f35b3480156102d857600080fd5b5061028d600435610c5c565b3480156102f057600080fd5b506102f9610c71565b005b34801561030757600080fd5b50610197610d44565b34801561031c57600080fd5b50610197610d93565b34801561033157600080fd5b506101976004351515610d99565b34801561034b57600080fd5b50610197610ddc565b34801561036057600080fd5b50610197600160a060020a0360043516610de1565b34801561038157600080fd5b506102f9600435610dfc565b34801561039957600080fd5b50610197610e43565b3480156103ae57600080fd5b506102f96004356024351515610e87565b3480156103cb57600080fd5b506102f9610ee9565b3480156103e057600080fd5b50610197610eeb565b3480156103f557600080fd5b506101be610efe565b34801561040a57600080fd5b506102f9610f58565b34801561041f57600080fd5b5061028d600160a060020a0360043516602435610fa6565b34801561044357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102f99436949293602493928401919081908401838280828437509497506111609650505050505050565b34801561049c57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102f99436949293602493928401919081908401838280828437509497506111b99650505050505050565b3480156104f557600080fd5b506102f960043561120d565b34801561050d57600080fd5b506102f961135e565b610197600160a060020a036004351661138b565b34801561053657600080fd5b506102f9611397565b60008060008060008060008060008a6000339050600b60009054906101000a900460ff16801561058157506801158e460913d000008261057d610ddc565b0311155b1561088e57600160a060020a03811660009081526003602052604090205460ff16151560011480156105d65750600160a060020a038116600090815260076020526040902054670de0b6b3a764000090830111155b15156105e157600080fd5b600160a060020a038116600090815260076020526040902054610604908361144d565b600160a060020a03821660009081526007602052604090205533995061062b8d6005611463565b9850610638896003611463565b9750610644898961147a565b96506106508d8a61147a565b955061065b8661148c565b945068010000000000000000870293506000851180156106855750600854610683868261144d565b115b151561069057600080fd5b600160a060020a038c16158015906106ba575089600160a060020a03168c600160a060020a031614155b80156106e05750600254600160a060020a038d1660009081526004602052604090205410155b1561072657600160a060020a038c16600090815260056020526040902054610708908961144d565b600160a060020a038d16600090815260056020526040902055610741565b610730878961144d565b965068010000000000000000870293505b600060085411156107a5576107586008548661144d565b600881905568010000000000000000880281151561077257fe5b6009805492909104909101905560085468010000000000000000880281151561079757fe5b0485028403840393506107ab565b60088590555b600160a060020a038a166000908152600460205260409020546107ce908661144d565b600460008c600160a060020a0316600160a060020a031681526020019081526020016000208190555083856009540203925082600660008c600160a060020a0316600160a060020a03168152602001908152602001600020600082825401925050819055508b600160a060020a03168a600160a060020a03167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a50610b05565b600b805460ff191690553399506108a68d6005611463565b98506108b3896003611463565b97506108bf898961147a565b96506108cb8d8a61147a565b95506108d68661148c565b9450680100000000000000008702935060008511801561090057506008546108fe868261144d565b115b151561090b57600080fd5b600160a060020a038c1615801590610935575089600160a060020a03168c600160a060020a031614155b801561095b5750600254600160a060020a038d1660009081526004602052604090205410155b156109a157600160a060020a038c16600090815260056020526040902054610983908961144d565b600160a060020a038d166000908152600560205260409020556109bc565b6109ab878961144d565b965068010000000000000000870293505b60006008541115610a20576109d36008548661144d565b60088190556801000000000000000088028115156109ed57fe5b60098054929091049091019055600854680100000000000000008802811515610a1257fe5b048502840384039350610a26565b60088590555b600160a060020a038a16600090815260046020526040902054610a49908661144d565b600460008c600160a060020a0316600160a060020a031681526020019081526020016000208190555083856009540203925082600660008c600160a060020a0316600160a060020a03168152602001908152602001600020600082825401925050819055508b600160a060020a03168a600160a060020a03167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a505b5050505050505050505092915050565b600160a060020a0316600090815260066020908152604080832054600490925290912054600954680100000000000000009102919091030490565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b505050505081565b6000808080610bee856005611463565b9250610bfa858461147a565b9150610c058261148c565b95945050505050565b6008545b90565b6000806000806008548511151515610c2c57600080fd5b610c3585611508565b9250610c42836005611463565b9150610c05838361147a565b600b5460ff1681565b600681565b600a6020526000908152604090205460ff1681565b6000806000610c806001610d99565b11610c8a57600080fd5b339150610c976000610d99565b600160a060020a038316600081815260066020908152604080832080546801000000000000000087020190556005909152808220805490839055905193019350909183156108fc0291849190818181858888f19350505050158015610d00573d6000803e3d6000fd5b50604080518281529051600160a060020a038416917fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc919081900360200190a25050565b60008060008060085460001415610d625764d18c2e28009350610d8d565b610d6e620f4240611508565b9250610d7b836005611463565b9150610d87838361147a565b90508093505b50505090565b60025481565b60003382610daf57610daa81610b15565b610dd3565b600160a060020a038116600090815260056020526040902054610dd182610b15565b015b91505b50919050565b303190565b600160a060020a031660009081526004602052604090205490565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610e3d57600080fd5b50600255565b60008060008060085460001415610e62576501001d1bf8009350610d8d565b610e6e620f4240611508565b9250610e7b836005611463565b9150610d87838361144d565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610ec857600080fd5b506000918252600a6020526040909120805460ff1916911515919091179055565b565b600033610ef781610de1565b91505b5090565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bd65780601f10610bab57610100808354040283529160200191610bd6565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff161515610f9957600080fd5b50600b805460ff19169055565b600080600080600080610fb7610eeb565b11610fc157600080fd5b600b5433945060ff16158015610fef5750600160a060020a0384166000908152600460205260409020548611155b1515610ffa57600080fd5b60006110066001610d99565b111561101457611014610c71565b61101f866005611463565b925061102b868461147a565b915061103683611508565b90506110446008548461147a565b600855600160a060020a03841660009081526004602052604090205461106a908761147a565b600160a060020a038086166000908152600460205260408082209390935590891681522054611099908361144d565b600160a060020a0388811660008181526004602090815260408083209590955560098054948a16835260069091528482208054948c0290940390935582549181529290922080549285029092019091555460085461110d919068010000000000000000840281151561110757fe5b0461144d565b600955604080518381529051600160a060020a03808a1692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019695505050505050565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff1615156111a157600080fd5b81516111b490600190602085019061159f565b505050565b604080516c010000000000000000000000003390810282528251918290036014019091206000908152600a602052919091205460ff1615156111fa57600080fd5b81516111b490600090602085019061159f565b6000806000806000806000611220610eeb565b1161122a57600080fd5b3360008181526004602052604090205490965087111561124957600080fd5b86945061125585611508565b9350611262846005611463565b925061126e848461147a565b915061127c6008548661147a565b600855600160a060020a0386166000908152600460205260409020546112a2908661147a565b600160a060020a038716600090815260046020908152604080832093909355600954600690915291812080549288026801000000000000000086020192839003905560085491925010156113125761130e60095460085468010000000000000000860281151561110757fe5b6009555b60408051868152602081018490528151600160a060020a038916927fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a31139928290030190a250505050505050565b336000818152600460205260408120549081111561137f5761137f8161120d565b611387610c71565b5050565b6000610dd6348361053f565b6000806000806113a76001610d99565b116113b157600080fd5b6113bb6000610d99565b336000818152600660209081526040808320805468010000000000000000870201905560059091528120805490829055909201945092506113fd90849061053f565b905081600160a060020a03167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588483604051808381526020018281526020019250505060405180910390a2505050565b60008282018381101561145c57fe5b9392505050565b600080828481151561147157fe5b04949350505050565b60008282111561148657fe5b50900390565b600854600090670de0b6b3a764000090829064174876e8006114f56114ef692a5a058fc295ed000000880269021e19e0c9bab24000006002860a02016c02863c1f5cdae42f95400000008502016ec097ce7bc90715b34b9f10000000000161156a565b8561147a565b8115156114fe57fe5b0403949350505050565b600854600090620f424083810191810190839061155764d18c2e280082850464174876e80002018702600283620f423f1982890a8b9003010464174876e8000281151561155157fe5b0461147a565b81151561156057fe5b0495945050505050565b80600260018201045b81811015610dd657809150600281828581151561158c57fe5b040181151561159757fe5b049050611573565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106115e057805160ff191683800117855561160d565b8280016001018555821561160d579182015b8281111561160d5782518255916020019190600101906115f2565b50610efa92610c129250905b80821115610efa57600081556001016116195600a165627a7a72305820bf757ace6c45263e75b0a8eb6c539065f0ca610f7bf4378df93a0eff2d0551060029" - code1_TestNetFomo3D_deployErc721CryptoKitties = "608060405234801561001057600080fd5b5061011a806100206000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063f8a8fd6d146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b6000600180141515607c57600080fd5b603c80141515608a57600080fd5b610e1080141515609957600080fd5b620151808014151560a957600080fd5b62093a808014151560b957600080fd5b6301e133808014151560ca57600080fd5b620f42408014151560da57600080fd5b60018014151560e857600080fd5b429050905600a165627a7a72305820e8f9994ec320bbc329299a1cec491445178da2a60b219fb25e91adb9c4e4aa930029" - code_TestNetFomo3D_tooLargeStorage = "60e0604090815260808190527f313233343536373831323334353637383132333435363738313233343536373860a081815260c091909152610044916001919061009e565b50604080516060810182528181527f6162636466657467616263646665746761626364666574676162636466657467602082018181529183015261008b916002919061009e565b5034801561009857600080fd5b50610139565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100df57805160ff191683800117855561010c565b8280016001018555821561010c579182015b8281111561010c5782518255916020019190600101906100f1565b5061011892915061011c565b5090565b61013691905b808211156101185760008155600101610122565b90565b6105bb806101486000396000f3006080604052600436106100615763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166386b714e28114610066578063c2985578146100f0578063e6a01b5a14610105578063f8ac93e81461011f575b600080fd5b34801561007257600080fd5b5061007b610134565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100b557818101518382015260200161009d565b50505050905090810190601f1680156100e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100fc57600080fd5b5061007b6101c2565b34801561011157600080fd5b5061011d6004356102cc565b005b34801561012b57600080fd5b5061011d6103e0565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101ba5780601f1061018f576101008083540402835291602001916101ba565b820191906000526020600020905b81548152906001019060200180831161019d57829003601f168201915b505050505081565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060936102c6936102599383018282801561024f5780601f106102245761010080835404028352916020019161024f565b820191906000526020600020905b81548152906001019060200180831161023257829003601f168201915b50505050506103ff565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526102ba939092909183018282801561024f5780601f106102245761010080835404028352916020019161024f565b9063ffffffff61042516565b90505b90565b60006102d66101c2565b80516102ea916000916020909101906104e0565b50600090505b818110156103dc576000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181526103bf9361035d939192909183018282801561024f5780601f106102245761010080835404028352916020019161024f565b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526102ba939092909183018282801561024f5780601f106102245761010080835404028352916020019161024f565b80516103d3916000916020909101906104e0565b506001016102f0565b5050565b6040805160208101918290526000908190526103fc91816104e0565b50565b61040761055e565b50604080518082019091528151815260209182019181019190915290565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015610462578160200160208202803883390190505b50915060208201905061047e818660200151876000015161049c565b845160208501518551610494928401919061049c565b509392505050565b60005b602082106104c1578251845260209384019390920191601f199091019061049f565b50905182516020929092036101000a6000190180199091169116179052565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061052157805160ff191683800117855561054e565b8280016001018555821561054e579182015b8281111561054e578251825591602001919060010190610533565b5061055a929150610575565b5090565b604080518082019091526000808252602082015290565b6102c991905b8082111561055a576000815560010161057b5600a165627a7a723058207e0cfcb8e796037851028c428aca173ecd924a4572c51605ecebbf548fecdf3d0029" - code_TestStorageAndCpu_storageAndCpu = "6080604052600060045534801561001557600080fd5b506104c0806100256000396000f3006080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632656df4881146100a85780633755cd3c146100bf5780636f269385146100e95780637d965688146100fe578063a05b257714610116578063b0d6304d1461012e578063b648763914610162578063bbe1d75b146101ec578063f8a8fd6d14610201578063fe75faab14610216575b600080fd5b3480156100b457600080fd5b506100bd61022e565b005b3480156100cb57600080fd5b506100d7600435610230565b60408051918252519081900360200190f35b3480156100f557600080fd5b506100bd61024f565b34801561010a57600080fd5b506100d7600435610296565b34801561012257600080fd5b506100d76004356102b6565b34801561013a57600080fd5b506100d773ffffffffffffffffffffffffffffffffffffffff60043581169060243516610300565b34801561016e57600080fd5b5061017761031d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b1578181015183820152602001610199565b50505050905090810190601f1680156101de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101f857600080fd5b506100d76103ab565b34801561020d57600080fd5b506100bd6103b1565b34801561022257600080fd5b506100d76004356103c2565b565b600180548290811061023e57fe5b600091825260209091200154905081565b6040805180820190915260088082527f31323334353637380000000000000000000000000000000000000000000000006020909201918252610293916000916103f9565b50565b600080805b838110156102af576001918201910161029b565b5092915050565b600080805b838110156102af5760018054808201825560008290527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60182905591820191016102bb565b600360209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103a35780601f10610378576101008083540402835291602001916103a3565b820191906000526020600020905b81548152906001019060200180831161038657829003601f168201915b505050505081565b60025481565b60048054600101905561022e6103b1565b60006103cd826103d8565b600281905592915050565b60006103e6600283036103d8565b6103f2600184036103d8565b0192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061043a57805160ff1916838001178555610467565b82800160010185558215610467579182015b8281111561046757825182559160200191906001019061044c565b50610473929150610477565b5090565b61049191905b80821115610473576000815560010161047d565b905600a165627a7a72305820ca3a4850a926264dc27c0e3483830bac3385c61565c738281b05d747d20676670029" - code_WalletTestAccount013 = "608060405234801561001057600080fd5b5061045c806100206000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304c58438146100725780634f2be91f1461009f578063812db772146100b657806393cd5755146100e3578063d1cd64e914610189575b600080fd5b34801561007e57600080fd5b5061009d600480360381019080803590602001909291905050506101a0565b005b3480156100ab57600080fd5b506100b4610230565b005b3480156100c257600080fd5b506100e1600480360381019080803590602001909291905050506102a2565b005b3480156100ef57600080fd5b5061010e600480360381019080803590602001909291905050506102c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561014e578082015181840152602081019050610133565b50505050905090810190601f16801561017b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561019557600080fd5b5061019e61037e565b005b6000600190505b8181101561022c5760008060018154018082558091505090600182039060005260206000200160006040805190810160405280600881526020017f31323334353637380000000000000000000000000000000000000000000000008152509091909150908051906020019061021d92919061038b565b505080806001019150506101a7565b5050565b60008060018154018082558091505090600182039060005260206000200160006040805190810160405280600881526020017f61626364656667680000000000000000000000000000000000000000000000008152509091909150908051906020019061029e92919061038b565b5050565b6000600190505b81811115156102bf5780806001019150506102a9565b5050565b6000818154811015156102d257fe5b906000526020600020016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103765780601f1061034b57610100808354040283529160200191610376565b820191906000526020600020905b81548152906001019060200180831161035957829003601f168201915b505050505081565b6000808060010191505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103cc57805160ff19168380011785556103fa565b828001600101855582156103fa579182015b828111156103f95782518255916020019190600101906103de565b5b509050610407919061040b565b5090565b61042d91905b80821115610429576000816000905550600101610411565b5090565b905600a165627a7a7230582087d9880a135295a17100f63b8941457f4369204d3ccc9ce4a1abf99820eb68480029" - code_ContractEventAndLog1 = "608060405234801561001057600080fd5b50610e6c806100206000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630265ec371461010b5780630a98bcec146101155780630d16a1e31461013557806312d2c2091461013f57806340de00d314610149578063462da3081461017c57806360edcb5f1461018657806367392426146101905780636cb244f11461019a5780636e5f4528146101cd57806372f48b1a146101d7578063797d1255146101f75780638615960d14610232578063bd85753b14610249578063ce6db7c0146102f8578063d0a0eadc146103a7578063d228d484146103be578063d52aca67146103e9575b34801561010857600080fd5b50005b6101136103f3565b005b61013360048036038101908080359060200190929190505050610485565b005b61013d610535565b005b61014761057c565b005b34801561015557600080fd5b5061015e610669565b60405180826000191660001916815260200191505060405180910390f35b6101846106cc565b005b61018e610798565b005b61019861080a565b005b3480156101a657600080fd5b506101af610872565b60405180826000191660001916815260200191505060405180910390f35b6101d56108af565b005b6101f56004803603810190808035906020019092919050505061095b565b005b34801561020357600080fd5b506102306004803603810190808035151590602001909291908035151590602001909291905050506109e1565b005b34801561023e57600080fd5b50610247610a23565b005b34801561025557600080fd5b506102f6600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610aba565b005b34801561030457600080fd5b506103a5600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610bbd565b005b3480156103b357600080fd5b506103bc610c9f565b005b3480156103ca57600080fd5b506103d3610d7c565b6040518082815260200191505060405180910390f35b6103f1610d9b565b005b60008030915034905034600102600019168273ffffffffffffffffffffffffffffffffffffffff16600102600019163373ffffffffffffffffffffffffffffffffffffffff16600102600019167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860010260405180826000191660001916815260200191505060405180910390a35050565b6000806000309250349150600090505b8381101561052f5734600102600019168373ffffffffffffffffffffffffffffffffffffffff16600102600019163373ffffffffffffffffffffffffffffffffffffffff16600102600019167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860010260405180826000191660001916815260200191505060405180910390a38080600101915050610495565b50505050565b600080309150349050808273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1660405160405180910390a35050565b600080309150349050808273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860405160405180910390a48173ffffffffffffffffffffffffffffffffffffffff16600102600019163373ffffffffffffffffffffffffffffffffffffffff166001026000191634600102600019167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860010260405180826000191660001916815260200191505060405180910390a35050565b600060405180807f7472616e7366657228616464726573732c616464726573732c75696e7432353681526020017f290000000000000000000000000000000000000000000000000000000000000081525060210190506040518091039020905090565b600080309150349050808273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1660405160405180910390a38173ffffffffffffffffffffffffffffffffffffffff16600102600019163373ffffffffffffffffffffffffffffffffffffffff166001026000191634600102600019167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860010260405180826000191660001916815260200191505060405180910390a35050565b6000803091503490508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f233b34846284da6adf1006478380fa328232b0a6ede5041bfe21ea9be1b3b88a836040518082815260200191505060405180910390a35050565b600080309150349050808273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860405160405180910390a45050565b600060405180807f4465706f73697428616464726573732c686173683235362c75696e743235362981525060200190506040518091039020905090565b6000803091503490507f0c2fb0b24194d40c1d753915af9ba7185bd7a703e4374ca9fb376a4f7c91dcca338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000806000309250349150600090505b838110156109db57818373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860405160405180910390a4808060010191505061096b565b50505050565b8015157f37f1c240387a938c945ab44c1cff92ff6d224ce37ee4db1d770944201f6fcc2983604051808215151515815260200191505060405180910390a25050565b7f4e2428acf9e70e881e61b1dabc7589a9c3800a9737a6a67e29f70a1397925b2c600160c8610bb8619c40604051808560ff1681526020018467ffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff168152602001827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a1565b806040518082805190602001908083835b602083101515610af05780518252602082019150602081019050602083039250610acb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207fcb164b075277ecd24c68a6ff14fbdd71a2c6cc9cf7bec9797b8227471f740dfa836040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b7f578082015181840152602081019050610b64565b50505050905090810190601f168015610bac5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b806040518082805190602001908083835b602083101515610bf35780518252602082019150602081019050602083039250610bce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c61578082015181840152602081019050610c46565b50505050905090810190601f168015610c8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a15050565b7fb24eee86cea7aa22cfdcfaa01da5152afa042fd9a0a446ef038034c705bc25d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4487ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9da600604051808560000b81526020018460080b81526020018360100b815260200182601c0b815260200194505050505060405180910390a1565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080309150349050807f39f02551491f3fe37d6822a5987d21ac6d6385c6dc38b97a29699a5bb45f038a3384604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250505600a165627a7a723058206121fcbe7b56027d526e504c463f8f29064931be358774a6a065110af09d21b70029" - code_ContractEventAndLog2 = "608060405234801561001057600080fd5b50610369806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634247b80e14610066578063d0e30db014610070578063d228d4841461007a575b34801561006357600080fd5b50005b61006e6100a5565b005b6100786102b6565b005b34801561008657600080fd5b5061008f61031e565b6040518082815260200191505060405180910390f35b6000806000630420042076010000000000000000000000000000000000000000000002925063042004206f01000000000000000000000000000000029150630420042060010290507f88c75e92614e379252c5b1847e9753f9668ebb5ebb9a148333bdf0458d3d9cdf838383604051808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152602001836effffffffffffffffffffffffffffff19166effffffffffffffffffffffffffffff191681526020018260001916600019168152602001935050505060405180910390a1828282604051808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152602001836effffffffffffffffffffffffffffff19166effffffffffffffffffffffffffffff191681526020018260001916600019168152602001935050505060405180910390a08060001916826effffffffffffffffffffffffffffff19168475ffffffffffffffffffffffffffffffffffffffffffff19167f47f711f8177f4e1a7a44e07049543e0b69ef4b740c817c404c3ef911623fa89160405160405180910390a48060001916826effffffffffffffffffffffffffffff19168475ffffffffffffffffffffffffffffffffffffffffffff191660405160405180910390a3505050565b600080309150349050808273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbeabacc8ffedac16e9a60acdb2ca743d80c2ebb44977a93fa8e483c74d2b35a860405160405180910390a45050565b60003073ffffffffffffffffffffffffffffffffffffffff16319050905600a165627a7a72305820f5c3bb96350b175387f95b45f915f736ba0468b0880f65c542b8b55d261e72760029" - - code_OriginEnergyLimit001 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5061014e8061003a6000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663329000b58114610045575b600080fd5b34801561005157600080fd5b50d3801561005e57600080fd5b50d2801561006b57600080fd5b50610077600435610089565b60408051918252519081900360200190f35b604080516003808252608082019092526000916060919060208201838038833901905050905060018160008151811015156100c057fe5b602090810290910101528051600290829060019081106100dc57fe5b602090810290910101528051600390829060029081106100f857fe5b60209081029091010152805181908490811061011057fe5b906020019060200201519150509190505600a165627a7a7230582058dd457e2aeba46e78dd8b9c36b777d362763c05ec1ad62e0d79de51ff3dde790029" - code_OriginEnergyLimit004 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5061014e8061003a6000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663329000b58114610045575b600080fd5b34801561005157600080fd5b50d3801561005e57600080fd5b50d2801561006b57600080fd5b50610077600435610089565b60408051918252519081900360200190f35b604080516003808252608082019092526000916060919060208201838038833901905050905060018160008151811015156100c057fe5b602090810290910101528051600290829060019081106100dc57fe5b602090810290910101528051600390829060029081106100f857fe5b60209081029091010152805181908490811061011057fe5b906020019060200201519150509190505600a165627a7a723058206503efa46ed431a2604563d7764b4b9e6ca03238259cb133c878592fc43a4b670029" - - - code_ContractTrcToken001_transferTokenContract = "6080604052d3600055d2600155346002556101418061001f6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b6100636100b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef98e66e60dd4b38e00b05de418da3154e7570029" - code_ContractTrcToken002_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken005_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken006_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken011_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken011_resultContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken012_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken014_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken014_resultContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken016_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken016_resultContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken017_recieveTokenContract = "60806040526000805560c5806100166000396000f30060806040526004361060485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166362548c7b8114604a578063890eba68146050575b005b6048608c565b348015605b57600080fd5b50d38015606757600080fd5b50d28015607357600080fd5b50607a6093565b60408051918252519081900360200190f35b6001600055565b600054815600a165627a7a723058204c4f1bb8eca0c4f1678cc7cc1179e03d99da2a980e6792feebe4d55c89c022830029" - code_ContractTrcToken042_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken042_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken043_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken043_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken046_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken047_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code2_ContractTrcToken023_tokenTest = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a7230582006508824be321d3ad4594b1b2dae9099960f982a99b5e1121896fbbb115967780029" - code_ContractTrcToken023_tokenTest = "60806040526000805560b3806100166000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663890eba6881146045575b6001600055005b348015605057600080fd5b50d38015605c57600080fd5b50d28015606857600080fd5b50606f6081565b60408051918252519081900360200190f35b600054815600a165627a7a72305820fc51dbe84825144f5e50d2ab8c418a5b1bfe75a31b054528816f2311b2632d6d0029" - code_ContractTrcToken026_BTest = "6080604052610145806100136000396000f3006080604052600436106100275763ffffffff60e060020a600035041663cb35b7e28114610029575b005b61002773ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356064358373ffffffffffffffffffffffffffffffffffffffff1660405180807f7472616e7328616464726573732c75696e743235362c747263546f6b656e2900815250601f019050604051809103902060e060020a90048484846040518463ffffffff1660e060020a028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506000604051808303816000875af150505050505050505600a165627a7a72305820f80979e10a32bf6d6995716d7c5b159944473c2db9ac4ca5e780cfcd620261260029" - code1_ContractTrcToken026_CTest = "608060405260d9806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634f53d8a881146040575b005b603e73ffffffffffffffffffffffffffffffffffffffff6004351660243560443560405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad094505050505015801560a7573d6000803e3d6000fd5b505050505600a165627a7a723058203db4692a33e354b8bb6b6274f3c25ca36facafc80e996629c2b7c8e79ef40f2e0029" - code1_ContractTrcToken026_tokenTest = "6080604052610257806100136000396000f3006080604052600436106100325763ffffffff60e060020a6000350416636409a1c0811461003457806383efe58114610067575b005b61003273ffffffffffffffffffffffffffffffffffffffff6004358116906024358116906044351660643560843561009a565b61003273ffffffffffffffffffffffffffffffffffffffff60043581169060243581169060443516606435608435610163565b604080517f7472616e734328616464726573732c616464726573732c75696e743235362c7481527f7263546f6b656e290000000000000000000000000000000000000000000000006020820152815190819003602801812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff8781166004840152868116602484015260448301869052606483018590529251928816929091608480820192600092909190829003018183875af1505050505050505050565b604080517f7472616e734328616464726573732c616464726573732c75696e743235362c7481527f7263546f6b656e290000000000000000000000000000000000000000000000006020820152815190819003602801812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff87811660048401528681166024840152604483018690526064830185905292519288169290916084808201926000929091908290030181865af45050505050505050505600a165627a7a72305820554cb78d3d6082a8b93092e5edd2b66b83a47707eb8cbbfdbb06a0806fce72840029" - code_ContractTrcToken027_BTest = "6080604052610145806100136000396000f3006080604052600436106100275763ffffffff60e060020a600035041663cb35b7e28114610029575b005b61002773ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356064358373ffffffffffffffffffffffffffffffffffffffff1660405180807f7472616e7328616464726573732c75696e743235362c747263546f6b656e2900815250601f019050604051809103902060e060020a90048484846040518463ffffffff1660e060020a028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506000604051808303816000875af150505050505050505600a165627a7a72305820f80979e10a32bf6d6995716d7c5b159944473c2db9ac4ca5e780cfcd620261260029" - code_ContractTrcToken027_CTest = "608060405260d9806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634f53d8a881146040575b005b603e73ffffffffffffffffffffffffffffffffffffffff6004351660243560443560405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad094505050505015801560a7573d6000803e3d6000fd5b505050505600a165627a7a723058203db4692a33e354b8bb6b6274f3c25ca36facafc80e996629c2b7c8e79ef40f2e0029" - - code_ContractTrcToken027_tokenTest = "6080604052610257806100136000396000f3006080604052600436106100325763ffffffff60e060020a6000350416636409a1c0811461003457806383efe58114610067575b005b61003273ffffffffffffffffffffffffffffffffffffffff6004358116906024358116906044351660643560843561009a565b61003273ffffffffffffffffffffffffffffffffffffffff60043581169060243581169060443516606435608435610163565b604080517f7472616e734328616464726573732c616464726573732c75696e743235362c7481527f7263546f6b656e290000000000000000000000000000000000000000000000006020820152815190819003602801812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff8781166004840152868116602484015260448301869052606483018590529251928816929091608480820192600092909190829003018183875af1505050505050505050565b604080517f7472616e734328616464726573732c616464726573732c75696e743235362c7481527f7263546f6b656e290000000000000000000000000000000000000000000000006020820152815190819003602801812063ffffffff60e060020a91829004908116909102825273ffffffffffffffffffffffffffffffffffffffff87811660048401528681166024840152604483018690526064830185905292519288169290916084808201926000929091908290030181865af45050505050505050505600a165627a7a72305820554cb78d3d6082a8b93092e5edd2b66b83a47707eb8cbbfdbb06a0806fce72840029" - code_ContractTrcToken028_tokenTest = "608060405260016000556102a5806100186000396000f3006080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630dbe671f811461005b578063baf462821461009c578063d46300fd146100a9575b600080fd5b34801561006757600080fd5b50d3801561007457600080fd5b50d2801561008157600080fd5b5061008a6100b1565b60408051918252519081900360200190f35b6100a76004356100b7565b005b61008a610182565b60005481565b60006100c1610188565b604051809103906000f0801580156100dd573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663205e3c9c836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561014f57600080fd5b505af1158015610163573d6000803e3d6000fd5b505050506040513d602081101561017957600080fd5b50516000555050565b60005490565b60405160e28061019883390190560060806040526000805560cc806100166000396000f30060806040526004361060485763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663205e3c9c8114604a578063890eba68146065575b005b6053600435608f565b60408051918252519081900360200190f35b348015607057600080fd5b50d38015607c57600080fd5b50d28015608857600080fd5b506053609a565b506009600081905590565b600054815600a165627a7a7230582000d7b938c0aa356a26f89e8816d8cafa65acdc21fbfc77112e7b774cc35ec6fa0029a165627a7a723058204f7b7aa7d1a83605c6830eee3ee774b9a06722e6c70a9dce28a51064abe834160029" - code_ContractTrcToken054_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken055_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken060_transferTokenContract = "6080604052d3600055d2600155346002556101418061001f6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b6100636100b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef98e66e60dd4b38e00b05de418da3154e7570029" - code_ContractTrcToken061_transferTokenContract = "6080604052d3600055d2600155346002556101418061001f6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b6100636100b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef98e66e60dd4b38e00b05de418da3154e7570029" - code_ContractTrcToken062_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken062_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken063_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken063_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken064_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken064_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken066_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken066_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken067_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken067_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken068_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - - code_ContractTrcToken068_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken071_transferTokenContract = "608060405261022e806100136000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f68114610079578063544051aa14610093578063584d4262146100a757806371dc08ce146100cd5780639663d3f2146100ee578063a730416e14610102575b005b610077600160a060020a0360043516602435604435610119565b610077600160a060020a0360043516610159565b6100bb600160a060020a036004351661019c565b60408051918252519081900360200190f35b6100d56101ad565b6040805192835260208301919091528051918290030190f35b610077600160a060020a03600435166101b3565b6100bb600160a060020a03600435166024356101f1565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad0945050505050158015610153573d6000803e3d6000fd5b50505050565b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d0945050505050158015610198573d6000803e3d6000fd5b5050565b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090600190678000000000000001908381818185878a84d0945050505050158015610198573d6000803e3d6000fd5b600160a060020a039190911690d1905600a165627a7a72305820d37032d630dfb2b80dac39db09b9eabfc228e157e20131e49ccde99a2cc3e2710029" - code_ContractTrcToken071_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken073_transferTokenContract = "608060405260e5806100126000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663dfc0db988114606f575b34d2d37f70536dc19abf7e0862a7afc0755f548bfd5f0b40cbd9fc87fa19b2e50b454a5660405160405180910390a4005b6078600435607a565b005b604080513481529051d291d3913385d1917fe8e04df6a82498bd5fb1fe7f2168f525c54ee1003b3a56638c858e94fd9e4854919081900360200190a4505600a165627a7a72305820dca795a21bfc9451314c14306b0220175611298bdb59c8b2cfdb1120cb3fda390029" - code_ContractTrcToken074_transferTokenContract = "608060405260e5806100126000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663dfc0db988114606f575b34d2d37f70536dc19abf7e0862a7afc0755f548bfd5f0b40cbd9fc87fa19b2e50b454a5660405160405180910390a4005b6078600435607a565b005b604080513481529051d291d3913385d1917fe8e04df6a82498bd5fb1fe7f2168f525c54ee1003b3a56638c858e94fd9e4854919081900360200190a4505600a165627a7a72305820dca795a21bfc9451314c14306b0220175611298bdb59c8b2cfdb1120cb3fda390029" - code_ContractTrcToken075_transferTokenContract = "608060405261019c806100136000396000f3006080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632ab5cf918114610087578063dfc0db9814610091578063f9a677791461009c575b34d2d37f70536dc19abf7e0862a7afc0755f548bfd5f0b40cbd9fc87fa19b2e50b454a5660405160405180910390a4005b61008f6100a4565b005b61008f6004356100eb565b61008f61012a565b604080513481529051d291d391336780000000000f425319d1917fe8e04df6a82498bd5fb1fe7f2168f525c54ee1003b3a56638c858e94fd9e4854919081900360200190a4565b604080513481529051d291d3913385d1917fe8e04df6a82498bd5fb1fe7f2168f525c54ee1003b3a56638c858e94fd9e4854919081900360200190a450565b604080513481529051d291d391336780000000000f4253d1917fe8e04df6a82498bd5fb1fe7f2168f525c54ee1003b3a56638c858e94fd9e4854919081900360200190a45600a165627a7a723058204eef0c9d8221d37dbe366e9af0815246c4f9239d3f22f27b9db0aa0a3e23aa580029" - code_ContractTrcToken0552_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken0553_transferTokenContract = "6080604052610118806100136000396000f30060806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece78114604d57806371dc08ce146074575b600080fd5b607273ffffffffffffffffffffffffffffffffffffffff600435166024356044356098565b005b607a60e4565b60408051938452602084019290925282820152519081900360600190f35b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560de573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820b8d4f8ea5443a03d615ea5dfe7a7435498522f9c7abeb25583d953ee2d20be4a0029" - code_ContractTrcToken0612_transferTokenContract = "6080604052d3600055d2600155346002556101418061001f6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b6100636100b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef98e66e60dd4b38e00b05de418da3154e7570029" - code_ContractTrcToken0613_transferTokenContract = "6080604052d3600055d2600155346002556101418061001f6000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b6100636100b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef98e66e60dd4b38e00b05de418da3154e7570029" - code_ContractTrcToken0672_transferTokenContract = "6080604052610343806100136000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663144401f6811461009a5780631ea31431146100b45780632c5c6641146100c8578063544051aa146100dc578063584d4262146100f057806371dc08ce1461011657806393bc91fd14610137578063a730416e1461014b578063acea104514610162575b005b610098600160a060020a0360043516602435604435610176565b610098600160a060020a03600435166101b6565b610098600160a060020a03600435166101f1565b610098600160a060020a0360043516610231565b610104600160a060020a0360043516610270565b60408051918252519081900360200190f35b61011e610281565b6040805192835260208301919091528051918290030190f35b610098600160a060020a0360043516610287565b610104600160a060020a03600435166024356102c7565b610098600160a060020a03600435166102d8565b604051600160a060020a0384169083156108fc029084908490600081818185878a8ad09450505050501580156101b0573d6000803e3d6000fd5b50505050565b604051600160a060020a038216906000906000199082908181818181878a82d09450505050501580156101ed573d6000803e3d6000fd5b5050565b604051600160a060020a0382169060009067800000000000000090620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b604051600160a060020a03821690600090600190680200000000000f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a0316620f4241d190565bd3d29091565b604051600160a060020a03821690600090677fffffffffffffff90620f4241908381818185878a84d09450505050501580156101ed573d6000803e3d6000fd5b600160a060020a039190911690d190565b604051600160a060020a038216906108fc90600090678000000000000001908281818185828a8ad09450505050501580156101ed573d6000803e3d6000fd00a165627a7a72305820716217ff39873b1f852cdc214cfb38a4c2337d18fbd1128b69b2866f7f24ae1c0029" - code_ContractTrcToken0672_recieveTokenContract = "608060405260658060116000396000f30060806040819052d38152d260a0523460c0527fd1ed7a3c020c4f5939654147940a147a8e4e638fa1e8f5664b5efbd1e1f3c4a690606090a10000a165627a7a72305820ea1e6d9606638e6c9e72dcdcc749561b826ec85713c003fae9d4700a2919040f0029" - code_ContractTrcToken029_tokenTest = "608060405261034f806100136000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630dbe671f8114610050578063c3e911d4146100a8575b600080fd5b34801561005c57600080fd5b50d3801561006957600080fd5b50d2801561007657600080fd5b5061007f6100b8565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100b66004356024356100d4565b005b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60006100de6101de565b604051809103906000f0801580156100fa573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663071f65a883856040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182815260200192505050602060405180830381600087803b15801561017457600080fd5b505af1158015610188573d6000803e3d6000fd5b505050506040513d602081101561019e57600080fd5b50506000805473ffffffffffffffffffffffffffffffffffffffff191673ffffffffffffffffffffffffffffffffffffffff929092169190911790555050565b604051610135806101ef83390190560060806040526000805561011e806100176000396000f30060806040526004361060525763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663071f65a881146054578063890eba68146074578063f96339301460b0575b005b606060043560243560da565b604080519115158252519081900360200190f35b348015607f57600080fd5b50d38015608b57600080fd5b50d28015609757600080fd5b50609e60e6565b60408051918252519081900360200190f35b34801560bb57600080fd5b50d3801560c757600080fd5b50d2801560d357600080fd5b50609e60ec565b50506009600090815590565b60005481565b600054905600a165627a7a72305820a699d9eec788d2a222b703af447d9c2ddffb626fc07a57834af8e3f9bce64dc90029a165627a7a72305820626050611353c2f66f9b94e3935c21fd4dad7cc494b7459f3597451e1b6004de0029" - code_ContractTrcToken030_tokenTest = "608060405260a9806100126000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663cbf0b0c081146043575b600080fd5b606273ffffffffffffffffffffffffffffffffffffffff600435166064565b005b8073ffffffffffffffffffffffffffffffffffffffff16ff00a165627a7a72305820ad0052aaf68fac3eec3da8d49432d1529ec4df4fa82c1dd2847c088f2575ddb10029" - code_ContractTrcToken031_tokenTest = "608060405260a9806100126000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663cbf0b0c081146043575b600080fd5b606273ffffffffffffffffffffffffffffffffffffffff600435166064565b005b8073ffffffffffffffffffffffffffffffffffffffff16ff00a165627a7a72305820ad0052aaf68fac3eec3da8d49432d1529ec4df4fa82c1dd2847c088f2575ddb10029" - code_ContractTrcToken034_tokenTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101638061003a6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634957baa18114610050578063e308c52714610079575b600080fd5b61007773ffffffffffffffffffffffffffffffffffffffff600435166024356044356100a0565b005b61007773ffffffffffffffffffffffffffffffffffffffff600435166024356044356100ea565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad09450505050501580156100e7573d6000803e3d6000fd5b50fe5b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad0945050505050158015610131573d6000803e3d6000fd5b50600080fd00a165627a7a723058204c2d6334ac3ea724949482094951c3b7d11fea1e87b58110d562ef47ddd45c7b0029" - code_ContractTrcToken035_tokenTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101638061003a6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634957baa18114610050578063e308c52714610079575b600080fd5b61007773ffffffffffffffffffffffffffffffffffffffff600435166024356044356100a0565b005b61007773ffffffffffffffffffffffffffffffffffffffff600435166024356044356100ea565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad09450505050501580156100e7573d6000803e3d6000fd5b50fe5b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084908490600081818185878a8ad0945050505050158015610131573d6000803e3d6000fd5b50600080fd00a165627a7a723058204c2d6334ac3ea724949482094951c3b7d11fea1e87b58110d562ef47ddd45c7b0029" - code_ContractTrcToken036_transferTokenWithPureTest = "60806040526101db806100136000396000f3006080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639d9e5a388114610042575b005b34801561004e57600080fd5b50d3801561005b57600080fd5b50d2801561006857600080fd5b5061004073ffffffffffffffffffffffffffffffffffffffff600435166024356040805134815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d2815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d3815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160405173ffffffffffffffffffffffffffffffffffffffff831690d280156108fc0291d390600081818185878a8ad0945050505050158015610167573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8316903480156108fc02916000818181858888f193505050501580156101aa573d6000803e3d6000fd5b5050505600a165627a7a7230582052825d8daae4fb444ce76f049e019c2c66d7b29584058ee7cc88a389e22f41dc0029" - code_ContractTrcToken036_transferTokenWithViewTest = "60806040526101db806100136000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663abecd9838114610042575b005b34801561004e57600080fd5b50d3801561005b57600080fd5b50d2801561006857600080fd5b5061004073ffffffffffffffffffffffffffffffffffffffff600435166024356040805134815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d2815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d3815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160405173ffffffffffffffffffffffffffffffffffffffff831690d280156108fc0291d390600081818185878a8ad0945050505050158015610167573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8316903480156108fc02916000818181858888f193505050501580156101aa573d6000803e3d6000fd5b5050505600a165627a7a7230582020ddb4a20df32d91af717609926b277d218ac25965d8003ff48adf57a0f10f950029" - code_ContractTrcToken036_transferTokenWithOutPayableTest = "60806040526101db806100136000396000f3006080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632b38e5478114610042575b005b34801561004e57600080fd5b50d3801561005b57600080fd5b50d2801561006857600080fd5b5061004073ffffffffffffffffffffffffffffffffffffffff600435166024356040805134815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d2815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d3815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160405173ffffffffffffffffffffffffffffffffffffffff831690d280156108fc0291d390600081818185878a8ad0945050505050158015610167573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8316903480156108fc02916000818181858888f193505050501580156101aa573d6000803e3d6000fd5b5050505600a165627a7a723058203c20218af63eda8b09394f27964892ee199fa89d93e03506f9a0390dc0b9605d0029" - code_ContractTrcToken037_receiveTrc10Test = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060ba806100396000396000f300608060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663ec17fded81146040575b005b348015604b57600080fd5b50d38015605757600080fd5b50d28015606357600080fd5b50603e6004356024356044353082d18314607c57600080fd5b3382d18114608957600080fd5b5050505600a165627a7a723058205da58c4884728798dd87f6219bad7230ff56c1859ca6402bcc3f1584ca0af8080029" - code_ContractTrcToken037_tokenTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101ff8061003a6000396000f3006080604052600436106100275763ffffffff60e060020a6000350416639d01174f811461002c575b600080fd5b61004d73ffffffffffffffffffffffffffffffffffffffff6004351661004f565b005b30d39081d19073ffffffffffffffffffffffffffffffffffffffff831690d1d2821461007a57600080fd5bd2821461008657600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc02908490d390600081818185878a8ad09450505050501580156100cd573d6000803e3d6000fd5b5030d3d1156100db57600080fd5b80820173ffffffffffffffffffffffffffffffffffffffff8416d3d11461010157600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660405180807f636865636b54726331302875696e743235362c747263546f6b656e2c75696e7481526020017f32353629000000000000000000000000000000000000000000000000000000008152506024019050604051809103902060e060020a9004838301d360006040518463ffffffff1660e060020a028152600401808481526020018381526020018260ff16815260200193505050506000604051808303816000875af19250505015156101ce57600080fd5b5050505600a165627a7a72305820e91d5a5eda7d9da85983cf55171fa13b3dbf99ebe851321c02831b3f74d7bafc0029" - code_ContractTrcToken038_tokenTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101b78061003a6000396000f3006080604052600436106100275763ffffffff60e060020a6000350416639d01174f811461002c575b600080fd5b61004d73ffffffffffffffffffffffffffffffffffffffff6004351661004f565b005b30d39081d19073ffffffffffffffffffffffffffffffffffffffff831690d1d2821461007a57600080fd5bd2821461008657600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc02908490d390600081818185878a8ad09450505050501580156100cd573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff1660405180807f4173736572744572726f72282900000000000000000000000000000000000000815250600d019050604051809103902060e060020a90046040518163ffffffff1660e060020a0281526004016000604051808303816000875af192505050151561015457600080fd5b30d3d1821461016257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316d3d1811461018657600080fd5b5050505600a165627a7a72305820962d49fbc330584b84b59e537e7450a5ca38cccf106466907e402f8653ab1dee0029" - code_ContractTrcToken038_BTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506094806100396000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631966216581146040575b005b348015604b57600080fd5b50d38015605757600080fd5b50d28015606357600080fd5b50603efe00a165627a7a723058200fc1cef003f4eb28c1edc4c7b62c1012237dd9db791e8dac7a9671319ac003440029" - code_ContractTrcToken039_ProxyTest = "60806040526101bc806100136000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633659cfe681146100965780635c60da1b146100e0575b60005473ffffffffffffffffffffffffffffffffffffffff1680151561007057600080fd5b6040513660008237600081368185600019f43d6000833e808015610092573d83f35b3d83fd5b3480156100a257600080fd5b50d380156100af57600080fd5b50d280156100bc57600080fd5b506100de73ffffffffffffffffffffffffffffffffffffffff60043516610138565b005b3480156100ec57600080fd5b50d380156100f957600080fd5b50d2801561010657600080fd5b5061010f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6000805473ffffffffffffffffffffffffffffffffffffffff191673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a7230582047b47a8f57880f0c2c028e44406b1868bbee2151938629caad7b65668d6a8a140029" - code_ContractTrcToken039_ATest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060de806100396000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630455012181146043575b600080fd5b606860043573ffffffffffffffffffffffffffffffffffffffff60243516604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085906000818181858888f1935050505015801560ac573d6000803e3d6000fd5b505050505600a165627a7a72305820542cde58d75afb60ec2226b95c592a973666b56931d8ea8d7ed0d0a6bd16e7ea0029" - code_ContractTrcToken039_BTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060e2806100396000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630455012181146043575b600080fd5b606860043573ffffffffffffffffffffffffffffffffffffffff60243516604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085908490600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820cccc1489247eb5366214a034107ebfbea955aac5229e03907a82321a1a4484240029" - code_ContractTrcToken041_transferTokenContract = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820d7ac1a3b49eeff286b7f2402b93047e60deb6dba47f4f889d921dbcb3bb81f8a0029" - code_ContractTrcToken048_transferTokenContract = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5061010f8061003a6000396000f30060806040526004361060485763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a94b16d08114604d578063c0063993146065575b600080fd5b6053606b565b60408051918252519081900360200190f35b605360a7565b6040805134815290516000917ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c744919081900360200190a1503490565b60408051d2815290516000917ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c744919081900360200190a150d2905600a165627a7a7230582016ef7f5bc613147860a1de990c4258eaa2ca12ceb1ab21cd9069f50d1db238020029" - code_ContractTrcToken049_transferTokenContract = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820d7ac1a3b49eeff286b7f2402b93047e60deb6dba47f4f889d921dbcb3bb81f8a0029" - code_ContractTrcToken050_transferTokenContract = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820d7ac1a3b49eeff286b7f2402b93047e60deb6dba47f4f889d921dbcb3bb81f8a0029" - code_ContractTrcToken051_transferTokenContract = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820d7ac1a3b49eeff286b7f2402b93047e60deb6dba47f4f889d921dbcb3bb81f8a0029" - code_ContractTrcToken052_transferTokenContract = "608060405260e2806100126000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633be9ece781146043575b600080fd5b606873ffffffffffffffffffffffffffffffffffffffff60043516602435604435606a565b005b60405173ffffffffffffffffffffffffffffffffffffffff84169082156108fc029083908590600081818185878a8ad094505050505015801560b0573d6000803e3d6000fd5b505050505600a165627a7a72305820d7ac1a3b49eeff286b7f2402b93047e60deb6dba47f4f889d921dbcb3bb81f8a0029" - code_ContractTrcToken036_tokenTest = "60806040526101b4806100136000396000f3006080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632849fa4f8114610042575b005b61004073ffffffffffffffffffffffffffffffffffffffff600435166024356040805134815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d2815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160408051d3815290517ff82c50f1848136e6c140b186ea0c768b7deda5efffe42c25e96336a90b26c7449181900360200190a160405173ffffffffffffffffffffffffffffffffffffffff831690d280156108fc0291d390600081818185878a8ad0945050505050158015610140573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff8316903480156108fc02916000818181858888f19350505050158015610183573d6000803e3d6000fd5b5050505600a165627a7a72305820ddc15bf8809c92f9c6b6175f2ce1245ef1d65e5fbeccc2bb2772980cedee1eee0029" - code_ContractTrcToken076_originTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506103698061003a6000396000f3006080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166317ca5481811461008757806360d10813146100ca57806367e404ce146100f95780638be988cd14610151578063938b5f3214610159578063e8da042414610188578063f8a8fd6d14610190575b600080fd5b34801561009357600080fd5b50d380156100a057600080fd5b50d280156100ad57600080fd5b506100b66101c1565b604080519115158252519081900360200190f35b3480156100d657600080fd5b50d380156100e357600080fd5b50d280156100f057600080fd5b506100b66101e3565b34801561010557600080fd5b50d3801561011257600080fd5b50d2801561011f57600080fd5b50610128610204565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100b6610220565b34801561016557600080fd5b50d3801561017257600080fd5b50d2801561017f57600080fd5b50610128610241565b6100b661025d565b34801561019c57600080fd5b50d380156101a957600080fd5b50d280156101b657600080fd5b506101bf61027f565b005b6001547501000000000000000000000000000000000000000000900460ff1681565b60015474010000000000000000000000000000000000000000900460ff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6001547501000000000000000000000000000000000000000000900460ff1690565b600080543273ffffffffffffffffffffffffffffffffffffffff199182168117928390556001805475ff0000000000000000000000000000000000000000001993163390811774ff00000000000000000000000000000000000000001916921474010000000000000000000000000000000000000000029190911791821673ffffffffffffffffffffffffffffffffffffffff92831692909316919091147501000000000000000000000000000000000000000000029190911790555600a165627a7a72305820487fd902512ac719158b1ec219e9e6648b9f47f7f0396d24044f4dca1de4a3c60029" - code_ContractTrcToken077_AddressTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060b6806100396000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636241c1d881146043575b600080fd5b348015604e57600080fd5b50d38015605a57600080fd5b50d28015606657600080fd5b50606d607f565b60408051918252519081900360200190f35b6040513090819052905600a165627a7a723058207faa3a33e3b875c23563f2fb8ee4506affcd21d818c8399a71dd76fa973f487d0029" - code_ContractTrcToken077_AddressTest1 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506092806100396000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636241c1d881146043575b600080fd5b6049605b565b60408051918252519081900360200190f35b6040513090819052905600a165627a7a723058200245dccce3c678939aba5ad813f3fd8d551ef14f01409a8e36bc3dac301113c40029" - code_ContractTrcToken078_AddressTest1 = "6080604052610264806100136000396000f30060806040526004361061003d5763ffffffff60e060020a600035041663648efe8b811461003f578063b45f578b14610059578063d818452114610073575b005b61003d600160a060020a036004358116906024351661008d565b61003d600160a060020a036004358116906024351661011c565b61003d600160a060020a03600435811690602435166101a9565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303816000875af2505050505050565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381865af4505050505050565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303816000875af15050505050505600a165627a7a7230582068a85b5cb5a41f10a7ba8250baed5adf37129ff04399bccae69e483fc85448a90029" - code_ContractTrcToken078_AddressTest2 = "6080604052610166806100136000396000f3006080604052600436106100325763ffffffff60e060020a6000350416630223024e8114610034578063a03fa7e314610055575b005b61003273ffffffffffffffffffffffffffffffffffffffff60043516610076565b61003273ffffffffffffffffffffffffffffffffffffffff600435166100f7565b8073ffffffffffffffffffffffffffffffffffffffff16600560405180807f73657449282900000000000000000000000000000000000000000000000000008152506006019050604051809103902060e060020a9004906040518263ffffffff1660e060020a02815260040160006040518083038185885af1505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff82169060009060059082818181858883f19350505050158015610136573d6000803e3d6000fd5b50505600a165627a7a72305820ede28ac9884104396c5d52bbf3f480cb637f61bc331c2dc561670e6d2700ad630029" - code_ContractTrcToken078_AddressTest3 = "6080604052610172806100136000396000f30060806040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166367e404ce8114610087578063938b5f32146100df575b6040805132815233602082015281517fdaf0d4aa9a5679e832ac921da67b43572b4326ee2565442d3ed255b48cfb5161929181900390910190a1005b34801561009357600080fd5b50d380156100a057600080fd5b50d280156100ad57600080fd5b506100b661010e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100eb57600080fd5b50d380156100f857600080fd5b50d2801561010557600080fd5b506100b661012a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a7230582084426e82a8fde9cefb0ae9f1561ce743354adada27d217c8614c28829eecbcda0029" - code_ContractTrcToken078_AddressTest4 = "6080604052610264806100136000396000f30060806040526004361061003d5763ffffffff60e060020a600035041663648efe8b811461003f578063b45f578b14610059578063d818452114610073575b005b61003d600160a060020a036004358116906024351661008d565b61003d600160a060020a036004358116906024351661011c565b61003d600160a060020a03600435811690602435166101a9565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303816000875af2505050505050565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381865af4505050505050565b81600160a060020a031660405180807f7472616e73666572546f286164647265737329000000000000000000000000008152506013019050604051809103902060e060020a9004826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a031681526020019150506000604051808303816000875af15050505050505600a165627a7a7230582068a85b5cb5a41f10a7ba8250baed5adf37129ff04399bccae69e483fc85448a90029" - code_ContractTrcToken078_AddressTest5 = "6080604052610166806100136000396000f3006080604052600436106100325763ffffffff60e060020a6000350416630223024e8114610034578063a03fa7e314610055575b005b61003273ffffffffffffffffffffffffffffffffffffffff60043516610076565b61003273ffffffffffffffffffffffffffffffffffffffff600435166100f7565b8073ffffffffffffffffffffffffffffffffffffffff16600560405180807f73657449282900000000000000000000000000000000000000000000000000008152506006019050604051809103902060e060020a9004906040518263ffffffff1660e060020a02815260040160006040518083038185885af1505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff82169060009060059082818181858883f19350505050158015610136573d6000803e3d6000fd5b50505600a165627a7a72305820ede28ac9884104396c5d52bbf3f480cb637f61bc331c2dc561670e6d2700ad630029" - code_ContractTrcToken078_AddressTest6 = "6080604052610172806100136000396000f30060806040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166367e404ce8114610087578063938b5f32146100df575b6040805132815233602082015281517fdaf0d4aa9a5679e832ac921da67b43572b4326ee2565442d3ed255b48cfb5161929181900390910190a1005b34801561009357600080fd5b50d380156100a057600080fd5b50d280156100ad57600080fd5b506100b661010e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100eb57600080fd5b50d380156100f857600080fd5b50d2801561010557600080fd5b506100b661012a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a7230582084426e82a8fde9cefb0ae9f1561ce743354adada27d217c8614c28829eecbcda0029" - code_veryLarge = "60806040523480156200001157600080fd5b50d380156200001f57600080fd5b50d280156200002d57600080fd5b5061c2ec806200003e6000396000f3fe6080604052600436106200003c577c010000000000000000000000000000000000000000000000000000000060003504631a695230811462000041575b600080fd5b62000077600480360360208110156200005957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1662000079565b005b6040516000906200008a906200c1dc565b604051809103906000f080158015620000a7573d6000803e3d6000fd5b5050604051620000b7906200c1dc565b604051809103906000f080158015620000d4573d6000803e3d6000fd5b5050604051620000e4906200c1dc565b604051809103906000f08015801562000101573d6000803e3d6000fd5b505060405162000111906200c1dc565b604051809103906000f0801580156200012e573d6000803e3d6000fd5b50506040516200013e906200c1dc565b604051809103906000f0801580156200015b573d6000803e3d6000fd5b50506040516200016b906200c1dc565b604051809103906000f08015801562000188573d6000803e3d6000fd5b505060405162000198906200c1dc565b604051809103906000f080158015620001b5573d6000803e3d6000fd5b5050604051620001c5906200c1dc565b604051809103906000f080158015620001e2573d6000803e3d6000fd5b5050604051620001f2906200c1dc565b604051809103906000f0801580156200020f573d6000803e3d6000fd5b50506040516200021f906200c1dc565b604051809103906000f0801580156200023c573d6000803e3d6000fd5b50506040516200024c906200c1dc565b604051809103906000f08015801562000269573d6000803e3d6000fd5b505060405162000279906200c1dc565b604051809103906000f08015801562000296573d6000803e3d6000fd5b5050604051620002a6906200c1dc565b604051809103906000f080158015620002c3573d6000803e3d6000fd5b5050604051620002d3906200c1dc565b604051809103906000f080158015620002f0573d6000803e3d6000fd5b505060405162000300906200c1dc565b604051809103906000f0801580156200031d573d6000803e3d6000fd5b50506040516200032d906200c1dc565b604051809103906000f0801580156200034a573d6000803e3d6000fd5b50506040516200035a906200c1dc565b604051809103906000f08015801562000377573d6000803e3d6000fd5b505060405162000387906200c1dc565b604051809103906000f080158015620003a4573d6000803e3d6000fd5b5050604051620003b4906200c1dc565b604051809103906000f080158015620003d1573d6000803e3d6000fd5b5050604051620003e1906200c1dc565b604051809103906000f080158015620003fe573d6000803e3d6000fd5b50506040516200040e906200c1dc565b604051809103906000f0801580156200042b573d6000803e3d6000fd5b50506040516200043b906200c1dc565b604051809103906000f08015801562000458573d6000803e3d6000fd5b505060405162000468906200c1dc565b604051809103906000f08015801562000485573d6000803e3d6000fd5b505060405162000495906200c1dc565b604051809103906000f080158015620004b2573d6000803e3d6000fd5b5050604051620004c2906200c1dc565b604051809103906000f080158015620004df573d6000803e3d6000fd5b5050604051620004ef906200c1dc565b604051809103906000f0801580156200050c573d6000803e3d6000fd5b50506040516200051c906200c1dc565b604051809103906000f08015801562000539573d6000803e3d6000fd5b505060405162000549906200c1dc565b604051809103906000f08015801562000566573d6000803e3d6000fd5b505060405162000576906200c1dc565b604051809103906000f08015801562000593573d6000803e3d6000fd5b5050604051620005a3906200c1dc565b604051809103906000f080158015620005c0573d6000803e3d6000fd5b5050604051620005d0906200c1dc565b604051809103906000f080158015620005ed573d6000803e3d6000fd5b5050604051620005fd906200c1dc565b604051809103906000f0801580156200061a573d6000803e3d6000fd5b50506040516200062a906200c1dc565b604051809103906000f08015801562000647573d6000803e3d6000fd5b505060405162000657906200c1dc565b604051809103906000f08015801562000674573d6000803e3d6000fd5b505060405162000684906200c1dc565b604051809103906000f080158015620006a1573d6000803e3d6000fd5b5050604051620006b1906200c1dc565b604051809103906000f080158015620006ce573d6000803e3d6000fd5b5050604051620006de906200c1dc565b604051809103906000f080158015620006fb573d6000803e3d6000fd5b50506040516200070b906200c1dc565b604051809103906000f08015801562000728573d6000803e3d6000fd5b505060405162000738906200c1dc565b604051809103906000f08015801562000755573d6000803e3d6000fd5b505060405162000765906200c1dc565b604051809103906000f08015801562000782573d6000803e3d6000fd5b505060405162000792906200c1dc565b604051809103906000f080158015620007af573d6000803e3d6000fd5b5050604051620007bf906200c1dc565b604051809103906000f080158015620007dc573d6000803e3d6000fd5b5050604051620007ec906200c1dc565b604051809103906000f08015801562000809573d6000803e3d6000fd5b505060405162000819906200c1dc565b604051809103906000f08015801562000836573d6000803e3d6000fd5b505060405162000846906200c1dc565b604051809103906000f08015801562000863573d6000803e3d6000fd5b505060405162000873906200c1dc565b604051809103906000f08015801562000890573d6000803e3d6000fd5b5050604051620008a0906200c1dc565b604051809103906000f080158015620008bd573d6000803e3d6000fd5b5050604051620008cd906200c1dc565b604051809103906000f080158015620008ea573d6000803e3d6000fd5b5050604051620008fa906200c1dc565b604051809103906000f08015801562000917573d6000803e3d6000fd5b505060405162000927906200c1dc565b604051809103906000f08015801562000944573d6000803e3d6000fd5b505060405162000954906200c1dc565b604051809103906000f08015801562000971573d6000803e3d6000fd5b505060405162000981906200c1dc565b604051809103906000f0801580156200099e573d6000803e3d6000fd5b5050604051620009ae906200c1dc565b604051809103906000f080158015620009cb573d6000803e3d6000fd5b5050604051620009db906200c1dc565b604051809103906000f080158015620009f8573d6000803e3d6000fd5b505060405162000a08906200c1dc565b604051809103906000f08015801562000a25573d6000803e3d6000fd5b505060405162000a35906200c1dc565b604051809103906000f08015801562000a52573d6000803e3d6000fd5b505060405162000a62906200c1dc565b604051809103906000f08015801562000a7f573d6000803e3d6000fd5b505060405162000a8f906200c1dc565b604051809103906000f08015801562000aac573d6000803e3d6000fd5b505060405162000abc906200c1dc565b604051809103906000f08015801562000ad9573d6000803e3d6000fd5b505060405162000ae9906200c1dc565b604051809103906000f08015801562000b06573d6000803e3d6000fd5b505060405162000b16906200c1dc565b604051809103906000f08015801562000b33573d6000803e3d6000fd5b505060405162000b43906200c1dc565b604051809103906000f08015801562000b60573d6000803e3d6000fd5b505060405162000b70906200c1dc565b604051809103906000f08015801562000b8d573d6000803e3d6000fd5b505060405162000b9d906200c1dc565b604051809103906000f08015801562000bba573d6000803e3d6000fd5b505060405162000bca906200c1dc565b604051809103906000f08015801562000be7573d6000803e3d6000fd5b505060405162000bf7906200c1dc565b604051809103906000f08015801562000c14573d6000803e3d6000fd5b505060405162000c24906200c1dc565b604051809103906000f08015801562000c41573d6000803e3d6000fd5b505060405162000c51906200c1dc565b604051809103906000f08015801562000c6e573d6000803e3d6000fd5b505060405162000c7e906200c1dc565b604051809103906000f08015801562000c9b573d6000803e3d6000fd5b505060405162000cab906200c1dc565b604051809103906000f08015801562000cc8573d6000803e3d6000fd5b505060405162000cd8906200c1dc565b604051809103906000f08015801562000cf5573d6000803e3d6000fd5b505060405162000d05906200c1dc565b604051809103906000f08015801562000d22573d6000803e3d6000fd5b505060405162000d32906200c1dc565b604051809103906000f08015801562000d4f573d6000803e3d6000fd5b505060405162000d5f906200c1dc565b604051809103906000f08015801562000d7c573d6000803e3d6000fd5b505060405162000d8c906200c1dc565b604051809103906000f08015801562000da9573d6000803e3d6000fd5b505060405162000db9906200c1dc565b604051809103906000f08015801562000dd6573d6000803e3d6000fd5b505060405162000de6906200c1dc565b604051809103906000f08015801562000e03573d6000803e3d6000fd5b505060405162000e13906200c1dc565b604051809103906000f08015801562000e30573d6000803e3d6000fd5b505060405162000e40906200c1dc565b604051809103906000f08015801562000e5d573d6000803e3d6000fd5b505060405162000e6d906200c1dc565b604051809103906000f08015801562000e8a573d6000803e3d6000fd5b505060405162000e9a906200c1dc565b604051809103906000f08015801562000eb7573d6000803e3d6000fd5b505060405162000ec7906200c1dc565b604051809103906000f08015801562000ee4573d6000803e3d6000fd5b505060405162000ef4906200c1dc565b604051809103906000f08015801562000f11573d6000803e3d6000fd5b505060405162000f21906200c1dc565b604051809103906000f08015801562000f3e573d6000803e3d6000fd5b505060405162000f4e906200c1dc565b604051809103906000f08015801562000f6b573d6000803e3d6000fd5b505060405162000f7b906200c1dc565b604051809103906000f08015801562000f98573d6000803e3d6000fd5b505060405162000fa8906200c1dc565b604051809103906000f08015801562000fc5573d6000803e3d6000fd5b505060405162000fd5906200c1dc565b604051809103906000f08015801562000ff2573d6000803e3d6000fd5b505060405162001002906200c1dc565b604051809103906000f0801580156200101f573d6000803e3d6000fd5b50506040516200102f906200c1dc565b604051809103906000f0801580156200104c573d6000803e3d6000fd5b50506040516200105c906200c1dc565b604051809103906000f08015801562001079573d6000803e3d6000fd5b505060405162001089906200c1dc565b604051809103906000f080158015620010a6573d6000803e3d6000fd5b5050604051620010b6906200c1dc565b604051809103906000f080158015620010d3573d6000803e3d6000fd5b5050604051620010e3906200c1dc565b604051809103906000f08015801562001100573d6000803e3d6000fd5b505060405162001110906200c1dc565b604051809103906000f0801580156200112d573d6000803e3d6000fd5b50506040516200113d906200c1dc565b604051809103906000f0801580156200115a573d6000803e3d6000fd5b50506040516200116a906200c1dc565b604051809103906000f08015801562001187573d6000803e3d6000fd5b505060405162001197906200c1dc565b604051809103906000f080158015620011b4573d6000803e3d6000fd5b5050604051620011c4906200c1dc565b604051809103906000f080158015620011e1573d6000803e3d6000fd5b5050604051620011f1906200c1dc565b604051809103906000f0801580156200120e573d6000803e3d6000fd5b50506040516200121e906200c1dc565b604051809103906000f0801580156200123b573d6000803e3d6000fd5b50506040516200124b906200c1dc565b604051809103906000f08015801562001268573d6000803e3d6000fd5b505060405162001278906200c1dc565b604051809103906000f08015801562001295573d6000803e3d6000fd5b5050604051620012a5906200c1dc565b604051809103906000f080158015620012c2573d6000803e3d6000fd5b5050604051620012d2906200c1dc565b604051809103906000f080158015620012ef573d6000803e3d6000fd5b5050604051620012ff906200c1dc565b604051809103906000f0801580156200131c573d6000803e3d6000fd5b50506040516200132c906200c1dc565b604051809103906000f08015801562001349573d6000803e3d6000fd5b505060405162001359906200c1dc565b604051809103906000f08015801562001376573d6000803e3d6000fd5b505060405162001386906200c1dc565b604051809103906000f080158015620013a3573d6000803e3d6000fd5b5050604051620013b3906200c1dc565b604051809103906000f080158015620013d0573d6000803e3d6000fd5b5050604051620013e0906200c1dc565b604051809103906000f080158015620013fd573d6000803e3d6000fd5b50506040516200140d906200c1dc565b604051809103906000f0801580156200142a573d6000803e3d6000fd5b50506040516200143a906200c1dc565b604051809103906000f08015801562001457573d6000803e3d6000fd5b505060405162001467906200c1dc565b604051809103906000f08015801562001484573d6000803e3d6000fd5b505060405162001494906200c1dc565b604051809103906000f080158015620014b1573d6000803e3d6000fd5b5050604051620014c1906200c1dc565b604051809103906000f080158015620014de573d6000803e3d6000fd5b5050604051620014ee906200c1dc565b604051809103906000f0801580156200150b573d6000803e3d6000fd5b50506040516200151b906200c1dc565b604051809103906000f08015801562001538573d6000803e3d6000fd5b505060405162001548906200c1dc565b604051809103906000f08015801562001565573d6000803e3d6000fd5b505060405162001575906200c1dc565b604051809103906000f08015801562001592573d6000803e3d6000fd5b5050604051620015a2906200c1dc565b604051809103906000f080158015620015bf573d6000803e3d6000fd5b5050604051620015cf906200c1dc565b604051809103906000f080158015620015ec573d6000803e3d6000fd5b5050604051620015fc906200c1dc565b604051809103906000f08015801562001619573d6000803e3d6000fd5b505060405162001629906200c1dc565b604051809103906000f08015801562001646573d6000803e3d6000fd5b505060405162001656906200c1dc565b604051809103906000f08015801562001673573d6000803e3d6000fd5b505060405162001683906200c1dc565b604051809103906000f080158015620016a0573d6000803e3d6000fd5b5050604051620016b0906200c1dc565b604051809103906000f080158015620016cd573d6000803e3d6000fd5b5050604051620016dd906200c1dc565b604051809103906000f080158015620016fa573d6000803e3d6000fd5b50506040516200170a906200c1dc565b604051809103906000f08015801562001727573d6000803e3d6000fd5b505060405162001737906200c1dc565b604051809103906000f08015801562001754573d6000803e3d6000fd5b505060405162001764906200c1dc565b604051809103906000f08015801562001781573d6000803e3d6000fd5b505060405162001791906200c1dc565b604051809103906000f080158015620017ae573d6000803e3d6000fd5b5050604051620017be906200c1dc565b604051809103906000f080158015620017db573d6000803e3d6000fd5b5050604051620017eb906200c1dc565b604051809103906000f08015801562001808573d6000803e3d6000fd5b505060405162001818906200c1dc565b604051809103906000f08015801562001835573d6000803e3d6000fd5b505060405162001845906200c1dc565b604051809103906000f08015801562001862573d6000803e3d6000fd5b505060405162001872906200c1dc565b604051809103906000f0801580156200188f573d6000803e3d6000fd5b50506040516200189f906200c1dc565b604051809103906000f080158015620018bc573d6000803e3d6000fd5b5050604051620018cc906200c1dc565b604051809103906000f080158015620018e9573d6000803e3d6000fd5b5050604051620018f9906200c1dc565b604051809103906000f08015801562001916573d6000803e3d6000fd5b505060405162001926906200c1dc565b604051809103906000f08015801562001943573d6000803e3d6000fd5b505060405162001953906200c1dc565b604051809103906000f08015801562001970573d6000803e3d6000fd5b505060405162001980906200c1dc565b604051809103906000f0801580156200199d573d6000803e3d6000fd5b5050604051620019ad906200c1dc565b604051809103906000f080158015620019ca573d6000803e3d6000fd5b5050604051620019da906200c1dc565b604051809103906000f080158015620019f7573d6000803e3d6000fd5b505060405162001a07906200c1dc565b604051809103906000f08015801562001a24573d6000803e3d6000fd5b505060405162001a34906200c1dc565b604051809103906000f08015801562001a51573d6000803e3d6000fd5b505060405162001a61906200c1dc565b604051809103906000f08015801562001a7e573d6000803e3d6000fd5b505060405162001a8e906200c1dc565b604051809103906000f08015801562001aab573d6000803e3d6000fd5b505060405162001abb906200c1dc565b604051809103906000f08015801562001ad8573d6000803e3d6000fd5b505060405162001ae8906200c1dc565b604051809103906000f08015801562001b05573d6000803e3d6000fd5b505060405162001b15906200c1dc565b604051809103906000f08015801562001b32573d6000803e3d6000fd5b505060405162001b42906200c1dc565b604051809103906000f08015801562001b5f573d6000803e3d6000fd5b505060405162001b6f906200c1dc565b604051809103906000f08015801562001b8c573d6000803e3d6000fd5b505060405162001b9c906200c1dc565b604051809103906000f08015801562001bb9573d6000803e3d6000fd5b505060405162001bc9906200c1dc565b604051809103906000f08015801562001be6573d6000803e3d6000fd5b505060405162001bf6906200c1dc565b604051809103906000f08015801562001c13573d6000803e3d6000fd5b505060405162001c23906200c1dc565b604051809103906000f08015801562001c40573d6000803e3d6000fd5b505060405162001c50906200c1dc565b604051809103906000f08015801562001c6d573d6000803e3d6000fd5b505060405162001c7d906200c1dc565b604051809103906000f08015801562001c9a573d6000803e3d6000fd5b505060405162001caa906200c1dc565b604051809103906000f08015801562001cc7573d6000803e3d6000fd5b505060405162001cd7906200c1dc565b604051809103906000f08015801562001cf4573d6000803e3d6000fd5b505060405162001d04906200c1dc565b604051809103906000f08015801562001d21573d6000803e3d6000fd5b505060405162001d31906200c1dc565b604051809103906000f08015801562001d4e573d6000803e3d6000fd5b505060405162001d5e906200c1dc565b604051809103906000f08015801562001d7b573d6000803e3d6000fd5b505060405162001d8b906200c1dc565b604051809103906000f08015801562001da8573d6000803e3d6000fd5b505060405162001db8906200c1dc565b604051809103906000f08015801562001dd5573d6000803e3d6000fd5b505060405162001de5906200c1dc565b604051809103906000f08015801562001e02573d6000803e3d6000fd5b505060405162001e12906200c1dc565b604051809103906000f08015801562001e2f573d6000803e3d6000fd5b505060405162001e3f906200c1dc565b604051809103906000f08015801562001e5c573d6000803e3d6000fd5b505060405162001e6c906200c1dc565b604051809103906000f08015801562001e89573d6000803e3d6000fd5b505060405162001e99906200c1dc565b604051809103906000f08015801562001eb6573d6000803e3d6000fd5b505060405162001ec6906200c1dc565b604051809103906000f08015801562001ee3573d6000803e3d6000fd5b505060405162001ef3906200c1dc565b604051809103906000f08015801562001f10573d6000803e3d6000fd5b505060405162001f20906200c1dc565b604051809103906000f08015801562001f3d573d6000803e3d6000fd5b505060405162001f4d906200c1dc565b604051809103906000f08015801562001f6a573d6000803e3d6000fd5b505060405162001f7a906200c1dc565b604051809103906000f08015801562001f97573d6000803e3d6000fd5b505060405162001fa7906200c1dc565b604051809103906000f08015801562001fc4573d6000803e3d6000fd5b505060405162001fd4906200c1dc565b604051809103906000f08015801562001ff1573d6000803e3d6000fd5b505060405162002001906200c1dc565b604051809103906000f0801580156200201e573d6000803e3d6000fd5b50506040516200202e906200c1dc565b604051809103906000f0801580156200204b573d6000803e3d6000fd5b50506040516200205b906200c1dc565b604051809103906000f08015801562002078573d6000803e3d6000fd5b505060405162002088906200c1dc565b604051809103906000f080158015620020a5573d6000803e3d6000fd5b5050604051620020b5906200c1dc565b604051809103906000f080158015620020d2573d6000803e3d6000fd5b5050604051620020e2906200c1dc565b604051809103906000f080158015620020ff573d6000803e3d6000fd5b50506040516200210f906200c1dc565b604051809103906000f0801580156200212c573d6000803e3d6000fd5b50506040516200213c906200c1dc565b604051809103906000f08015801562002159573d6000803e3d6000fd5b505060405162002169906200c1dc565b604051809103906000f08015801562002186573d6000803e3d6000fd5b505060405162002196906200c1dc565b604051809103906000f080158015620021b3573d6000803e3d6000fd5b5050604051620021c3906200c1dc565b604051809103906000f080158015620021e0573d6000803e3d6000fd5b5050604051620021f0906200c1dc565b604051809103906000f0801580156200220d573d6000803e3d6000fd5b50506040516200221d906200c1dc565b604051809103906000f0801580156200223a573d6000803e3d6000fd5b50506040516200224a906200c1dc565b604051809103906000f08015801562002267573d6000803e3d6000fd5b505060405162002277906200c1dc565b604051809103906000f08015801562002294573d6000803e3d6000fd5b5050604051620022a4906200c1dc565b604051809103906000f080158015620022c1573d6000803e3d6000fd5b5050604051620022d1906200c1dc565b604051809103906000f080158015620022ee573d6000803e3d6000fd5b5050604051620022fe906200c1dc565b604051809103906000f0801580156200231b573d6000803e3d6000fd5b50506040516200232b906200c1dc565b604051809103906000f08015801562002348573d6000803e3d6000fd5b505060405162002358906200c1dc565b604051809103906000f08015801562002375573d6000803e3d6000fd5b505060405162002385906200c1dc565b604051809103906000f080158015620023a2573d6000803e3d6000fd5b5050604051620023b2906200c1dc565b604051809103906000f080158015620023cf573d6000803e3d6000fd5b5050604051620023df906200c1dc565b604051809103906000f080158015620023fc573d6000803e3d6000fd5b50506040516200240c906200c1dc565b604051809103906000f08015801562002429573d6000803e3d6000fd5b505060405162002439906200c1dc565b604051809103906000f08015801562002456573d6000803e3d6000fd5b505060405162002466906200c1dc565b604051809103906000f08015801562002483573d6000803e3d6000fd5b505060405162002493906200c1dc565b604051809103906000f080158015620024b0573d6000803e3d6000fd5b5050604051620024c0906200c1dc565b604051809103906000f080158015620024dd573d6000803e3d6000fd5b5050604051620024ed906200c1dc565b604051809103906000f0801580156200250a573d6000803e3d6000fd5b50506040516200251a906200c1dc565b604051809103906000f08015801562002537573d6000803e3d6000fd5b505060405162002547906200c1dc565b604051809103906000f08015801562002564573d6000803e3d6000fd5b505060405162002574906200c1dc565b604051809103906000f08015801562002591573d6000803e3d6000fd5b5050604051620025a1906200c1dc565b604051809103906000f080158015620025be573d6000803e3d6000fd5b5050604051620025ce906200c1dc565b604051809103906000f080158015620025eb573d6000803e3d6000fd5b5050604051620025fb906200c1dc565b604051809103906000f08015801562002618573d6000803e3d6000fd5b505060405162002628906200c1dc565b604051809103906000f08015801562002645573d6000803e3d6000fd5b505060405162002655906200c1dc565b604051809103906000f08015801562002672573d6000803e3d6000fd5b505060405162002682906200c1dc565b604051809103906000f0801580156200269f573d6000803e3d6000fd5b5050604051620026af906200c1dc565b604051809103906000f080158015620026cc573d6000803e3d6000fd5b5050604051620026dc906200c1dc565b604051809103906000f080158015620026f9573d6000803e3d6000fd5b505060405162002709906200c1dc565b604051809103906000f08015801562002726573d6000803e3d6000fd5b505060405162002736906200c1dc565b604051809103906000f08015801562002753573d6000803e3d6000fd5b505060405162002763906200c1dc565b604051809103906000f08015801562002780573d6000803e3d6000fd5b505060405162002790906200c1dc565b604051809103906000f080158015620027ad573d6000803e3d6000fd5b5050604051620027bd906200c1dc565b604051809103906000f080158015620027da573d6000803e3d6000fd5b5050604051620027ea906200c1dc565b604051809103906000f08015801562002807573d6000803e3d6000fd5b505060405162002817906200c1dc565b604051809103906000f08015801562002834573d6000803e3d6000fd5b505060405162002844906200c1dc565b604051809103906000f08015801562002861573d6000803e3d6000fd5b505060405162002871906200c1dc565b604051809103906000f0801580156200288e573d6000803e3d6000fd5b50506040516200289e906200c1dc565b604051809103906000f080158015620028bb573d6000803e3d6000fd5b5050604051620028cb906200c1dc565b604051809103906000f080158015620028e8573d6000803e3d6000fd5b5050604051620028f8906200c1dc565b604051809103906000f08015801562002915573d6000803e3d6000fd5b505060405162002925906200c1dc565b604051809103906000f08015801562002942573d6000803e3d6000fd5b505060405162002952906200c1dc565b604051809103906000f0801580156200296f573d6000803e3d6000fd5b50506040516200297f906200c1dc565b604051809103906000f0801580156200299c573d6000803e3d6000fd5b5050604051620029ac906200c1dc565b604051809103906000f080158015620029c9573d6000803e3d6000fd5b5050604051620029d9906200c1dc565b604051809103906000f080158015620029f6573d6000803e3d6000fd5b505060405162002a06906200c1dc565b604051809103906000f08015801562002a23573d6000803e3d6000fd5b505060405162002a33906200c1dc565b604051809103906000f08015801562002a50573d6000803e3d6000fd5b505060405162002a60906200c1dc565b604051809103906000f08015801562002a7d573d6000803e3d6000fd5b505060405162002a8d906200c1dc565b604051809103906000f08015801562002aaa573d6000803e3d6000fd5b505060405162002aba906200c1dc565b604051809103906000f08015801562002ad7573d6000803e3d6000fd5b505060405162002ae7906200c1dc565b604051809103906000f08015801562002b04573d6000803e3d6000fd5b505060405162002b14906200c1dc565b604051809103906000f08015801562002b31573d6000803e3d6000fd5b505060405162002b41906200c1dc565b604051809103906000f08015801562002b5e573d6000803e3d6000fd5b505060405162002b6e906200c1dc565b604051809103906000f08015801562002b8b573d6000803e3d6000fd5b505060405162002b9b906200c1dc565b604051809103906000f08015801562002bb8573d6000803e3d6000fd5b505060405162002bc8906200c1dc565b604051809103906000f08015801562002be5573d6000803e3d6000fd5b505060405162002bf5906200c1dc565b604051809103906000f08015801562002c12573d6000803e3d6000fd5b505060405162002c22906200c1dc565b604051809103906000f08015801562002c3f573d6000803e3d6000fd5b505060405162002c4f906200c1dc565b604051809103906000f08015801562002c6c573d6000803e3d6000fd5b505060405162002c7c906200c1dc565b604051809103906000f08015801562002c99573d6000803e3d6000fd5b505060405162002ca9906200c1dc565b604051809103906000f08015801562002cc6573d6000803e3d6000fd5b505060405162002cd6906200c1dc565b604051809103906000f08015801562002cf3573d6000803e3d6000fd5b505060405162002d03906200c1dc565b604051809103906000f08015801562002d20573d6000803e3d6000fd5b505060405162002d30906200c1dc565b604051809103906000f08015801562002d4d573d6000803e3d6000fd5b505060405162002d5d906200c1dc565b604051809103906000f08015801562002d7a573d6000803e3d6000fd5b505060405162002d8a906200c1dc565b604051809103906000f08015801562002da7573d6000803e3d6000fd5b505060405162002db7906200c1dc565b604051809103906000f08015801562002dd4573d6000803e3d6000fd5b505060405162002de4906200c1dc565b604051809103906000f08015801562002e01573d6000803e3d6000fd5b505060405162002e11906200c1dc565b604051809103906000f08015801562002e2e573d6000803e3d6000fd5b505060405162002e3e906200c1dc565b604051809103906000f08015801562002e5b573d6000803e3d6000fd5b505060405162002e6b906200c1dc565b604051809103906000f08015801562002e88573d6000803e3d6000fd5b505060405162002e98906200c1dc565b604051809103906000f08015801562002eb5573d6000803e3d6000fd5b505060405162002ec5906200c1dc565b604051809103906000f08015801562002ee2573d6000803e3d6000fd5b505060405162002ef2906200c1dc565b604051809103906000f08015801562002f0f573d6000803e3d6000fd5b505060405162002f1f906200c1dc565b604051809103906000f08015801562002f3c573d6000803e3d6000fd5b505060405162002f4c906200c1dc565b604051809103906000f08015801562002f69573d6000803e3d6000fd5b505060405162002f79906200c1dc565b604051809103906000f08015801562002f96573d6000803e3d6000fd5b505060405162002fa6906200c1dc565b604051809103906000f08015801562002fc3573d6000803e3d6000fd5b505060405162002fd3906200c1dc565b604051809103906000f08015801562002ff0573d6000803e3d6000fd5b505060405162003000906200c1dc565b604051809103906000f0801580156200301d573d6000803e3d6000fd5b50506040516200302d906200c1dc565b604051809103906000f0801580156200304a573d6000803e3d6000fd5b50506040516200305a906200c1dc565b604051809103906000f08015801562003077573d6000803e3d6000fd5b505060405162003087906200c1dc565b604051809103906000f080158015620030a4573d6000803e3d6000fd5b5050604051620030b4906200c1dc565b604051809103906000f080158015620030d1573d6000803e3d6000fd5b5050604051620030e1906200c1dc565b604051809103906000f080158015620030fe573d6000803e3d6000fd5b50506040516200310e906200c1dc565b604051809103906000f0801580156200312b573d6000803e3d6000fd5b50506040516200313b906200c1dc565b604051809103906000f08015801562003158573d6000803e3d6000fd5b505060405162003168906200c1dc565b604051809103906000f08015801562003185573d6000803e3d6000fd5b505060405162003195906200c1dc565b604051809103906000f080158015620031b2573d6000803e3d6000fd5b5050604051620031c2906200c1dc565b604051809103906000f080158015620031df573d6000803e3d6000fd5b5050604051620031ef906200c1dc565b604051809103906000f0801580156200320c573d6000803e3d6000fd5b50506040516200321c906200c1dc565b604051809103906000f08015801562003239573d6000803e3d6000fd5b505060405162003249906200c1dc565b604051809103906000f08015801562003266573d6000803e3d6000fd5b505060405162003276906200c1dc565b604051809103906000f08015801562003293573d6000803e3d6000fd5b5050604051620032a3906200c1dc565b604051809103906000f080158015620032c0573d6000803e3d6000fd5b5050604051620032d0906200c1dc565b604051809103906000f080158015620032ed573d6000803e3d6000fd5b5050604051620032fd906200c1dc565b604051809103906000f0801580156200331a573d6000803e3d6000fd5b50506040516200332a906200c1dc565b604051809103906000f08015801562003347573d6000803e3d6000fd5b505060405162003357906200c1dc565b604051809103906000f08015801562003374573d6000803e3d6000fd5b505060405162003384906200c1dc565b604051809103906000f080158015620033a1573d6000803e3d6000fd5b5050604051620033b1906200c1dc565b604051809103906000f080158015620033ce573d6000803e3d6000fd5b5050604051620033de906200c1dc565b604051809103906000f080158015620033fb573d6000803e3d6000fd5b50506040516200340b906200c1dc565b604051809103906000f08015801562003428573d6000803e3d6000fd5b505060405162003438906200c1dc565b604051809103906000f08015801562003455573d6000803e3d6000fd5b505060405162003465906200c1dc565b604051809103906000f08015801562003482573d6000803e3d6000fd5b505060405162003492906200c1dc565b604051809103906000f080158015620034af573d6000803e3d6000fd5b5050604051620034bf906200c1dc565b604051809103906000f080158015620034dc573d6000803e3d6000fd5b5050604051620034ec906200c1dc565b604051809103906000f08015801562003509573d6000803e3d6000fd5b505060405162003519906200c1dc565b604051809103906000f08015801562003536573d6000803e3d6000fd5b505060405162003546906200c1dc565b604051809103906000f08015801562003563573d6000803e3d6000fd5b505060405162003573906200c1dc565b604051809103906000f08015801562003590573d6000803e3d6000fd5b5050604051620035a0906200c1dc565b604051809103906000f080158015620035bd573d6000803e3d6000fd5b5050604051620035cd906200c1dc565b604051809103906000f080158015620035ea573d6000803e3d6000fd5b5050604051620035fa906200c1dc565b604051809103906000f08015801562003617573d6000803e3d6000fd5b505060405162003627906200c1dc565b604051809103906000f08015801562003644573d6000803e3d6000fd5b505060405162003654906200c1dc565b604051809103906000f08015801562003671573d6000803e3d6000fd5b505060405162003681906200c1dc565b604051809103906000f0801580156200369e573d6000803e3d6000fd5b5050604051620036ae906200c1dc565b604051809103906000f080158015620036cb573d6000803e3d6000fd5b5050604051620036db906200c1dc565b604051809103906000f080158015620036f8573d6000803e3d6000fd5b505060405162003708906200c1dc565b604051809103906000f08015801562003725573d6000803e3d6000fd5b505060405162003735906200c1dc565b604051809103906000f08015801562003752573d6000803e3d6000fd5b505060405162003762906200c1dc565b604051809103906000f0801580156200377f573d6000803e3d6000fd5b50506040516200378f906200c1dc565b604051809103906000f080158015620037ac573d6000803e3d6000fd5b5050604051620037bc906200c1dc565b604051809103906000f080158015620037d9573d6000803e3d6000fd5b5050604051620037e9906200c1dc565b604051809103906000f08015801562003806573d6000803e3d6000fd5b505060405162003816906200c1dc565b604051809103906000f08015801562003833573d6000803e3d6000fd5b505060405162003843906200c1dc565b604051809103906000f08015801562003860573d6000803e3d6000fd5b505060405162003870906200c1dc565b604051809103906000f0801580156200388d573d6000803e3d6000fd5b50506040516200389d906200c1dc565b604051809103906000f080158015620038ba573d6000803e3d6000fd5b5050604051620038ca906200c1dc565b604051809103906000f080158015620038e7573d6000803e3d6000fd5b5050604051620038f7906200c1dc565b604051809103906000f08015801562003914573d6000803e3d6000fd5b505060405162003924906200c1dc565b604051809103906000f08015801562003941573d6000803e3d6000fd5b505060405162003951906200c1dc565b604051809103906000f0801580156200396e573d6000803e3d6000fd5b50506040516200397e906200c1dc565b604051809103906000f0801580156200399b573d6000803e3d6000fd5b5050604051620039ab906200c1dc565b604051809103906000f080158015620039c8573d6000803e3d6000fd5b5050604051620039d8906200c1dc565b604051809103906000f080158015620039f5573d6000803e3d6000fd5b505060405162003a05906200c1dc565b604051809103906000f08015801562003a22573d6000803e3d6000fd5b505060405162003a32906200c1dc565b604051809103906000f08015801562003a4f573d6000803e3d6000fd5b505060405162003a5f906200c1dc565b604051809103906000f08015801562003a7c573d6000803e3d6000fd5b505060405162003a8c906200c1dc565b604051809103906000f08015801562003aa9573d6000803e3d6000fd5b505060405162003ab9906200c1dc565b604051809103906000f08015801562003ad6573d6000803e3d6000fd5b505060405162003ae6906200c1dc565b604051809103906000f08015801562003b03573d6000803e3d6000fd5b505060405162003b13906200c1dc565b604051809103906000f08015801562003b30573d6000803e3d6000fd5b505060405162003b40906200c1dc565b604051809103906000f08015801562003b5d573d6000803e3d6000fd5b505060405162003b6d906200c1dc565b604051809103906000f08015801562003b8a573d6000803e3d6000fd5b505060405162003b9a906200c1dc565b604051809103906000f08015801562003bb7573d6000803e3d6000fd5b505060405162003bc7906200c1dc565b604051809103906000f08015801562003be4573d6000803e3d6000fd5b505060405162003bf4906200c1dc565b604051809103906000f08015801562003c11573d6000803e3d6000fd5b505060405162003c21906200c1dc565b604051809103906000f08015801562003c3e573d6000803e3d6000fd5b505060405162003c4e906200c1dc565b604051809103906000f08015801562003c6b573d6000803e3d6000fd5b505060405162003c7b906200c1dc565b604051809103906000f08015801562003c98573d6000803e3d6000fd5b505060405162003ca8906200c1dc565b604051809103906000f08015801562003cc5573d6000803e3d6000fd5b505060405162003cd5906200c1dc565b604051809103906000f08015801562003cf2573d6000803e3d6000fd5b505060405162003d02906200c1dc565b604051809103906000f08015801562003d1f573d6000803e3d6000fd5b505060405162003d2f906200c1dc565b604051809103906000f08015801562003d4c573d6000803e3d6000fd5b505060405162003d5c906200c1dc565b604051809103906000f08015801562003d79573d6000803e3d6000fd5b505060405162003d89906200c1dc565b604051809103906000f08015801562003da6573d6000803e3d6000fd5b505060405162003db6906200c1dc565b604051809103906000f08015801562003dd3573d6000803e3d6000fd5b505060405162003de3906200c1dc565b604051809103906000f08015801562003e00573d6000803e3d6000fd5b505060405162003e10906200c1dc565b604051809103906000f08015801562003e2d573d6000803e3d6000fd5b505060405162003e3d906200c1dc565b604051809103906000f08015801562003e5a573d6000803e3d6000fd5b505060405162003e6a906200c1dc565b604051809103906000f08015801562003e87573d6000803e3d6000fd5b505060405162003e97906200c1dc565b604051809103906000f08015801562003eb4573d6000803e3d6000fd5b505060405162003ec4906200c1dc565b604051809103906000f08015801562003ee1573d6000803e3d6000fd5b505060405162003ef1906200c1dc565b604051809103906000f08015801562003f0e573d6000803e3d6000fd5b505060405162003f1e906200c1dc565b604051809103906000f08015801562003f3b573d6000803e3d6000fd5b505060405162003f4b906200c1dc565b604051809103906000f08015801562003f68573d6000803e3d6000fd5b505060405162003f78906200c1dc565b604051809103906000f08015801562003f95573d6000803e3d6000fd5b505060405162003fa5906200c1dc565b604051809103906000f08015801562003fc2573d6000803e3d6000fd5b505060405162003fd2906200c1dc565b604051809103906000f08015801562003fef573d6000803e3d6000fd5b505060405162003fff906200c1dc565b604051809103906000f0801580156200401c573d6000803e3d6000fd5b50506040516200402c906200c1dc565b604051809103906000f08015801562004049573d6000803e3d6000fd5b505060405162004059906200c1dc565b604051809103906000f08015801562004076573d6000803e3d6000fd5b505060405162004086906200c1dc565b604051809103906000f080158015620040a3573d6000803e3d6000fd5b5050604051620040b3906200c1dc565b604051809103906000f080158015620040d0573d6000803e3d6000fd5b5050604051620040e0906200c1dc565b604051809103906000f080158015620040fd573d6000803e3d6000fd5b50506040516200410d906200c1dc565b604051809103906000f0801580156200412a573d6000803e3d6000fd5b50506040516200413a906200c1dc565b604051809103906000f08015801562004157573d6000803e3d6000fd5b505060405162004167906200c1dc565b604051809103906000f08015801562004184573d6000803e3d6000fd5b505060405162004194906200c1dc565b604051809103906000f080158015620041b1573d6000803e3d6000fd5b5050604051620041c1906200c1dc565b604051809103906000f080158015620041de573d6000803e3d6000fd5b5050604051620041ee906200c1dc565b604051809103906000f0801580156200420b573d6000803e3d6000fd5b50506040516200421b906200c1dc565b604051809103906000f08015801562004238573d6000803e3d6000fd5b505060405162004248906200c1dc565b604051809103906000f08015801562004265573d6000803e3d6000fd5b505060405162004275906200c1dc565b604051809103906000f08015801562004292573d6000803e3d6000fd5b5050604051620042a2906200c1dc565b604051809103906000f080158015620042bf573d6000803e3d6000fd5b5050604051620042cf906200c1dc565b604051809103906000f080158015620042ec573d6000803e3d6000fd5b5050604051620042fc906200c1dc565b604051809103906000f08015801562004319573d6000803e3d6000fd5b505060405162004329906200c1dc565b604051809103906000f08015801562004346573d6000803e3d6000fd5b505060405162004356906200c1dc565b604051809103906000f08015801562004373573d6000803e3d6000fd5b505060405162004383906200c1dc565b604051809103906000f080158015620043a0573d6000803e3d6000fd5b5050604051620043b0906200c1dc565b604051809103906000f080158015620043cd573d6000803e3d6000fd5b5050604051620043dd906200c1dc565b604051809103906000f080158015620043fa573d6000803e3d6000fd5b50506040516200440a906200c1dc565b604051809103906000f08015801562004427573d6000803e3d6000fd5b505060405162004437906200c1dc565b604051809103906000f08015801562004454573d6000803e3d6000fd5b505060405162004464906200c1dc565b604051809103906000f08015801562004481573d6000803e3d6000fd5b505060405162004491906200c1dc565b604051809103906000f080158015620044ae573d6000803e3d6000fd5b5050604051620044be906200c1dc565b604051809103906000f080158015620044db573d6000803e3d6000fd5b5050604051620044eb906200c1dc565b604051809103906000f08015801562004508573d6000803e3d6000fd5b505060405162004518906200c1dc565b604051809103906000f08015801562004535573d6000803e3d6000fd5b505060405162004545906200c1dc565b604051809103906000f08015801562004562573d6000803e3d6000fd5b505060405162004572906200c1dc565b604051809103906000f0801580156200458f573d6000803e3d6000fd5b50506040516200459f906200c1dc565b604051809103906000f080158015620045bc573d6000803e3d6000fd5b5050604051620045cc906200c1dc565b604051809103906000f080158015620045e9573d6000803e3d6000fd5b5050604051620045f9906200c1dc565b604051809103906000f08015801562004616573d6000803e3d6000fd5b505060405162004626906200c1dc565b604051809103906000f08015801562004643573d6000803e3d6000fd5b505060405162004653906200c1dc565b604051809103906000f08015801562004670573d6000803e3d6000fd5b505060405162004680906200c1dc565b604051809103906000f0801580156200469d573d6000803e3d6000fd5b5050604051620046ad906200c1dc565b604051809103906000f080158015620046ca573d6000803e3d6000fd5b5050604051620046da906200c1dc565b604051809103906000f080158015620046f7573d6000803e3d6000fd5b505060405162004707906200c1dc565b604051809103906000f08015801562004724573d6000803e3d6000fd5b505060405162004734906200c1dc565b604051809103906000f08015801562004751573d6000803e3d6000fd5b505060405162004761906200c1dc565b604051809103906000f0801580156200477e573d6000803e3d6000fd5b50506040516200478e906200c1dc565b604051809103906000f080158015620047ab573d6000803e3d6000fd5b5050604051620047bb906200c1dc565b604051809103906000f080158015620047d8573d6000803e3d6000fd5b5050604051620047e8906200c1dc565b604051809103906000f08015801562004805573d6000803e3d6000fd5b505060405162004815906200c1dc565b604051809103906000f08015801562004832573d6000803e3d6000fd5b505060405162004842906200c1dc565b604051809103906000f0801580156200485f573d6000803e3d6000fd5b50506040516200486f906200c1dc565b604051809103906000f0801580156200488c573d6000803e3d6000fd5b50506040516200489c906200c1dc565b604051809103906000f080158015620048b9573d6000803e3d6000fd5b5050604051620048c9906200c1dc565b604051809103906000f080158015620048e6573d6000803e3d6000fd5b5050604051620048f6906200c1dc565b604051809103906000f08015801562004913573d6000803e3d6000fd5b505060405162004923906200c1dc565b604051809103906000f08015801562004940573d6000803e3d6000fd5b505060405162004950906200c1dc565b604051809103906000f0801580156200496d573d6000803e3d6000fd5b50506040516200497d906200c1dc565b604051809103906000f0801580156200499a573d6000803e3d6000fd5b5050604051620049aa906200c1dc565b604051809103906000f080158015620049c7573d6000803e3d6000fd5b5050604051620049d7906200c1dc565b604051809103906000f080158015620049f4573d6000803e3d6000fd5b505060405162004a04906200c1dc565b604051809103906000f08015801562004a21573d6000803e3d6000fd5b505060405162004a31906200c1dc565b604051809103906000f08015801562004a4e573d6000803e3d6000fd5b505060405162004a5e906200c1dc565b604051809103906000f08015801562004a7b573d6000803e3d6000fd5b505060405162004a8b906200c1dc565b604051809103906000f08015801562004aa8573d6000803e3d6000fd5b505060405162004ab8906200c1dc565b604051809103906000f08015801562004ad5573d6000803e3d6000fd5b505060405162004ae5906200c1dc565b604051809103906000f08015801562004b02573d6000803e3d6000fd5b505060405162004b12906200c1dc565b604051809103906000f08015801562004b2f573d6000803e3d6000fd5b505060405162004b3f906200c1dc565b604051809103906000f08015801562004b5c573d6000803e3d6000fd5b505060405162004b6c906200c1dc565b604051809103906000f08015801562004b89573d6000803e3d6000fd5b505060405162004b99906200c1dc565b604051809103906000f08015801562004bb6573d6000803e3d6000fd5b505060405162004bc6906200c1dc565b604051809103906000f08015801562004be3573d6000803e3d6000fd5b505060405162004bf3906200c1dc565b604051809103906000f08015801562004c10573d6000803e3d6000fd5b505060405162004c20906200c1dc565b604051809103906000f08015801562004c3d573d6000803e3d6000fd5b505060405162004c4d906200c1dc565b604051809103906000f08015801562004c6a573d6000803e3d6000fd5b505060405162004c7a906200c1dc565b604051809103906000f08015801562004c97573d6000803e3d6000fd5b505060405162004ca7906200c1dc565b604051809103906000f08015801562004cc4573d6000803e3d6000fd5b505060405162004cd4906200c1dc565b604051809103906000f08015801562004cf1573d6000803e3d6000fd5b505060405162004d01906200c1dc565b604051809103906000f08015801562004d1e573d6000803e3d6000fd5b505060405162004d2e906200c1dc565b604051809103906000f08015801562004d4b573d6000803e3d6000fd5b505060405162004d5b906200c1dc565b604051809103906000f08015801562004d78573d6000803e3d6000fd5b505060405162004d88906200c1dc565b604051809103906000f08015801562004da5573d6000803e3d6000fd5b505060405162004db5906200c1dc565b604051809103906000f08015801562004dd2573d6000803e3d6000fd5b505060405162004de2906200c1dc565b604051809103906000f08015801562004dff573d6000803e3d6000fd5b505060405162004e0f906200c1dc565b604051809103906000f08015801562004e2c573d6000803e3d6000fd5b505060405162004e3c906200c1dc565b604051809103906000f08015801562004e59573d6000803e3d6000fd5b505060405162004e69906200c1dc565b604051809103906000f08015801562004e86573d6000803e3d6000fd5b505060405162004e96906200c1dc565b604051809103906000f08015801562004eb3573d6000803e3d6000fd5b505060405162004ec3906200c1dc565b604051809103906000f08015801562004ee0573d6000803e3d6000fd5b505060405162004ef0906200c1dc565b604051809103906000f08015801562004f0d573d6000803e3d6000fd5b505060405162004f1d906200c1dc565b604051809103906000f08015801562004f3a573d6000803e3d6000fd5b505060405162004f4a906200c1dc565b604051809103906000f08015801562004f67573d6000803e3d6000fd5b505060405162004f77906200c1dc565b604051809103906000f08015801562004f94573d6000803e3d6000fd5b505060405162004fa4906200c1dc565b604051809103906000f08015801562004fc1573d6000803e3d6000fd5b505060405162004fd1906200c1dc565b604051809103906000f08015801562004fee573d6000803e3d6000fd5b505060405162004ffe906200c1dc565b604051809103906000f0801580156200501b573d6000803e3d6000fd5b50506040516200502b906200c1dc565b604051809103906000f08015801562005048573d6000803e3d6000fd5b505060405162005058906200c1dc565b604051809103906000f08015801562005075573d6000803e3d6000fd5b505060405162005085906200c1dc565b604051809103906000f080158015620050a2573d6000803e3d6000fd5b5050604051620050b2906200c1dc565b604051809103906000f080158015620050cf573d6000803e3d6000fd5b5050604051620050df906200c1dc565b604051809103906000f080158015620050fc573d6000803e3d6000fd5b50506040516200510c906200c1dc565b604051809103906000f08015801562005129573d6000803e3d6000fd5b505060405162005139906200c1dc565b604051809103906000f08015801562005156573d6000803e3d6000fd5b505060405162005166906200c1dc565b604051809103906000f08015801562005183573d6000803e3d6000fd5b505060405162005193906200c1dc565b604051809103906000f080158015620051b0573d6000803e3d6000fd5b5050604051620051c0906200c1dc565b604051809103906000f080158015620051dd573d6000803e3d6000fd5b5050604051620051ed906200c1dc565b604051809103906000f0801580156200520a573d6000803e3d6000fd5b50506040516200521a906200c1dc565b604051809103906000f08015801562005237573d6000803e3d6000fd5b505060405162005247906200c1dc565b604051809103906000f08015801562005264573d6000803e3d6000fd5b505060405162005274906200c1dc565b604051809103906000f08015801562005291573d6000803e3d6000fd5b5050604051620052a1906200c1dc565b604051809103906000f080158015620052be573d6000803e3d6000fd5b5050604051620052ce906200c1dc565b604051809103906000f080158015620052eb573d6000803e3d6000fd5b5050604051620052fb906200c1dc565b604051809103906000f08015801562005318573d6000803e3d6000fd5b505060405162005328906200c1dc565b604051809103906000f08015801562005345573d6000803e3d6000fd5b505060405162005355906200c1dc565b604051809103906000f08015801562005372573d6000803e3d6000fd5b505060405162005382906200c1dc565b604051809103906000f0801580156200539f573d6000803e3d6000fd5b5050604051620053af906200c1dc565b604051809103906000f080158015620053cc573d6000803e3d6000fd5b5050604051620053dc906200c1dc565b604051809103906000f080158015620053f9573d6000803e3d6000fd5b505060405162005409906200c1dc565b604051809103906000f08015801562005426573d6000803e3d6000fd5b505060405162005436906200c1dc565b604051809103906000f08015801562005453573d6000803e3d6000fd5b505060405162005463906200c1dc565b604051809103906000f08015801562005480573d6000803e3d6000fd5b505060405162005490906200c1dc565b604051809103906000f080158015620054ad573d6000803e3d6000fd5b5050604051620054bd906200c1dc565b604051809103906000f080158015620054da573d6000803e3d6000fd5b5050604051620054ea906200c1dc565b604051809103906000f08015801562005507573d6000803e3d6000fd5b505060405162005517906200c1dc565b604051809103906000f08015801562005534573d6000803e3d6000fd5b505060405162005544906200c1dc565b604051809103906000f08015801562005561573d6000803e3d6000fd5b505060405162005571906200c1dc565b604051809103906000f0801580156200558e573d6000803e3d6000fd5b50506040516200559e906200c1dc565b604051809103906000f080158015620055bb573d6000803e3d6000fd5b5050604051620055cb906200c1dc565b604051809103906000f080158015620055e8573d6000803e3d6000fd5b5050604051620055f8906200c1dc565b604051809103906000f08015801562005615573d6000803e3d6000fd5b505060405162005625906200c1dc565b604051809103906000f08015801562005642573d6000803e3d6000fd5b505060405162005652906200c1dc565b604051809103906000f0801580156200566f573d6000803e3d6000fd5b50506040516200567f906200c1dc565b604051809103906000f0801580156200569c573d6000803e3d6000fd5b5050604051620056ac906200c1dc565b604051809103906000f080158015620056c9573d6000803e3d6000fd5b5050604051620056d9906200c1dc565b604051809103906000f080158015620056f6573d6000803e3d6000fd5b505060405162005706906200c1dc565b604051809103906000f08015801562005723573d6000803e3d6000fd5b505060405162005733906200c1dc565b604051809103906000f08015801562005750573d6000803e3d6000fd5b505060405162005760906200c1dc565b604051809103906000f0801580156200577d573d6000803e3d6000fd5b50506040516200578d906200c1dc565b604051809103906000f080158015620057aa573d6000803e3d6000fd5b5050604051620057ba906200c1dc565b604051809103906000f080158015620057d7573d6000803e3d6000fd5b5050604051620057e7906200c1dc565b604051809103906000f08015801562005804573d6000803e3d6000fd5b505060405162005814906200c1dc565b604051809103906000f08015801562005831573d6000803e3d6000fd5b505060405162005841906200c1dc565b604051809103906000f0801580156200585e573d6000803e3d6000fd5b50506040516200586e906200c1dc565b604051809103906000f0801580156200588b573d6000803e3d6000fd5b50506040516200589b906200c1dc565b604051809103906000f080158015620058b8573d6000803e3d6000fd5b5050604051620058c8906200c1dc565b604051809103906000f080158015620058e5573d6000803e3d6000fd5b5050604051620058f5906200c1dc565b604051809103906000f08015801562005912573d6000803e3d6000fd5b505060405162005922906200c1dc565b604051809103906000f0801580156200593f573d6000803e3d6000fd5b50506040516200594f906200c1dc565b604051809103906000f0801580156200596c573d6000803e3d6000fd5b50506040516200597c906200c1dc565b604051809103906000f08015801562005999573d6000803e3d6000fd5b5050604051620059a9906200c1dc565b604051809103906000f080158015620059c6573d6000803e3d6000fd5b5050604051620059d6906200c1dc565b604051809103906000f080158015620059f3573d6000803e3d6000fd5b505060405162005a03906200c1dc565b604051809103906000f08015801562005a20573d6000803e3d6000fd5b505060405162005a30906200c1dc565b604051809103906000f08015801562005a4d573d6000803e3d6000fd5b505060405162005a5d906200c1dc565b604051809103906000f08015801562005a7a573d6000803e3d6000fd5b505060405162005a8a906200c1dc565b604051809103906000f08015801562005aa7573d6000803e3d6000fd5b505060405162005ab7906200c1dc565b604051809103906000f08015801562005ad4573d6000803e3d6000fd5b505060405162005ae4906200c1dc565b604051809103906000f08015801562005b01573d6000803e3d6000fd5b505060405162005b11906200c1dc565b604051809103906000f08015801562005b2e573d6000803e3d6000fd5b505060405162005b3e906200c1dc565b604051809103906000f08015801562005b5b573d6000803e3d6000fd5b505060405162005b6b906200c1dc565b604051809103906000f08015801562005b88573d6000803e3d6000fd5b505060405162005b98906200c1dc565b604051809103906000f08015801562005bb5573d6000803e3d6000fd5b505060405162005bc5906200c1dc565b604051809103906000f08015801562005be2573d6000803e3d6000fd5b505060405162005bf2906200c1dc565b604051809103906000f08015801562005c0f573d6000803e3d6000fd5b505060405162005c1f906200c1dc565b604051809103906000f08015801562005c3c573d6000803e3d6000fd5b505060405162005c4c906200c1dc565b604051809103906000f08015801562005c69573d6000803e3d6000fd5b505060405162005c79906200c1dc565b604051809103906000f08015801562005c96573d6000803e3d6000fd5b505060405162005ca6906200c1dc565b604051809103906000f08015801562005cc3573d6000803e3d6000fd5b505060405162005cd3906200c1dc565b604051809103906000f08015801562005cf0573d6000803e3d6000fd5b505060405162005d00906200c1dc565b604051809103906000f08015801562005d1d573d6000803e3d6000fd5b505060405162005d2d906200c1dc565b604051809103906000f08015801562005d4a573d6000803e3d6000fd5b505060405162005d5a906200c1dc565b604051809103906000f08015801562005d77573d6000803e3d6000fd5b505060405162005d87906200c1dc565b604051809103906000f08015801562005da4573d6000803e3d6000fd5b505060405162005db4906200c1dc565b604051809103906000f08015801562005dd1573d6000803e3d6000fd5b505060405162005de1906200c1dc565b604051809103906000f08015801562005dfe573d6000803e3d6000fd5b505060405162005e0e906200c1dc565b604051809103906000f08015801562005e2b573d6000803e3d6000fd5b505060405162005e3b906200c1dc565b604051809103906000f08015801562005e58573d6000803e3d6000fd5b505060405162005e68906200c1dc565b604051809103906000f08015801562005e85573d6000803e3d6000fd5b505060405162005e95906200c1dc565b604051809103906000f08015801562005eb2573d6000803e3d6000fd5b505060405162005ec2906200c1dc565b604051809103906000f08015801562005edf573d6000803e3d6000fd5b505060405162005eef906200c1dc565b604051809103906000f08015801562005f0c573d6000803e3d6000fd5b505060405162005f1c906200c1dc565b604051809103906000f08015801562005f39573d6000803e3d6000fd5b505060405162005f49906200c1dc565b604051809103906000f08015801562005f66573d6000803e3d6000fd5b505060405162005f76906200c1dc565b604051809103906000f08015801562005f93573d6000803e3d6000fd5b505060405162005fa3906200c1dc565b604051809103906000f08015801562005fc0573d6000803e3d6000fd5b505060405162005fd0906200c1dc565b604051809103906000f08015801562005fed573d6000803e3d6000fd5b505060405162005ffd906200c1dc565b604051809103906000f0801580156200601a573d6000803e3d6000fd5b50506040516200602a906200c1dc565b604051809103906000f08015801562006047573d6000803e3d6000fd5b505060405162006057906200c1dc565b604051809103906000f08015801562006074573d6000803e3d6000fd5b505060405162006084906200c1dc565b604051809103906000f080158015620060a1573d6000803e3d6000fd5b5050604051620060b1906200c1dc565b604051809103906000f080158015620060ce573d6000803e3d6000fd5b5050604051620060de906200c1dc565b604051809103906000f080158015620060fb573d6000803e3d6000fd5b50506040516200610b906200c1dc565b604051809103906000f08015801562006128573d6000803e3d6000fd5b505060405162006138906200c1dc565b604051809103906000f08015801562006155573d6000803e3d6000fd5b505060405162006165906200c1dc565b604051809103906000f08015801562006182573d6000803e3d6000fd5b505060405162006192906200c1dc565b604051809103906000f080158015620061af573d6000803e3d6000fd5b5050604051620061bf906200c1dc565b604051809103906000f080158015620061dc573d6000803e3d6000fd5b5050604051620061ec906200c1dc565b604051809103906000f08015801562006209573d6000803e3d6000fd5b505060405162006219906200c1dc565b604051809103906000f08015801562006236573d6000803e3d6000fd5b505060405162006246906200c1dc565b604051809103906000f08015801562006263573d6000803e3d6000fd5b505060405162006273906200c1dc565b604051809103906000f08015801562006290573d6000803e3d6000fd5b5050604051620062a0906200c1dc565b604051809103906000f080158015620062bd573d6000803e3d6000fd5b5050604051620062cd906200c1dc565b604051809103906000f080158015620062ea573d6000803e3d6000fd5b5050604051620062fa906200c1dc565b604051809103906000f08015801562006317573d6000803e3d6000fd5b505060405162006327906200c1dc565b604051809103906000f08015801562006344573d6000803e3d6000fd5b505060405162006354906200c1dc565b604051809103906000f08015801562006371573d6000803e3d6000fd5b505060405162006381906200c1dc565b604051809103906000f0801580156200639e573d6000803e3d6000fd5b5050604051620063ae906200c1dc565b604051809103906000f080158015620063cb573d6000803e3d6000fd5b5050604051620063db906200c1dc565b604051809103906000f080158015620063f8573d6000803e3d6000fd5b505060405162006408906200c1dc565b604051809103906000f08015801562006425573d6000803e3d6000fd5b505060405162006435906200c1dc565b604051809103906000f08015801562006452573d6000803e3d6000fd5b505060405162006462906200c1dc565b604051809103906000f0801580156200647f573d6000803e3d6000fd5b50506040516200648f906200c1dc565b604051809103906000f080158015620064ac573d6000803e3d6000fd5b5050604051620064bc906200c1dc565b604051809103906000f080158015620064d9573d6000803e3d6000fd5b5050604051620064e9906200c1dc565b604051809103906000f08015801562006506573d6000803e3d6000fd5b505060405162006516906200c1dc565b604051809103906000f08015801562006533573d6000803e3d6000fd5b505060405162006543906200c1dc565b604051809103906000f08015801562006560573d6000803e3d6000fd5b505060405162006570906200c1dc565b604051809103906000f0801580156200658d573d6000803e3d6000fd5b50506040516200659d906200c1dc565b604051809103906000f080158015620065ba573d6000803e3d6000fd5b5050604051620065ca906200c1dc565b604051809103906000f080158015620065e7573d6000803e3d6000fd5b5050604051620065f7906200c1dc565b604051809103906000f08015801562006614573d6000803e3d6000fd5b505060405162006624906200c1dc565b604051809103906000f08015801562006641573d6000803e3d6000fd5b505060405162006651906200c1dc565b604051809103906000f0801580156200666e573d6000803e3d6000fd5b50506040516200667e906200c1dc565b604051809103906000f0801580156200669b573d6000803e3d6000fd5b5050604051620066ab906200c1dc565b604051809103906000f080158015620066c8573d6000803e3d6000fd5b5050604051620066d8906200c1dc565b604051809103906000f080158015620066f5573d6000803e3d6000fd5b505060405162006705906200c1dc565b604051809103906000f08015801562006722573d6000803e3d6000fd5b505060405162006732906200c1dc565b604051809103906000f0801580156200674f573d6000803e3d6000fd5b50506040516200675f906200c1dc565b604051809103906000f0801580156200677c573d6000803e3d6000fd5b50506040516200678c906200c1dc565b604051809103906000f080158015620067a9573d6000803e3d6000fd5b5050604051620067b9906200c1dc565b604051809103906000f080158015620067d6573d6000803e3d6000fd5b5050604051620067e6906200c1dc565b604051809103906000f08015801562006803573d6000803e3d6000fd5b505060405162006813906200c1dc565b604051809103906000f08015801562006830573d6000803e3d6000fd5b505060405162006840906200c1dc565b604051809103906000f0801580156200685d573d6000803e3d6000fd5b50506040516200686d906200c1dc565b604051809103906000f0801580156200688a573d6000803e3d6000fd5b50506040516200689a906200c1dc565b604051809103906000f080158015620068b7573d6000803e3d6000fd5b5050604051620068c7906200c1dc565b604051809103906000f080158015620068e4573d6000803e3d6000fd5b5050604051620068f4906200c1dc565b604051809103906000f08015801562006911573d6000803e3d6000fd5b505060405162006921906200c1dc565b604051809103906000f0801580156200693e573d6000803e3d6000fd5b50506040516200694e906200c1dc565b604051809103906000f0801580156200696b573d6000803e3d6000fd5b50506040516200697b906200c1dc565b604051809103906000f08015801562006998573d6000803e3d6000fd5b5050604051620069a8906200c1dc565b604051809103906000f080158015620069c5573d6000803e3d6000fd5b5050604051620069d5906200c1dc565b604051809103906000f080158015620069f2573d6000803e3d6000fd5b505060405162006a02906200c1dc565b604051809103906000f08015801562006a1f573d6000803e3d6000fd5b505060405162006a2f906200c1dc565b604051809103906000f08015801562006a4c573d6000803e3d6000fd5b505060405162006a5c906200c1dc565b604051809103906000f08015801562006a79573d6000803e3d6000fd5b505060405162006a89906200c1dc565b604051809103906000f08015801562006aa6573d6000803e3d6000fd5b505060405162006ab6906200c1dc565b604051809103906000f08015801562006ad3573d6000803e3d6000fd5b505060405162006ae3906200c1dc565b604051809103906000f08015801562006b00573d6000803e3d6000fd5b505060405162006b10906200c1dc565b604051809103906000f08015801562006b2d573d6000803e3d6000fd5b505060405162006b3d906200c1dc565b604051809103906000f08015801562006b5a573d6000803e3d6000fd5b505060405162006b6a906200c1dc565b604051809103906000f08015801562006b87573d6000803e3d6000fd5b505060405162006b97906200c1dc565b604051809103906000f08015801562006bb4573d6000803e3d6000fd5b505060405162006bc4906200c1dc565b604051809103906000f08015801562006be1573d6000803e3d6000fd5b505060405162006bf1906200c1dc565b604051809103906000f08015801562006c0e573d6000803e3d6000fd5b505060405162006c1e906200c1dc565b604051809103906000f08015801562006c3b573d6000803e3d6000fd5b505060405162006c4b906200c1dc565b604051809103906000f08015801562006c68573d6000803e3d6000fd5b505060405162006c78906200c1dc565b604051809103906000f08015801562006c95573d6000803e3d6000fd5b505060405162006ca5906200c1dc565b604051809103906000f08015801562006cc2573d6000803e3d6000fd5b505060405162006cd2906200c1dc565b604051809103906000f08015801562006cef573d6000803e3d6000fd5b505060405162006cff906200c1dc565b604051809103906000f08015801562006d1c573d6000803e3d6000fd5b505060405162006d2c906200c1dc565b604051809103906000f08015801562006d49573d6000803e3d6000fd5b505060405162006d59906200c1dc565b604051809103906000f08015801562006d76573d6000803e3d6000fd5b505060405162006d86906200c1dc565b604051809103906000f08015801562006da3573d6000803e3d6000fd5b505060405162006db3906200c1dc565b604051809103906000f08015801562006dd0573d6000803e3d6000fd5b505060405162006de0906200c1dc565b604051809103906000f08015801562006dfd573d6000803e3d6000fd5b505060405162006e0d906200c1dc565b604051809103906000f08015801562006e2a573d6000803e3d6000fd5b505060405162006e3a906200c1dc565b604051809103906000f08015801562006e57573d6000803e3d6000fd5b505060405162006e67906200c1dc565b604051809103906000f08015801562006e84573d6000803e3d6000fd5b505060405162006e94906200c1dc565b604051809103906000f08015801562006eb1573d6000803e3d6000fd5b505060405162006ec1906200c1dc565b604051809103906000f08015801562006ede573d6000803e3d6000fd5b505060405162006eee906200c1dc565b604051809103906000f08015801562006f0b573d6000803e3d6000fd5b505060405162006f1b906200c1dc565b604051809103906000f08015801562006f38573d6000803e3d6000fd5b505060405162006f48906200c1dc565b604051809103906000f08015801562006f65573d6000803e3d6000fd5b505060405162006f75906200c1dc565b604051809103906000f08015801562006f92573d6000803e3d6000fd5b505060405162006fa2906200c1dc565b604051809103906000f08015801562006fbf573d6000803e3d6000fd5b505060405162006fcf906200c1dc565b604051809103906000f08015801562006fec573d6000803e3d6000fd5b505060405162006ffc906200c1dc565b604051809103906000f08015801562007019573d6000803e3d6000fd5b505060405162007029906200c1dc565b604051809103906000f08015801562007046573d6000803e3d6000fd5b505060405162007056906200c1dc565b604051809103906000f08015801562007073573d6000803e3d6000fd5b505060405162007083906200c1dc565b604051809103906000f080158015620070a0573d6000803e3d6000fd5b5050604051620070b0906200c1dc565b604051809103906000f080158015620070cd573d6000803e3d6000fd5b5050604051620070dd906200c1dc565b604051809103906000f080158015620070fa573d6000803e3d6000fd5b50506040516200710a906200c1dc565b604051809103906000f08015801562007127573d6000803e3d6000fd5b505060405162007137906200c1dc565b604051809103906000f08015801562007154573d6000803e3d6000fd5b505060405162007164906200c1dc565b604051809103906000f08015801562007181573d6000803e3d6000fd5b505060405162007191906200c1dc565b604051809103906000f080158015620071ae573d6000803e3d6000fd5b5050604051620071be906200c1dc565b604051809103906000f080158015620071db573d6000803e3d6000fd5b5050604051620071eb906200c1dc565b604051809103906000f08015801562007208573d6000803e3d6000fd5b505060405162007218906200c1dc565b604051809103906000f08015801562007235573d6000803e3d6000fd5b505060405162007245906200c1dc565b604051809103906000f08015801562007262573d6000803e3d6000fd5b505060405162007272906200c1dc565b604051809103906000f0801580156200728f573d6000803e3d6000fd5b50506040516200729f906200c1dc565b604051809103906000f080158015620072bc573d6000803e3d6000fd5b5050604051620072cc906200c1dc565b604051809103906000f080158015620072e9573d6000803e3d6000fd5b5050604051620072f9906200c1dc565b604051809103906000f08015801562007316573d6000803e3d6000fd5b505060405162007326906200c1dc565b604051809103906000f08015801562007343573d6000803e3d6000fd5b505060405162007353906200c1dc565b604051809103906000f08015801562007370573d6000803e3d6000fd5b505060405162007380906200c1dc565b604051809103906000f0801580156200739d573d6000803e3d6000fd5b5050604051620073ad906200c1dc565b604051809103906000f080158015620073ca573d6000803e3d6000fd5b5050604051620073da906200c1dc565b604051809103906000f080158015620073f7573d6000803e3d6000fd5b505060405162007407906200c1dc565b604051809103906000f08015801562007424573d6000803e3d6000fd5b505060405162007434906200c1dc565b604051809103906000f08015801562007451573d6000803e3d6000fd5b505060405162007461906200c1dc565b604051809103906000f0801580156200747e573d6000803e3d6000fd5b50506040516200748e906200c1dc565b604051809103906000f080158015620074ab573d6000803e3d6000fd5b5050604051620074bb906200c1dc565b604051809103906000f080158015620074d8573d6000803e3d6000fd5b5050604051620074e8906200c1dc565b604051809103906000f08015801562007505573d6000803e3d6000fd5b505060405162007515906200c1dc565b604051809103906000f08015801562007532573d6000803e3d6000fd5b505060405162007542906200c1dc565b604051809103906000f0801580156200755f573d6000803e3d6000fd5b50506040516200756f906200c1dc565b604051809103906000f0801580156200758c573d6000803e3d6000fd5b50506040516200759c906200c1dc565b604051809103906000f080158015620075b9573d6000803e3d6000fd5b5050604051620075c9906200c1dc565b604051809103906000f080158015620075e6573d6000803e3d6000fd5b5050604051620075f6906200c1dc565b604051809103906000f08015801562007613573d6000803e3d6000fd5b505060405162007623906200c1dc565b604051809103906000f08015801562007640573d6000803e3d6000fd5b505060405162007650906200c1dc565b604051809103906000f0801580156200766d573d6000803e3d6000fd5b50506040516200767d906200c1dc565b604051809103906000f0801580156200769a573d6000803e3d6000fd5b5050604051620076aa906200c1dc565b604051809103906000f080158015620076c7573d6000803e3d6000fd5b5050604051620076d7906200c1dc565b604051809103906000f080158015620076f4573d6000803e3d6000fd5b505060405162007704906200c1dc565b604051809103906000f08015801562007721573d6000803e3d6000fd5b505060405162007731906200c1dc565b604051809103906000f0801580156200774e573d6000803e3d6000fd5b50506040516200775e906200c1dc565b604051809103906000f0801580156200777b573d6000803e3d6000fd5b50506040516200778b906200c1dc565b604051809103906000f080158015620077a8573d6000803e3d6000fd5b5050604051620077b8906200c1dc565b604051809103906000f080158015620077d5573d6000803e3d6000fd5b5050604051620077e5906200c1dc565b604051809103906000f08015801562007802573d6000803e3d6000fd5b505060405162007812906200c1dc565b604051809103906000f0801580156200782f573d6000803e3d6000fd5b50506040516200783f906200c1dc565b604051809103906000f0801580156200785c573d6000803e3d6000fd5b50506040516200786c906200c1dc565b604051809103906000f08015801562007889573d6000803e3d6000fd5b505060405162007899906200c1dc565b604051809103906000f080158015620078b6573d6000803e3d6000fd5b5050604051620078c6906200c1dc565b604051809103906000f080158015620078e3573d6000803e3d6000fd5b5050604051620078f3906200c1dc565b604051809103906000f08015801562007910573d6000803e3d6000fd5b505060405162007920906200c1dc565b604051809103906000f0801580156200793d573d6000803e3d6000fd5b50506040516200794d906200c1dc565b604051809103906000f0801580156200796a573d6000803e3d6000fd5b50506040516200797a906200c1dc565b604051809103906000f08015801562007997573d6000803e3d6000fd5b5050604051620079a7906200c1dc565b604051809103906000f080158015620079c4573d6000803e3d6000fd5b5050604051620079d4906200c1dc565b604051809103906000f080158015620079f1573d6000803e3d6000fd5b505060405162007a01906200c1dc565b604051809103906000f08015801562007a1e573d6000803e3d6000fd5b505060405162007a2e906200c1dc565b604051809103906000f08015801562007a4b573d6000803e3d6000fd5b505060405162007a5b906200c1dc565b604051809103906000f08015801562007a78573d6000803e3d6000fd5b505060405162007a88906200c1dc565b604051809103906000f08015801562007aa5573d6000803e3d6000fd5b505060405162007ab5906200c1dc565b604051809103906000f08015801562007ad2573d6000803e3d6000fd5b505060405162007ae2906200c1dc565b604051809103906000f08015801562007aff573d6000803e3d6000fd5b505060405162007b0f906200c1dc565b604051809103906000f08015801562007b2c573d6000803e3d6000fd5b505060405162007b3c906200c1dc565b604051809103906000f08015801562007b59573d6000803e3d6000fd5b505060405162007b69906200c1dc565b604051809103906000f08015801562007b86573d6000803e3d6000fd5b505060405162007b96906200c1dc565b604051809103906000f08015801562007bb3573d6000803e3d6000fd5b505060405162007bc3906200c1dc565b604051809103906000f08015801562007be0573d6000803e3d6000fd5b505060405162007bf0906200c1dc565b604051809103906000f08015801562007c0d573d6000803e3d6000fd5b505060405162007c1d906200c1dc565b604051809103906000f08015801562007c3a573d6000803e3d6000fd5b505060405162007c4a906200c1dc565b604051809103906000f08015801562007c67573d6000803e3d6000fd5b505060405162007c77906200c1dc565b604051809103906000f08015801562007c94573d6000803e3d6000fd5b505060405162007ca4906200c1dc565b604051809103906000f08015801562007cc1573d6000803e3d6000fd5b505060405162007cd1906200c1dc565b604051809103906000f08015801562007cee573d6000803e3d6000fd5b505060405162007cfe906200c1dc565b604051809103906000f08015801562007d1b573d6000803e3d6000fd5b505060405162007d2b906200c1dc565b604051809103906000f08015801562007d48573d6000803e3d6000fd5b505060405162007d58906200c1dc565b604051809103906000f08015801562007d75573d6000803e3d6000fd5b505060405162007d85906200c1dc565b604051809103906000f08015801562007da2573d6000803e3d6000fd5b505060405162007db2906200c1dc565b604051809103906000f08015801562007dcf573d6000803e3d6000fd5b505060405162007ddf906200c1dc565b604051809103906000f08015801562007dfc573d6000803e3d6000fd5b505060405162007e0c906200c1dc565b604051809103906000f08015801562007e29573d6000803e3d6000fd5b505060405162007e39906200c1dc565b604051809103906000f08015801562007e56573d6000803e3d6000fd5b505060405162007e66906200c1dc565b604051809103906000f08015801562007e83573d6000803e3d6000fd5b505060405162007e93906200c1dc565b604051809103906000f08015801562007eb0573d6000803e3d6000fd5b505060405162007ec0906200c1dc565b604051809103906000f08015801562007edd573d6000803e3d6000fd5b505060405162007eed906200c1dc565b604051809103906000f08015801562007f0a573d6000803e3d6000fd5b505060405162007f1a906200c1dc565b604051809103906000f08015801562007f37573d6000803e3d6000fd5b505060405162007f47906200c1dc565b604051809103906000f08015801562007f64573d6000803e3d6000fd5b505060405162007f74906200c1dc565b604051809103906000f08015801562007f91573d6000803e3d6000fd5b505060405162007fa1906200c1dc565b604051809103906000f08015801562007fbe573d6000803e3d6000fd5b505060405162007fce906200c1dc565b604051809103906000f08015801562007feb573d6000803e3d6000fd5b505060405162007ffb906200c1dc565b604051809103906000f08015801562008018573d6000803e3d6000fd5b505060405162008028906200c1dc565b604051809103906000f08015801562008045573d6000803e3d6000fd5b505060405162008055906200c1dc565b604051809103906000f08015801562008072573d6000803e3d6000fd5b505060405162008082906200c1dc565b604051809103906000f0801580156200809f573d6000803e3d6000fd5b5050604051620080af906200c1dc565b604051809103906000f080158015620080cc573d6000803e3d6000fd5b5050604051620080dc906200c1dc565b604051809103906000f080158015620080f9573d6000803e3d6000fd5b505060405162008109906200c1dc565b604051809103906000f08015801562008126573d6000803e3d6000fd5b505060405162008136906200c1dc565b604051809103906000f08015801562008153573d6000803e3d6000fd5b505060405162008163906200c1dc565b604051809103906000f08015801562008180573d6000803e3d6000fd5b505060405162008190906200c1dc565b604051809103906000f080158015620081ad573d6000803e3d6000fd5b5050604051620081bd906200c1dc565b604051809103906000f080158015620081da573d6000803e3d6000fd5b5050604051620081ea906200c1dc565b604051809103906000f08015801562008207573d6000803e3d6000fd5b505060405162008217906200c1dc565b604051809103906000f08015801562008234573d6000803e3d6000fd5b505060405162008244906200c1dc565b604051809103906000f08015801562008261573d6000803e3d6000fd5b505060405162008271906200c1dc565b604051809103906000f0801580156200828e573d6000803e3d6000fd5b50506040516200829e906200c1dc565b604051809103906000f080158015620082bb573d6000803e3d6000fd5b5050604051620082cb906200c1dc565b604051809103906000f080158015620082e8573d6000803e3d6000fd5b5050604051620082f8906200c1dc565b604051809103906000f08015801562008315573d6000803e3d6000fd5b505060405162008325906200c1dc565b604051809103906000f08015801562008342573d6000803e3d6000fd5b505060405162008352906200c1dc565b604051809103906000f0801580156200836f573d6000803e3d6000fd5b50506040516200837f906200c1dc565b604051809103906000f0801580156200839c573d6000803e3d6000fd5b5050604051620083ac906200c1dc565b604051809103906000f080158015620083c9573d6000803e3d6000fd5b5050604051620083d9906200c1dc565b604051809103906000f080158015620083f6573d6000803e3d6000fd5b505060405162008406906200c1dc565b604051809103906000f08015801562008423573d6000803e3d6000fd5b505060405162008433906200c1dc565b604051809103906000f08015801562008450573d6000803e3d6000fd5b505060405162008460906200c1dc565b604051809103906000f0801580156200847d573d6000803e3d6000fd5b50506040516200848d906200c1dc565b604051809103906000f080158015620084aa573d6000803e3d6000fd5b5050604051620084ba906200c1dc565b604051809103906000f080158015620084d7573d6000803e3d6000fd5b5050604051620084e7906200c1dc565b604051809103906000f08015801562008504573d6000803e3d6000fd5b505060405162008514906200c1dc565b604051809103906000f08015801562008531573d6000803e3d6000fd5b505060405162008541906200c1dc565b604051809103906000f0801580156200855e573d6000803e3d6000fd5b50506040516200856e906200c1dc565b604051809103906000f0801580156200858b573d6000803e3d6000fd5b50506040516200859b906200c1dc565b604051809103906000f080158015620085b8573d6000803e3d6000fd5b5050604051620085c8906200c1dc565b604051809103906000f080158015620085e5573d6000803e3d6000fd5b5050604051620085f5906200c1dc565b604051809103906000f08015801562008612573d6000803e3d6000fd5b505060405162008622906200c1dc565b604051809103906000f0801580156200863f573d6000803e3d6000fd5b50506040516200864f906200c1dc565b604051809103906000f0801580156200866c573d6000803e3d6000fd5b50506040516200867c906200c1dc565b604051809103906000f08015801562008699573d6000803e3d6000fd5b5050604051620086a9906200c1dc565b604051809103906000f080158015620086c6573d6000803e3d6000fd5b5050604051620086d6906200c1dc565b604051809103906000f080158015620086f3573d6000803e3d6000fd5b505060405162008703906200c1dc565b604051809103906000f08015801562008720573d6000803e3d6000fd5b505060405162008730906200c1dc565b604051809103906000f0801580156200874d573d6000803e3d6000fd5b50506040516200875d906200c1dc565b604051809103906000f0801580156200877a573d6000803e3d6000fd5b50506040516200878a906200c1dc565b604051809103906000f080158015620087a7573d6000803e3d6000fd5b5050604051620087b7906200c1dc565b604051809103906000f080158015620087d4573d6000803e3d6000fd5b5050604051620087e4906200c1dc565b604051809103906000f08015801562008801573d6000803e3d6000fd5b505060405162008811906200c1dc565b604051809103906000f0801580156200882e573d6000803e3d6000fd5b50506040516200883e906200c1dc565b604051809103906000f0801580156200885b573d6000803e3d6000fd5b50506040516200886b906200c1dc565b604051809103906000f08015801562008888573d6000803e3d6000fd5b505060405162008898906200c1dc565b604051809103906000f080158015620088b5573d6000803e3d6000fd5b5050604051620088c5906200c1dc565b604051809103906000f080158015620088e2573d6000803e3d6000fd5b5050604051620088f2906200c1dc565b604051809103906000f0801580156200890f573d6000803e3d6000fd5b50506040516200891f906200c1dc565b604051809103906000f0801580156200893c573d6000803e3d6000fd5b50506040516200894c906200c1dc565b604051809103906000f08015801562008969573d6000803e3d6000fd5b505060405162008979906200c1dc565b604051809103906000f08015801562008996573d6000803e3d6000fd5b5050604051620089a6906200c1dc565b604051809103906000f080158015620089c3573d6000803e3d6000fd5b5050604051620089d3906200c1dc565b604051809103906000f080158015620089f0573d6000803e3d6000fd5b505060405162008a00906200c1dc565b604051809103906000f08015801562008a1d573d6000803e3d6000fd5b505060405162008a2d906200c1dc565b604051809103906000f08015801562008a4a573d6000803e3d6000fd5b505060405162008a5a906200c1dc565b604051809103906000f08015801562008a77573d6000803e3d6000fd5b505060405162008a87906200c1dc565b604051809103906000f08015801562008aa4573d6000803e3d6000fd5b505060405162008ab4906200c1dc565b604051809103906000f08015801562008ad1573d6000803e3d6000fd5b505060405162008ae1906200c1dc565b604051809103906000f08015801562008afe573d6000803e3d6000fd5b505060405162008b0e906200c1dc565b604051809103906000f08015801562008b2b573d6000803e3d6000fd5b505060405162008b3b906200c1dc565b604051809103906000f08015801562008b58573d6000803e3d6000fd5b505060405162008b68906200c1dc565b604051809103906000f08015801562008b85573d6000803e3d6000fd5b505060405162008b95906200c1dc565b604051809103906000f08015801562008bb2573d6000803e3d6000fd5b505060405162008bc2906200c1dc565b604051809103906000f08015801562008bdf573d6000803e3d6000fd5b505060405162008bef906200c1dc565b604051809103906000f08015801562008c0c573d6000803e3d6000fd5b505060405162008c1c906200c1dc565b604051809103906000f08015801562008c39573d6000803e3d6000fd5b505060405162008c49906200c1dc565b604051809103906000f08015801562008c66573d6000803e3d6000fd5b505060405162008c76906200c1dc565b604051809103906000f08015801562008c93573d6000803e3d6000fd5b505060405162008ca3906200c1dc565b604051809103906000f08015801562008cc0573d6000803e3d6000fd5b505060405162008cd0906200c1dc565b604051809103906000f08015801562008ced573d6000803e3d6000fd5b505060405162008cfd906200c1dc565b604051809103906000f08015801562008d1a573d6000803e3d6000fd5b505060405162008d2a906200c1dc565b604051809103906000f08015801562008d47573d6000803e3d6000fd5b505060405162008d57906200c1dc565b604051809103906000f08015801562008d74573d6000803e3d6000fd5b505060405162008d84906200c1dc565b604051809103906000f08015801562008da1573d6000803e3d6000fd5b505060405162008db1906200c1dc565b604051809103906000f08015801562008dce573d6000803e3d6000fd5b505060405162008dde906200c1dc565b604051809103906000f08015801562008dfb573d6000803e3d6000fd5b505060405162008e0b906200c1dc565b604051809103906000f08015801562008e28573d6000803e3d6000fd5b505060405162008e38906200c1dc565b604051809103906000f08015801562008e55573d6000803e3d6000fd5b505060405162008e65906200c1dc565b604051809103906000f08015801562008e82573d6000803e3d6000fd5b505060405162008e92906200c1dc565b604051809103906000f08015801562008eaf573d6000803e3d6000fd5b505060405162008ebf906200c1dc565b604051809103906000f08015801562008edc573d6000803e3d6000fd5b505060405162008eec906200c1dc565b604051809103906000f08015801562008f09573d6000803e3d6000fd5b505060405162008f19906200c1dc565b604051809103906000f08015801562008f36573d6000803e3d6000fd5b505060405162008f46906200c1dc565b604051809103906000f08015801562008f63573d6000803e3d6000fd5b505060405162008f73906200c1dc565b604051809103906000f08015801562008f90573d6000803e3d6000fd5b505060405162008fa0906200c1dc565b604051809103906000f08015801562008fbd573d6000803e3d6000fd5b505060405162008fcd906200c1dc565b604051809103906000f08015801562008fea573d6000803e3d6000fd5b505060405162008ffa906200c1dc565b604051809103906000f08015801562009017573d6000803e3d6000fd5b505060405162009027906200c1dc565b604051809103906000f08015801562009044573d6000803e3d6000fd5b505060405162009054906200c1dc565b604051809103906000f08015801562009071573d6000803e3d6000fd5b505060405162009081906200c1dc565b604051809103906000f0801580156200909e573d6000803e3d6000fd5b5050604051620090ae906200c1dc565b604051809103906000f080158015620090cb573d6000803e3d6000fd5b5050604051620090db906200c1dc565b604051809103906000f080158015620090f8573d6000803e3d6000fd5b505060405162009108906200c1dc565b604051809103906000f08015801562009125573d6000803e3d6000fd5b505060405162009135906200c1dc565b604051809103906000f08015801562009152573d6000803e3d6000fd5b505060405162009162906200c1dc565b604051809103906000f0801580156200917f573d6000803e3d6000fd5b50506040516200918f906200c1dc565b604051809103906000f080158015620091ac573d6000803e3d6000fd5b5050604051620091bc906200c1dc565b604051809103906000f080158015620091d9573d6000803e3d6000fd5b5050604051620091e9906200c1dc565b604051809103906000f08015801562009206573d6000803e3d6000fd5b505060405162009216906200c1dc565b604051809103906000f08015801562009233573d6000803e3d6000fd5b505060405162009243906200c1dc565b604051809103906000f08015801562009260573d6000803e3d6000fd5b505060405162009270906200c1dc565b604051809103906000f0801580156200928d573d6000803e3d6000fd5b50506040516200929d906200c1dc565b604051809103906000f080158015620092ba573d6000803e3d6000fd5b5050604051620092ca906200c1dc565b604051809103906000f080158015620092e7573d6000803e3d6000fd5b5050604051620092f7906200c1dc565b604051809103906000f08015801562009314573d6000803e3d6000fd5b505060405162009324906200c1dc565b604051809103906000f08015801562009341573d6000803e3d6000fd5b505060405162009351906200c1dc565b604051809103906000f0801580156200936e573d6000803e3d6000fd5b50506040516200937e906200c1dc565b604051809103906000f0801580156200939b573d6000803e3d6000fd5b5050604051620093ab906200c1dc565b604051809103906000f080158015620093c8573d6000803e3d6000fd5b5050604051620093d8906200c1dc565b604051809103906000f080158015620093f5573d6000803e3d6000fd5b505060405162009405906200c1dc565b604051809103906000f08015801562009422573d6000803e3d6000fd5b505060405162009432906200c1dc565b604051809103906000f0801580156200944f573d6000803e3d6000fd5b50506040516200945f906200c1dc565b604051809103906000f0801580156200947c573d6000803e3d6000fd5b50506040516200948c906200c1dc565b604051809103906000f080158015620094a9573d6000803e3d6000fd5b5050604051620094b9906200c1dc565b604051809103906000f080158015620094d6573d6000803e3d6000fd5b5050604051620094e6906200c1dc565b604051809103906000f08015801562009503573d6000803e3d6000fd5b505060405162009513906200c1dc565b604051809103906000f08015801562009530573d6000803e3d6000fd5b505060405162009540906200c1dc565b604051809103906000f0801580156200955d573d6000803e3d6000fd5b50506040516200956d906200c1dc565b604051809103906000f0801580156200958a573d6000803e3d6000fd5b50506040516200959a906200c1dc565b604051809103906000f080158015620095b7573d6000803e3d6000fd5b5050604051620095c7906200c1dc565b604051809103906000f080158015620095e4573d6000803e3d6000fd5b5050604051620095f4906200c1dc565b604051809103906000f08015801562009611573d6000803e3d6000fd5b505060405162009621906200c1dc565b604051809103906000f0801580156200963e573d6000803e3d6000fd5b50506040516200964e906200c1dc565b604051809103906000f0801580156200966b573d6000803e3d6000fd5b50506040516200967b906200c1dc565b604051809103906000f08015801562009698573d6000803e3d6000fd5b5050604051620096a8906200c1dc565b604051809103906000f080158015620096c5573d6000803e3d6000fd5b5050604051620096d5906200c1dc565b604051809103906000f080158015620096f2573d6000803e3d6000fd5b505060405162009702906200c1dc565b604051809103906000f0801580156200971f573d6000803e3d6000fd5b50506040516200972f906200c1dc565b604051809103906000f0801580156200974c573d6000803e3d6000fd5b50506040516200975c906200c1dc565b604051809103906000f08015801562009779573d6000803e3d6000fd5b505060405162009789906200c1dc565b604051809103906000f080158015620097a6573d6000803e3d6000fd5b5050604051620097b6906200c1dc565b604051809103906000f080158015620097d3573d6000803e3d6000fd5b5050604051620097e3906200c1dc565b604051809103906000f08015801562009800573d6000803e3d6000fd5b505060405162009810906200c1dc565b604051809103906000f0801580156200982d573d6000803e3d6000fd5b50506040516200983d906200c1dc565b604051809103906000f0801580156200985a573d6000803e3d6000fd5b50506040516200986a906200c1dc565b604051809103906000f08015801562009887573d6000803e3d6000fd5b505060405162009897906200c1dc565b604051809103906000f080158015620098b4573d6000803e3d6000fd5b5050604051620098c4906200c1dc565b604051809103906000f080158015620098e1573d6000803e3d6000fd5b5050604051620098f1906200c1dc565b604051809103906000f0801580156200990e573d6000803e3d6000fd5b50506040516200991e906200c1dc565b604051809103906000f0801580156200993b573d6000803e3d6000fd5b50506040516200994b906200c1dc565b604051809103906000f08015801562009968573d6000803e3d6000fd5b505060405162009978906200c1dc565b604051809103906000f08015801562009995573d6000803e3d6000fd5b5050604051620099a5906200c1dc565b604051809103906000f080158015620099c2573d6000803e3d6000fd5b5050604051620099d2906200c1dc565b604051809103906000f080158015620099ef573d6000803e3d6000fd5b5050604051620099ff906200c1dc565b604051809103906000f08015801562009a1c573d6000803e3d6000fd5b505060405162009a2c906200c1dc565b604051809103906000f08015801562009a49573d6000803e3d6000fd5b505060405162009a59906200c1dc565b604051809103906000f08015801562009a76573d6000803e3d6000fd5b505060405162009a86906200c1dc565b604051809103906000f08015801562009aa3573d6000803e3d6000fd5b505060405162009ab3906200c1dc565b604051809103906000f08015801562009ad0573d6000803e3d6000fd5b505060405162009ae0906200c1dc565b604051809103906000f08015801562009afd573d6000803e3d6000fd5b505060405162009b0d906200c1dc565b604051809103906000f08015801562009b2a573d6000803e3d6000fd5b505060405162009b3a906200c1dc565b604051809103906000f08015801562009b57573d6000803e3d6000fd5b505060405162009b67906200c1dc565b604051809103906000f08015801562009b84573d6000803e3d6000fd5b505060405162009b94906200c1dc565b604051809103906000f08015801562009bb1573d6000803e3d6000fd5b505060405162009bc1906200c1dc565b604051809103906000f08015801562009bde573d6000803e3d6000fd5b505060405162009bee906200c1dc565b604051809103906000f08015801562009c0b573d6000803e3d6000fd5b505060405162009c1b906200c1dc565b604051809103906000f08015801562009c38573d6000803e3d6000fd5b505060405162009c48906200c1dc565b604051809103906000f08015801562009c65573d6000803e3d6000fd5b505060405162009c75906200c1dc565b604051809103906000f08015801562009c92573d6000803e3d6000fd5b505060405162009ca2906200c1dc565b604051809103906000f08015801562009cbf573d6000803e3d6000fd5b505060405162009ccf906200c1dc565b604051809103906000f08015801562009cec573d6000803e3d6000fd5b505060405162009cfc906200c1dc565b604051809103906000f08015801562009d19573d6000803e3d6000fd5b505060405162009d29906200c1dc565b604051809103906000f08015801562009d46573d6000803e3d6000fd5b505060405162009d56906200c1dc565b604051809103906000f08015801562009d73573d6000803e3d6000fd5b505060405162009d83906200c1dc565b604051809103906000f08015801562009da0573d6000803e3d6000fd5b505060405162009db0906200c1dc565b604051809103906000f08015801562009dcd573d6000803e3d6000fd5b505060405162009ddd906200c1dc565b604051809103906000f08015801562009dfa573d6000803e3d6000fd5b505060405162009e0a906200c1dc565b604051809103906000f08015801562009e27573d6000803e3d6000fd5b505060405162009e37906200c1dc565b604051809103906000f08015801562009e54573d6000803e3d6000fd5b505060405162009e64906200c1dc565b604051809103906000f08015801562009e81573d6000803e3d6000fd5b505060405162009e91906200c1dc565b604051809103906000f08015801562009eae573d6000803e3d6000fd5b505060405162009ebe906200c1dc565b604051809103906000f08015801562009edb573d6000803e3d6000fd5b505060405162009eeb906200c1dc565b604051809103906000f08015801562009f08573d6000803e3d6000fd5b505060405162009f18906200c1dc565b604051809103906000f08015801562009f35573d6000803e3d6000fd5b505060405162009f45906200c1dc565b604051809103906000f08015801562009f62573d6000803e3d6000fd5b505060405162009f72906200c1dc565b604051809103906000f08015801562009f8f573d6000803e3d6000fd5b505060405162009f9f906200c1dc565b604051809103906000f08015801562009fbc573d6000803e3d6000fd5b505060405162009fcc906200c1dc565b604051809103906000f08015801562009fe9573d6000803e3d6000fd5b505060405162009ff9906200c1dc565b604051809103906000f0801580156200a016573d6000803e3d6000fd5b50506040516200a026906200c1dc565b604051809103906000f0801580156200a043573d6000803e3d6000fd5b50506040516200a053906200c1dc565b604051809103906000f0801580156200a070573d6000803e3d6000fd5b50506040516200a080906200c1dc565b604051809103906000f0801580156200a09d573d6000803e3d6000fd5b50506040516200a0ad906200c1dc565b604051809103906000f0801580156200a0ca573d6000803e3d6000fd5b50506040516200a0da906200c1dc565b604051809103906000f0801580156200a0f7573d6000803e3d6000fd5b50506040516200a107906200c1dc565b604051809103906000f0801580156200a124573d6000803e3d6000fd5b50506040516200a134906200c1dc565b604051809103906000f0801580156200a151573d6000803e3d6000fd5b50506040516200a161906200c1dc565b604051809103906000f0801580156200a17e573d6000803e3d6000fd5b50506040516200a18e906200c1dc565b604051809103906000f0801580156200a1ab573d6000803e3d6000fd5b50506040516200a1bb906200c1dc565b604051809103906000f0801580156200a1d8573d6000803e3d6000fd5b50506040516200a1e8906200c1dc565b604051809103906000f0801580156200a205573d6000803e3d6000fd5b50506040516200a215906200c1dc565b604051809103906000f0801580156200a232573d6000803e3d6000fd5b50506040516200a242906200c1dc565b604051809103906000f0801580156200a25f573d6000803e3d6000fd5b50506040516200a26f906200c1dc565b604051809103906000f0801580156200a28c573d6000803e3d6000fd5b50506040516200a29c906200c1dc565b604051809103906000f0801580156200a2b9573d6000803e3d6000fd5b50506040516200a2c9906200c1dc565b604051809103906000f0801580156200a2e6573d6000803e3d6000fd5b50506040516200a2f6906200c1dc565b604051809103906000f0801580156200a313573d6000803e3d6000fd5b50506040516200a323906200c1dc565b604051809103906000f0801580156200a340573d6000803e3d6000fd5b50506040516200a350906200c1dc565b604051809103906000f0801580156200a36d573d6000803e3d6000fd5b50506040516200a37d906200c1dc565b604051809103906000f0801580156200a39a573d6000803e3d6000fd5b50506040516200a3aa906200c1dc565b604051809103906000f0801580156200a3c7573d6000803e3d6000fd5b50506040516200a3d7906200c1dc565b604051809103906000f0801580156200a3f4573d6000803e3d6000fd5b50506040516200a404906200c1dc565b604051809103906000f0801580156200a421573d6000803e3d6000fd5b50506040516200a431906200c1dc565b604051809103906000f0801580156200a44e573d6000803e3d6000fd5b50506040516200a45e906200c1dc565b604051809103906000f0801580156200a47b573d6000803e3d6000fd5b50506040516200a48b906200c1dc565b604051809103906000f0801580156200a4a8573d6000803e3d6000fd5b50506040516200a4b8906200c1dc565b604051809103906000f0801580156200a4d5573d6000803e3d6000fd5b50506040516200a4e5906200c1dc565b604051809103906000f0801580156200a502573d6000803e3d6000fd5b50506040516200a512906200c1dc565b604051809103906000f0801580156200a52f573d6000803e3d6000fd5b50506040516200a53f906200c1dc565b604051809103906000f0801580156200a55c573d6000803e3d6000fd5b50506040516200a56c906200c1dc565b604051809103906000f0801580156200a589573d6000803e3d6000fd5b50506040516200a599906200c1dc565b604051809103906000f0801580156200a5b6573d6000803e3d6000fd5b50506040516200a5c6906200c1dc565b604051809103906000f0801580156200a5e3573d6000803e3d6000fd5b50506040516200a5f3906200c1dc565b604051809103906000f0801580156200a610573d6000803e3d6000fd5b50506040516200a620906200c1dc565b604051809103906000f0801580156200a63d573d6000803e3d6000fd5b50506040516200a64d906200c1dc565b604051809103906000f0801580156200a66a573d6000803e3d6000fd5b50506040516200a67a906200c1dc565b604051809103906000f0801580156200a697573d6000803e3d6000fd5b50506040516200a6a7906200c1dc565b604051809103906000f0801580156200a6c4573d6000803e3d6000fd5b50506040516200a6d4906200c1dc565b604051809103906000f0801580156200a6f1573d6000803e3d6000fd5b50506040516200a701906200c1dc565b604051809103906000f0801580156200a71e573d6000803e3d6000fd5b50506040516200a72e906200c1dc565b604051809103906000f0801580156200a74b573d6000803e3d6000fd5b50506040516200a75b906200c1dc565b604051809103906000f0801580156200a778573d6000803e3d6000fd5b50506040516200a788906200c1dc565b604051809103906000f0801580156200a7a5573d6000803e3d6000fd5b50506040516200a7b5906200c1dc565b604051809103906000f0801580156200a7d2573d6000803e3d6000fd5b50506040516200a7e2906200c1dc565b604051809103906000f0801580156200a7ff573d6000803e3d6000fd5b50506040516200a80f906200c1dc565b604051809103906000f0801580156200a82c573d6000803e3d6000fd5b50506040516200a83c906200c1dc565b604051809103906000f0801580156200a859573d6000803e3d6000fd5b50506040516200a869906200c1dc565b604051809103906000f0801580156200a886573d6000803e3d6000fd5b50506040516200a896906200c1dc565b604051809103906000f0801580156200a8b3573d6000803e3d6000fd5b50506040516200a8c3906200c1dc565b604051809103906000f0801580156200a8e0573d6000803e3d6000fd5b50506040516200a8f0906200c1dc565b604051809103906000f0801580156200a90d573d6000803e3d6000fd5b50506040516200a91d906200c1dc565b604051809103906000f0801580156200a93a573d6000803e3d6000fd5b50506040516200a94a906200c1dc565b604051809103906000f0801580156200a967573d6000803e3d6000fd5b50506040516200a977906200c1dc565b604051809103906000f0801580156200a994573d6000803e3d6000fd5b50506040516200a9a4906200c1dc565b604051809103906000f0801580156200a9c1573d6000803e3d6000fd5b50506040516200a9d1906200c1dc565b604051809103906000f0801580156200a9ee573d6000803e3d6000fd5b50506040516200a9fe906200c1dc565b604051809103906000f0801580156200aa1b573d6000803e3d6000fd5b50506040516200aa2b906200c1dc565b604051809103906000f0801580156200aa48573d6000803e3d6000fd5b50506040516200aa58906200c1dc565b604051809103906000f0801580156200aa75573d6000803e3d6000fd5b50506040516200aa85906200c1dc565b604051809103906000f0801580156200aaa2573d6000803e3d6000fd5b50506040516200aab2906200c1dc565b604051809103906000f0801580156200aacf573d6000803e3d6000fd5b50506040516200aadf906200c1dc565b604051809103906000f0801580156200aafc573d6000803e3d6000fd5b50506040516200ab0c906200c1dc565b604051809103906000f0801580156200ab29573d6000803e3d6000fd5b50506040516200ab39906200c1dc565b604051809103906000f0801580156200ab56573d6000803e3d6000fd5b50506040516200ab66906200c1dc565b604051809103906000f0801580156200ab83573d6000803e3d6000fd5b50506040516200ab93906200c1dc565b604051809103906000f0801580156200abb0573d6000803e3d6000fd5b50506040516200abc0906200c1dc565b604051809103906000f0801580156200abdd573d6000803e3d6000fd5b50506040516200abed906200c1dc565b604051809103906000f0801580156200ac0a573d6000803e3d6000fd5b50506040516200ac1a906200c1dc565b604051809103906000f0801580156200ac37573d6000803e3d6000fd5b50506040516200ac47906200c1dc565b604051809103906000f0801580156200ac64573d6000803e3d6000fd5b50506040516200ac74906200c1dc565b604051809103906000f0801580156200ac91573d6000803e3d6000fd5b50506040516200aca1906200c1dc565b604051809103906000f0801580156200acbe573d6000803e3d6000fd5b50506040516200acce906200c1dc565b604051809103906000f0801580156200aceb573d6000803e3d6000fd5b50506040516200acfb906200c1dc565b604051809103906000f0801580156200ad18573d6000803e3d6000fd5b50506040516200ad28906200c1dc565b604051809103906000f0801580156200ad45573d6000803e3d6000fd5b50506040516200ad55906200c1dc565b604051809103906000f0801580156200ad72573d6000803e3d6000fd5b50506040516200ad82906200c1dc565b604051809103906000f0801580156200ad9f573d6000803e3d6000fd5b50506040516200adaf906200c1dc565b604051809103906000f0801580156200adcc573d6000803e3d6000fd5b50506040516200addc906200c1dc565b604051809103906000f0801580156200adf9573d6000803e3d6000fd5b50506040516200ae09906200c1dc565b604051809103906000f0801580156200ae26573d6000803e3d6000fd5b50506040516200ae36906200c1dc565b604051809103906000f0801580156200ae53573d6000803e3d6000fd5b50506040516200ae63906200c1dc565b604051809103906000f0801580156200ae80573d6000803e3d6000fd5b50506040516200ae90906200c1dc565b604051809103906000f0801580156200aead573d6000803e3d6000fd5b50506040516200aebd906200c1dc565b604051809103906000f0801580156200aeda573d6000803e3d6000fd5b50506040516200aeea906200c1dc565b604051809103906000f0801580156200af07573d6000803e3d6000fd5b50506040516200af17906200c1dc565b604051809103906000f0801580156200af34573d6000803e3d6000fd5b50506040516200af44906200c1dc565b604051809103906000f0801580156200af61573d6000803e3d6000fd5b50506040516200af71906200c1dc565b604051809103906000f0801580156200af8e573d6000803e3d6000fd5b50506040516200af9e906200c1dc565b604051809103906000f0801580156200afbb573d6000803e3d6000fd5b50506040516200afcb906200c1dc565b604051809103906000f0801580156200afe8573d6000803e3d6000fd5b50506040516200aff8906200c1dc565b604051809103906000f0801580156200b015573d6000803e3d6000fd5b50506040516200b025906200c1dc565b604051809103906000f0801580156200b042573d6000803e3d6000fd5b50506040516200b052906200c1dc565b604051809103906000f0801580156200b06f573d6000803e3d6000fd5b50506040516200b07f906200c1dc565b604051809103906000f0801580156200b09c573d6000803e3d6000fd5b50506040516200b0ac906200c1dc565b604051809103906000f0801580156200b0c9573d6000803e3d6000fd5b50506040516200b0d9906200c1dc565b604051809103906000f0801580156200b0f6573d6000803e3d6000fd5b50506040516200b106906200c1dc565b604051809103906000f0801580156200b123573d6000803e3d6000fd5b50506040516200b133906200c1dc565b604051809103906000f0801580156200b150573d6000803e3d6000fd5b50506040516200b160906200c1dc565b604051809103906000f0801580156200b17d573d6000803e3d6000fd5b50506040516200b18d906200c1dc565b604051809103906000f0801580156200b1aa573d6000803e3d6000fd5b50506040516200b1ba906200c1dc565b604051809103906000f0801580156200b1d7573d6000803e3d6000fd5b50506040516200b1e7906200c1dc565b604051809103906000f0801580156200b204573d6000803e3d6000fd5b50506040516200b214906200c1dc565b604051809103906000f0801580156200b231573d6000803e3d6000fd5b50506040516200b241906200c1dc565b604051809103906000f0801580156200b25e573d6000803e3d6000fd5b50506040516200b26e906200c1dc565b604051809103906000f0801580156200b28b573d6000803e3d6000fd5b50506040516200b29b906200c1dc565b604051809103906000f0801580156200b2b8573d6000803e3d6000fd5b50506040516200b2c8906200c1dc565b604051809103906000f0801580156200b2e5573d6000803e3d6000fd5b50506040516200b2f5906200c1dc565b604051809103906000f0801580156200b312573d6000803e3d6000fd5b50506040516200b322906200c1dc565b604051809103906000f0801580156200b33f573d6000803e3d6000fd5b50506040516200b34f906200c1dc565b604051809103906000f0801580156200b36c573d6000803e3d6000fd5b50506040516200b37c906200c1dc565b604051809103906000f0801580156200b399573d6000803e3d6000fd5b50506040516200b3a9906200c1dc565b604051809103906000f0801580156200b3c6573d6000803e3d6000fd5b50506040516200b3d6906200c1dc565b604051809103906000f0801580156200b3f3573d6000803e3d6000fd5b50506040516200b403906200c1dc565b604051809103906000f0801580156200b420573d6000803e3d6000fd5b50506040516200b430906200c1dc565b604051809103906000f0801580156200b44d573d6000803e3d6000fd5b50506040516200b45d906200c1dc565b604051809103906000f0801580156200b47a573d6000803e3d6000fd5b50506040516200b48a906200c1dc565b604051809103906000f0801580156200b4a7573d6000803e3d6000fd5b50506040516200b4b7906200c1dc565b604051809103906000f0801580156200b4d4573d6000803e3d6000fd5b50506040516200b4e4906200c1dc565b604051809103906000f0801580156200b501573d6000803e3d6000fd5b50506040516200b511906200c1dc565b604051809103906000f0801580156200b52e573d6000803e3d6000fd5b50506040516200b53e906200c1dc565b604051809103906000f0801580156200b55b573d6000803e3d6000fd5b50506040516200b56b906200c1dc565b604051809103906000f0801580156200b588573d6000803e3d6000fd5b50506040516200b598906200c1dc565b604051809103906000f0801580156200b5b5573d6000803e3d6000fd5b50506040516200b5c5906200c1dc565b604051809103906000f0801580156200b5e2573d6000803e3d6000fd5b50506040516200b5f2906200c1dc565b604051809103906000f0801580156200b60f573d6000803e3d6000fd5b50506040516200b61f906200c1dc565b604051809103906000f0801580156200b63c573d6000803e3d6000fd5b50506040516200b64c906200c1dc565b604051809103906000f0801580156200b669573d6000803e3d6000fd5b50506040516200b679906200c1dc565b604051809103906000f0801580156200b696573d6000803e3d6000fd5b50506040516200b6a6906200c1dc565b604051809103906000f0801580156200b6c3573d6000803e3d6000fd5b50506040516200b6d3906200c1dc565b604051809103906000f0801580156200b6f0573d6000803e3d6000fd5b50506040516200b700906200c1dc565b604051809103906000f0801580156200b71d573d6000803e3d6000fd5b50506040516200b72d906200c1dc565b604051809103906000f0801580156200b74a573d6000803e3d6000fd5b50506040516200b75a906200c1dc565b604051809103906000f0801580156200b777573d6000803e3d6000fd5b50506040516200b787906200c1dc565b604051809103906000f0801580156200b7a4573d6000803e3d6000fd5b50506040516200b7b4906200c1dc565b604051809103906000f0801580156200b7d1573d6000803e3d6000fd5b50506040516200b7e1906200c1dc565b604051809103906000f0801580156200b7fe573d6000803e3d6000fd5b50506040516200b80e906200c1dc565b604051809103906000f0801580156200b82b573d6000803e3d6000fd5b50506040516200b83b906200c1dc565b604051809103906000f0801580156200b858573d6000803e3d6000fd5b50506040516200b868906200c1dc565b604051809103906000f0801580156200b885573d6000803e3d6000fd5b50506040516200b895906200c1dc565b604051809103906000f0801580156200b8b2573d6000803e3d6000fd5b50506040516200b8c2906200c1dc565b604051809103906000f0801580156200b8df573d6000803e3d6000fd5b50506040516200b8ef906200c1dc565b604051809103906000f0801580156200b90c573d6000803e3d6000fd5b50506040516200b91c906200c1dc565b604051809103906000f0801580156200b939573d6000803e3d6000fd5b50506040516200b949906200c1dc565b604051809103906000f0801580156200b966573d6000803e3d6000fd5b50506040516200b976906200c1dc565b604051809103906000f0801580156200b993573d6000803e3d6000fd5b50506040516200b9a3906200c1dc565b604051809103906000f0801580156200b9c0573d6000803e3d6000fd5b50506040516200b9d0906200c1dc565b604051809103906000f0801580156200b9ed573d6000803e3d6000fd5b50506040516200b9fd906200c1dc565b604051809103906000f0801580156200ba1a573d6000803e3d6000fd5b50506040516200ba2a906200c1dc565b604051809103906000f0801580156200ba47573d6000803e3d6000fd5b50506040516200ba57906200c1dc565b604051809103906000f0801580156200ba74573d6000803e3d6000fd5b50506040516200ba84906200c1dc565b604051809103906000f0801580156200baa1573d6000803e3d6000fd5b50506040516200bab1906200c1dc565b604051809103906000f0801580156200bace573d6000803e3d6000fd5b50506040516200bade906200c1dc565b604051809103906000f0801580156200bafb573d6000803e3d6000fd5b50506040516200bb0b906200c1dc565b604051809103906000f0801580156200bb28573d6000803e3d6000fd5b50506040516200bb38906200c1dc565b604051809103906000f0801580156200bb55573d6000803e3d6000fd5b50506040516200bb65906200c1dc565b604051809103906000f0801580156200bb82573d6000803e3d6000fd5b50506040516200bb92906200c1dc565b604051809103906000f0801580156200bbaf573d6000803e3d6000fd5b50506040516200bbbf906200c1dc565b604051809103906000f0801580156200bbdc573d6000803e3d6000fd5b50506040516200bbec906200c1dc565b604051809103906000f0801580156200bc09573d6000803e3d6000fd5b50506040516200bc19906200c1dc565b604051809103906000f0801580156200bc36573d6000803e3d6000fd5b50506040516200bc46906200c1dc565b604051809103906000f0801580156200bc63573d6000803e3d6000fd5b50506040516200bc73906200c1dc565b604051809103906000f0801580156200bc90573d6000803e3d6000fd5b50506040516200bca0906200c1dc565b604051809103906000f0801580156200bcbd573d6000803e3d6000fd5b50506040516200bccd906200c1dc565b604051809103906000f0801580156200bcea573d6000803e3d6000fd5b50506040516200bcfa906200c1dc565b604051809103906000f0801580156200bd17573d6000803e3d6000fd5b50506040516200bd27906200c1dc565b604051809103906000f0801580156200bd44573d6000803e3d6000fd5b50506040516200bd54906200c1dc565b604051809103906000f0801580156200bd71573d6000803e3d6000fd5b50506040516200bd81906200c1dc565b604051809103906000f0801580156200bd9e573d6000803e3d6000fd5b50506040516200bdae906200c1dc565b604051809103906000f0801580156200bdcb573d6000803e3d6000fd5b50506040516200bddb906200c1dc565b604051809103906000f0801580156200bdf8573d6000803e3d6000fd5b50506040516200be08906200c1dc565b604051809103906000f0801580156200be25573d6000803e3d6000fd5b50506040516200be35906200c1dc565b604051809103906000f0801580156200be52573d6000803e3d6000fd5b50506040516200be62906200c1dc565b604051809103906000f0801580156200be7f573d6000803e3d6000fd5b50506040516200be8f906200c1dc565b604051809103906000f0801580156200beac573d6000803e3d6000fd5b50506040516200bebc906200c1dc565b604051809103906000f0801580156200bed9573d6000803e3d6000fd5b50506040516200bee9906200c1dc565b604051809103906000f0801580156200bf06573d6000803e3d6000fd5b50506040516200bf16906200c1dc565b604051809103906000f0801580156200bf33573d6000803e3d6000fd5b50506040516200bf43906200c1dc565b604051809103906000f0801580156200bf60573d6000803e3d6000fd5b50506040516200bf70906200c1dc565b604051809103906000f0801580156200bf8d573d6000803e3d6000fd5b50506040516200bf9d906200c1dc565b604051809103906000f0801580156200bfba573d6000803e3d6000fd5b50506040516200bfca906200c1dc565b604051809103906000f0801580156200bfe7573d6000803e3d6000fd5b50506040516200bff7906200c1dc565b604051809103906000f0801580156200c014573d6000803e3d6000fd5b50506040516200c024906200c1dc565b604051809103906000f0801580156200c041573d6000803e3d6000fd5b50506040516200c051906200c1dc565b604051809103906000f0801580156200c06e573d6000803e3d6000fd5b50506040516200c07e906200c1dc565b604051809103906000f0801580156200c09b573d6000803e3d6000fd5b50506040516200c0ab906200c1dc565b604051809103906000f0801580156200c0c8573d6000803e3d6000fd5b50506040516200c0d8906200c1dc565b604051809103906000f0801580156200c0f5573d6000803e3d6000fd5b50506040516200c105906200c1dc565b604051809103906000f0801580156200c122573d6000803e3d6000fd5b50506040516200c132906200c1dc565b604051809103906000f0801580156200c14f573d6000803e3d6000fd5b50506040516200c15f906200c1dc565b604051809103906000f0801580156200c17c573d6000803e3d6000fd5b50506040516200c18c906200c1dc565b604051809103906000f0801580156200c1a9573d6000803e3d6000fd5b50506040516200c1b9906200c1dc565b604051809103906000f0801580156200c1d6573d6000803e3d6000fd5b50505050565b60d7806200c1ea8339019056fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50609e806100396000396000f3fe6080604052600436106038577c010000000000000000000000000000000000000000000000000000000060003504631a6952308114603d575b600080fd5b606d60048036036020811015605157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16606f565b005b5056fea165627a7a7230582083f7a0331a259c77978d4e827b5b676f9e07ff2fa04be79c314e25873f3b11040029a165627a7a7230582084782da67a2e82014f2871d2e67c7a7d13b0595d88286112fb82e4f6ea3cf8700029" - code_Scenario015_TRC20_TRON = "6060604052604060405190810160405280600681526020017f54726f6e697800000000000000000000000000000000000000000000000000008152506000908051906020019062000052929190620001b6565b50604060405190810160405280600381526020017f545258000000000000000000000000000000000000000000000000000000000081525060019080519060200190620000a1929190620001b6565b50600660025560006005556000600660006101000a81548160ff0219169083151502179055506000600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034156200011257fe5b5b33600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555067016345785d8a000060058190555067016345785d8a0000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b62000265565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001f957805160ff19168380011785556200022a565b828001600101855582156200022a579182015b82811115620002295782518255916020019190600101906200020c565b5b5090506200023991906200023d565b5090565b6200026291905b808211156200025e57600081600090555060010162000244565b5090565b90565b61111480620002756000396000f300606060405236156100ce576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100d057806307da68f514610169578063095ea7b31461017b57806318160ddd146101d257806323b872dd146101f8578063313ce5671461026e57806342966c681461029457806370a08231146102b457806375f12b21146102fe57806395d89b4114610328578063a9059cbb146103c1578063be9a655514610418578063c47f00271461042a578063dd62ed3e14610484575bfe5b34156100d857fe5b6100e06104ed565b604051808060200182810382528381815181526020019150805190602001908083836000831461012f575b80518252602083111561012f5760208201915060208101905060208303925061010b565b505050905090810190601f16801561015b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017157fe5b61017961058b565b005b341561018357fe5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610603565b604051808215151515815260200191505060405180910390f35b34156101da57fe5b6101e26107cb565b6040518082815260200191505060405180910390f35b341561020057fe5b610254600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107d1565b604051808215151515815260200191505060405180910390f35b341561027657fe5b61027e610b11565b6040518082815260200191505060405180910390f35b341561029c57fe5b6102b26004808035906020019091905050610b17565b005b34156102bc57fe5b6102e8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3f565b6040518082815260200191505060405180910390f35b341561030657fe5b61030e610c57565b604051808215151515815260200191505060405180910390f35b341561033057fe5b610338610c6a565b6040518080602001828103825283818151815260200191508051906020019080838360008314610387575b80518252602083111561038757602082019150602081019050602083039250610363565b505050905090810190601f1680156103b35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103c957fe5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d08565b604051808215151515815260200191505060405180910390f35b341561042057fe5b610428610f31565b005b341561043257fe5b610482600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fa9565b005b341561048c57fe5b6104d7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061101e565b6040518082815260200191505060405180910390f35b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105835780601f1061055857610100808354040283529160200191610583565b820191906000526020600020905b81548152906001019060200180831161056657829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156105e457fe5b6001600660006101000a81548160ff0219169083151502179055505b5b565b6000600660009054906101000a900460ff1615151561061e57fe5b3373ffffffffffffffffffffffffffffffffffffffff1660001415151561064157fe5b60008214806106cc57506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15156106d85760006000fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3600190505b5b5b92915050565b60055481565b6000600660009054906101000a900460ff161515156107ec57fe5b3373ffffffffffffffffffffffffffffffffffffffff1660001415151561080f57fe5b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561085e5760006000fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401101515156108ee5760006000fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561097a5760006000fd5b81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b5b5b9392505050565b60025481565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610b665760006000fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508060036000600073ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35b50565b60036020528060005260406000206000915090505481565b600660009054906101000a900460ff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d005780601f10610cd557610100808354040283529160200191610d00565b820191906000526020600020905b815481529060010190602001808311610ce357829003601f168201915b505050505081565b6000600660009054906101000a900460ff16151515610d2357fe5b3373ffffffffffffffffffffffffffffffffffffffff16600014151515610d4657fe5b81600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610d955760006000fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110151515610e255760006000fd5b81600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b5b5b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610f8a57fe5b6000600660006101000a81548160ff0219169083151502179055505b5b565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561100257fe5b8060009080519060200190611018929190611043565b505b5b50565b6004602052816000526040600020602052806000526040600020600091509150505481565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061108457805160ff19168380011785556110b2565b828001600101855582156110b2579182015b828111156110b1578251825591602001919060010190611096565b5b5090506110bf91906110c3565b5090565b6110e591905b808211156110e15760008160009055506001016110c9565b5090565b905600a165627a7a723058204858328431ff0a4e0db74ff432e5805ce4bcf91a1c59650a93bd7c1aec5e0fe10029" - code_MainGateway = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50604051602080611df8833981016040818152915160008054600160a060020a0319163317815560016004819055600160a060020a0383168083526003602090815292869020805460ff191690921790915583529251909283927f51b292b9f000ae271c781ab0e5f63c49de0000ab30e186d92a03bbaf3325a4a3929081900390910190a15050611d38806100c06000396000f3006080604052600436106101195763ffffffff60e060020a6000350416630aa33f758114610144578063190791da146101935780634b398e991461021c5780635821563e1461022457806361857b441461022c578063715018a61461026a5780637276575c146102995780637ecebe00146102d7578063898de999146103245780638d3e651d146103535780638da5cb5b146103dc57806394042b46146104275780639435455f14610459578063a165302a14610499578063a8ced426146104d7578063bc2de9b01461055d578063bcad917b14610598578063cb912b1e14610650578063cd9df8e1146106d3578063d3d5177b14610702578063e77256f814610743578063e7fc18f8146107c6578063f2fde38b14610801575b620f4240d311156101315761012c61083c565b610142565b6000341115610142576101426108b4565b005b34801561015057600080fd5b50d3801561015d57600080fd5b50d2801561016a57600080fd5b5061017f600160a060020a0360043516610906565b604080519115158252519081900360200190f35b34801561019f57600080fd5b50d380156101ac57600080fd5b50d280156101b957600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261014294600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506109489650505050505050565b6101426108b4565b61014261083c565b34801561023857600080fd5b50d3801561024557600080fd5b50d2801561025257600080fd5b50610142600435600160a060020a0360243516610cb2565b34801561027657600080fd5b50d3801561028357600080fd5b50d2801561029057600080fd5b50610142610e35565b3480156102a557600080fd5b50d380156102b257600080fd5b50d280156102bf57600080fd5b50610142600435600160a060020a0360243516610ea1565b3480156102e357600080fd5b50d380156102f057600080fd5b50d280156102fd57600080fd5b50610312600160a060020a0360043516610ff6565b60408051918252519081900360200190f35b34801561033057600080fd5b50d3801561033d57600080fd5b50d2801561034a57600080fd5b50610312611008565b34801561035f57600080fd5b50d3801561036c57600080fd5b50d2801561037957600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261014294600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061100e9650505050505050565b3480156103e857600080fd5b50d380156103f557600080fd5b50d2801561040257600080fd5b5061040b6112ed565b60408051600160a060020a039092168252519081900360200190f35b34801561043357600080fd5b50d3801561044057600080fd5b50d2801561044d57600080fd5b506103126004356112fc565b34801561046557600080fd5b50d3801561047257600080fd5b50d2801561047f57600080fd5b50610142600160a060020a0360043516602435151561130e565b3480156104a557600080fd5b50d380156104b257600080fd5b50d280156104bf57600080fd5b5061017f600435600160a060020a0360243516611350565b3480156104e357600080fd5b50d380156104f057600080fd5b50d280156104fd57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261014294600160a060020a0381351694602480359560443595369560849493019181908401838280828437509497506113789650505050505050565b34801561056957600080fd5b50d3801561057657600080fd5b50d2801561058357600080fd5b5061040b600160a060020a036004351661163a565b3480156105a457600080fd5b50d380156105b157600080fd5b50d280156105be57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261061b948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506116559650505050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561065c57600080fd5b50d3801561066957600080fd5b50d2801561067657600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261061b948235600160a060020a031694602480359536959460649492019190819084018382808284375094975061172c9650505050505050565b3480156106df57600080fd5b50d380156106ec57600080fd5b50d280156106f957600080fd5b50610312611803565b34801561070e57600080fd5b50d3801561071b57600080fd5b50d2801561072857600080fd5b50610142600160a060020a0360043581169060243516611809565b34801561074f57600080fd5b50d3801561075c57600080fd5b50d2801561076957600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610142948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506118589650505050505050565b3480156107d257600080fd5b50d380156107df57600080fd5b50d280156107ec57600080fd5b50610312600160a060020a0360043516611af6565b34801561080d57600080fd5b50d3801561081a57600080fd5b50d2801561082757600080fd5b50610142600160a060020a0360043516611b11565bd360009081526006602052604090205461085c90d263ffffffff611b3416565bd3600081815260066020908152604091829020939093558051338152d29381019390935282810191909152517f752bc43ba57e4a49162727f5fb5d6f7b0e017826011a02a0b3cddcd70c49b1459181900360600190a1565b6005546108c7903463ffffffff611b3416565b6005556040805133815234602082015281517f1bab02886c659969cbb004cc17dc19be19f193323a306e26c669bedb29c651f7929181900390910190a1565b60008054600160a060020a038381169116141561092557506001610943565b50600160a060020a03811660009081526003602052604090205460ff165b919050565b83828483606060008061095a33610906565b151561096557600080fd5b6040805160028082526060820183529091602083019080388339505050600160a060020a03881660009081526002602052604081205482519295509185919081106109ac57fe5b6020908102909101015282518690849060019081106109c757fe5b906020019060200201818152505084836040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828051906020019060200280838360005b83811015610a2e578181015183820152602001610a16565b50505050905001925050506040516020818303038152906040526040518082805190602001908083835b60208310610a775780518252601f199092019160209182019101610a58565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209450610ab29250849150869050611b4a565b9050600160a060020a0380821690881614610b05576040805160e560020a62461bcd02815260206004820152601e6024820152600080516020611ced833981519152604482015290519081900360640190fd5b600160a060020a038a1660009081526008602090815260408083208c845290915290205460ff161515610b82576040805160e560020a62461bcd02815260206004820152601260248201527f446f6573206e6f74206f776e20746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b89600160a060020a031663a9059cbb8c8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610be557600080fd5b505af1158015610bf9573d6000803e3d6000fd5b505050600160a060020a03808c1660009081526008602090815260408083208e845290915290819020805460ff1916905551908d1691507f591f2d33d85291e32c4067b5a497caf3ddb5b1830eba9909e66006ec3a0051b4906003908d908d9080845b60ff168152600160a060020a0390931660208401525060408083019190915251908190036060019150a2505050600160a060020a0390931660009081526002602052604090208054600101905550505050505050565b600160a060020a03818116600090815260016020526040902054161515610d11576040805160e560020a62461bcd0281526020600482015260136024820152600080516020611ccd833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051600160a060020a038316916323b872dd9160648083019260209291908290030181600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d6020811015610da957600080fd5b5050600160a060020a038116600090815260076020526040902054610dd4908363ffffffff611b3416565b600160a060020a03821660008181526007602090815260409182902093909355805133815292830185905282810191909152517fe669217c299ce4efdf9b6269aaa41cc844a89016bdb0badde25a2e2f469cc3409181900360600190a15050565b600054600160a060020a03163314610e4c57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600160a060020a03818116600090815260016020526040902054161515610f00576040805160e560020a62461bcd0281526020600482015260136024820152600080516020611ccd833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051600160a060020a038316916323b872dd91606480830192600092919082900301818387803b158015610f6d57600080fd5b505af1158015610f81573d6000803e3d6000fd5b505050600160a060020a0382166000818152600860209081526040808320878452825291829020805460ff19166001179055815133815290810186905280820192909252517fdf4b094c64ac1ec490d3302edb22d396ed9c1f23b14d2c307e04858399cc393292509081900360600190a15050565b60026020526000908152604090205481565b60045481565b83828483606060008061102033610906565b151561102b57600080fd5b6040805160028082526060820183529091602083019080388339505050600160a060020a038816600090815260026020526040812054825192955091859190811061107257fe5b60209081029091010152825186908490600190811061108d57fe5b906020019060200201818152505084836040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828051906020019060200280838360005b838110156110f45781810151838201526020016110dc565b50505050905001925050506040516020818303038152906040526040518082805190602001908083835b6020831061113d5780518252601f19909201916020918201910161111e565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912094506111789250849150869050611b4a565b9050600160a060020a03808216908816146111cb576040805160e560020a62461bcd02815260206004820152601e6024820152600080516020611ced833981519152604482015290519081900360640190fd5b600160a060020a038a166000908152600760205260409020546111f4908a63ffffffff611be116565b600560020160008c600160a060020a0316600160a060020a031681526020019081526020016000208190555089600160a060020a031663a9059cbb8c8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b5050604051600160a060020a038c16907f591f2d33d85291e32c4067b5a497caf3ddb5b1830eba9909e66006ec3a0051b4906002908d908d908084610c5c565b600054600160a060020a031681565b60009081526006602052604090205490565b600054600160a060020a0316331461132557600080fd5b600160a060020a03919091166000908152600360205260409020805460ff1916911515919091179055565b600160a060020a03166000908152600860209081526040808320938352929052205460ff1690565b83828483606060008061138a33610906565b151561139557600080fd5b604080516003808252608082019092529060208201606080388339019050509250848360008151811015156113c657fe5b6020908102909101810191909152600160a060020a0388166000908152600290915260409020548351849060019081106113fc57fe5b60209081029091010152825186908490600290811061141757fe5b90602001906020020181815250508260405160200180828051906020019060200280838360005b8381101561145657818101518382015260200161143e565b505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831061149e5780518252601f19909201916020918201910161147f565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912094506114d99250849150869050611b4a565b9050600160a060020a038082169088161461152c576040805160e560020a62461bcd02815260206004820152601e6024820152600080516020611ced833981519152604482015290519081900360640190fd5b60008a81526006602052604090205461154b908a63ffffffff611be116565b60008b815260066020526040902055600160a060020a038b1689156108fc028a8c8015801561157957600080fd5b50806780000000000000001115801561159157600080fd5b5080620f4240101580156115a457600080fd5b50604051600081818185878a8ad09450505050501580156115c9573d6000803e3d6000fd5b506040805160018152602081018c90528082018b9052905133917f472adea2ebbd52a19b140bc25ddcbbe8d3317953a32da818924bab945e4709b1919081900360600190a2505050600160a060020a0390931660009081526002602052604090208054600101905550505050505050565b600160205260009081526040902054600160a060020a031681565b33600090815260016020526040812054600160a060020a031615156116b2576040805160e560020a62461bcd0281526020600482015260136024820152600080516020611ccd833981519152604482015290519081900360640190fd5b6116bb83611bf6565b60408051600160a060020a038616815260208101859052338183015290517fe669217c299ce4efdf9b6269aaa41cc844a89016bdb0badde25a2e2f469cc3409181900360600190a1507fbcad917b000000000000000000000000000000000000000000000000000000009392505050565b33600090815260016020526040812054600160a060020a03161515611789576040805160e560020a62461bcd0281526020600482015260136024820152600080516020611ccd833981519152604482015290519081900360640190fd5b61179283611c29565b60408051600160a060020a038616815260208101859052338183015290517fdf4b094c64ac1ec490d3302edb22d396ed9c1f23b14d2c307e04858399cc39329181900360600190a1507fcb912b1e000000000000000000000000000000000000000000000000000000009392505050565b60055490565b61181233610906565b151561181d57600080fd5b600160a060020a039182166000908152600160205260409020805473ffffffffffffffffffffffffffffffffffffffff191691909216179055565b82823083606060008061186a33610906565b151561187557600080fd5b6040805160028082526060820183529091602083019080388339505050600160a060020a03881660009081526002602052604081205482519295509185919081106118bc57fe5b6020908102909101015282518690849060019081106118d757fe5b906020019060200201818152505084836040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828051906020019060200280838360005b8381101561193e578181015183820152602001611926565b50505050905001925050506040516020818303038152906040526040518082805190602001908083835b602083106119875780518252601f199092019160209182019101611968565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912094506119c29250849150869050611b4a565b9050600160a060020a0380821690881614611a15576040805160e560020a62461bcd02815260206004820152601e6024820152600080516020611ced833981519152604482015290519081900360640190fd5b600554611a28908a63ffffffff611be116565b600555604051600160a060020a038b16908a156108fc02908b906000818181858888f19350505050158015611a61573d6000803e3d6000fd5b5089600160a060020a03167f591f2d33d85291e32c4067b5a497caf3ddb5b1830eba9909e66006ec3a0051b46000808c60405180846003811115611aa157fe5b60ff168152600160a060020a0390931660208401525060408083019190915251908190036060019150a2505050600160a060020a03909316600090815260026020526040902080546001019055505050505050565b600160a060020a031660009081526007602052604090205490565b600054600160a060020a03163314611b2857600080fd5b611b3181611c4f565b50565b81810182811015611b4457600080fd5b92915050565b60208101516040820151604183015160009260ff90911691601b831015611b7257601b830192505b60408051600080825260208083018085528a905260ff8716838501526060830186905260808301859052925160019360a0808501949193601f19840193928390039091019190865af1158015611bcc573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600082821115611bf057600080fd5b50900390565b33600090815260076020526040902054611c16908263ffffffff611b3416565b3360009081526007602052604090205550565b33600090815260086020908152604080832093835292905220805460ff19166001179055565b600160a060020a0381161515611c6457600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905556004e6f7420616e20616c6c6f776520746f6b656e000000000000000000000000004d657373616765206e6f74207369676e65642062792061206761696e65720000a165627a7a723058205cb7d7406fcca2093208cdfb8fa6d9a1ce5e4ae6b526286910d1b63990e322030029" - code_SideGateway = "608060405260068054600160a060020a03199081166201000017909155600780549091166201000117905534801561003657600080fd5b50d3801561004357600080fd5b50d2801561005057600080fd5b50604051602080613c54833981016040908152905160048054600160a060020a03191633179055600160a060020a03166000908152600360205220805460ff19166001179055613baf806100a56000396000f300608060405260043610620001195763ffffffff60e060020a6000350416630a61c59f81146200011e5780630bb0482f14620001605780630f40ef09146200028e5780631f1767eb14620002dc57806331775cc6146200032e578063455042361462000377578063473c3bd714620003c257806355781fcf146200041e57806367bf590314620005175780637ce67366146200054b5780638da5cb5b14620005ce5780639435455f1462000602578063ab15bdf81462000647578063addd5099146200073b578063bcad917b146200077b578063cb912b1e1462000838578063db13a12b14620008c0578063ded8454a1462000900578063ede1a1e91462000940578063eff457d2146200098e578063fce16fec14620009d1575b600080fd5b3480156200012b57600080fd5b50d380156200013957600080fd5b50d280156200014757600080fd5b506200015e600160a060020a036004351662000a1a565b005b3480156200016d57600080fd5b50d380156200017b57600080fd5b50d280156200018957600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200021694369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975062000ac29650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200025257818101518382015260200162000238565b50505050905090810190601f168015620002805780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526200015e94369492936024939284019190819084018382808284375094975062000bb49650505050505050565b348015620002e957600080fd5b50d38015620002f757600080fd5b50d280156200030557600080fd5b506200015e600160a060020a036004351660243560443560643560843560ff60a4351662000ca3565b3480156200033b57600080fd5b50d380156200034957600080fd5b50d280156200035757600080fd5b506200015e600160a060020a036004358116906024351660443562000e9c565b3480156200038457600080fd5b50d380156200039257600080fd5b50d28015620003a057600080fd5b50620003ae60043562001022565b604080519115158252519081900360200190f35b348015620003cf57600080fd5b50d38015620003dd57600080fd5b50d28015620003eb57600080fd5b5062000402600160a060020a036004351662001037565b60408051600160a060020a039092168252519081900360200190f35b3480156200042b57600080fd5b50d380156200043957600080fd5b50d280156200044757600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200040294369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505050923560ff1693506200105292505050565b3480156200052457600080fd5b50d380156200053257600080fd5b50d280156200054057600080fd5b506200040262001344565b3480156200055857600080fd5b50d380156200056657600080fd5b50d280156200057457600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200040294369492936024939284019190819084018382808284375094975050509235600160a060020a031693506200135392505050565b348015620005db57600080fd5b50d38015620005e957600080fd5b50d28015620005f757600080fd5b5062000402620013da565b3480156200060f57600080fd5b50d380156200061d57600080fd5b50d280156200062b57600080fd5b506200015e600160a060020a03600435166024351515620013e9565b3480156200065457600080fd5b50d380156200066257600080fd5b50d280156200067057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200040294369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506200142c9650505050505050565b3480156200074857600080fd5b50d380156200075657600080fd5b50d280156200076457600080fd5b50620003ae600160a060020a036004351662001712565b3480156200078857600080fd5b50d380156200079657600080fd5b50d28015620007a457600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845262000803948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750620017279650505050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b3480156200084557600080fd5b50d380156200085357600080fd5b50d280156200086157600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845262000803948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750620019019650505050505050565b348015620008cd57600080fd5b50d38015620008db57600080fd5b50d28015620008e957600080fd5b5062000402600160a060020a036004351662001b01565b3480156200090d57600080fd5b50d380156200091b57600080fd5b50d280156200092957600080fd5b5062000216600160a060020a036004351662001b1c565b6040805160206004803580820135601f81018490048402850184019095528484526200015e94369492936024939284019190819084018382808284375094975062001b519650505050505050565b3480156200099b57600080fd5b50d38015620009a957600080fd5b50d28015620009b757600080fd5b506200015e600160a060020a036004351660243562001cf1565b348015620009de57600080fd5b50d38015620009ec57600080fd5b50d28015620009fa57600080fd5b506200015e600160a060020a036004358116906024351660443562001dbf565b600454600160a060020a0316331462000a3257600080fd5b600160a060020a038116151562000a93576040805160e560020a62461bcd02815260206004820152601e60248201527f5f73756e546f6b656e41646472657373203d3d20616464726573732830290000604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6060826041836040516020018084805190602001908083835b6020831062000afc5780518252601f19909201916020918201910162000adb565b6001836020036101000a0380198251168184511680821785525050505050509050018360ff167f010000000000000000000000000000000000000000000000000000000000000002815260010182805190602001908083835b6020831062000b765780518252601f19909201916020918201910162000b55565b6001836020036101000a0380198251168184511680821785525050505050509050019350505050604051602081830303815290604052905092915050565b6040516000903480156108fc029183818181858288f1935050505015801562000be1573d6000803e3d6000fd5b507f7a47a70a1221ce1b92f8d000c55e2c92c0255a381cf1be25c3ca697593ecc96a3334836040518084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101562000c6357818101518382015260200162000c49565b50505050905090810190601f16801562000c915780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150565b3360009081526003602052604081205460ff16151562000cc257600080fd5b620f42408611801562000cd85750621e84808611155b151562000d55576040805160e560020a62461bcd02815260206004820152602360248201527f7472633130203c3d2031303030303030206f72207472633130203e203230303060448201527f3030300000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060008581526002602052604090205460ff1680151562000d8a576000868152600260205260409020805460ff191660011790555b60075460408051878152602081018990528082018790526060810186905260ff851660808201529051600160a060020a039092169160a0808301926000929190829003018183865af1505050600160a060020a0387166108fc86150286888015801562000df657600080fd5b50806780000000000000001115801562000e0f57600080fd5b5080620f42401015801562000e2357600080fd5b50604051600081818185878a8ad094505050505015801562000e49573d6000803e3d6000fd5b5060408051600160a060020a03891681526020810188905280820187905290517f4aac44dc080543b9fe45d9dfaad396001ee0ecdc07499d64e2e798bfffc42fde9181900360600190a150505050505050565b3360009081526003602052604081205460ff16151562000ebb57600080fd5b50600160a060020a038083166000908152602081905260409020541680151562000f54576040805160e560020a62461bcd028152602060048201526024808201527f746865206d61696e20636861696e2061646472657373206861736e2774206d6160448201527f7070656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b80600160a060020a03166340c10f1985846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801562000fb857600080fd5b505af115801562000fcd573d6000803e3d6000fd5b505060408051600160a060020a0380861682528816602082015280820186905290517f48c104169bad147dfc9c0b2ac8fc83202a035d4d9632e24e839680be759772089350908190036060019150a150505050565b60026020526000908152604090205460ff1681565b600060208190529081526040902054600160a060020a031681565b600080600062001063873362001353565b600160a060020a038082166000908152602081905260409020549193501615620010fd576040805160e560020a62461bcd02815260206004820152602160248201527f746865206d61696e20636861696e206164647265737320686173206d6170706560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600554600160a060020a03838116911614156200118a576040805160e560020a62461bcd02815260206004820152602360248201527f6d61696e436861696e41646472657373203d3d2073756e546f6b656e4164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b308686866200119862001f45565b600160a060020a038516815260ff82166060820152608060208083018281528651928401929092528551604084019160a08501919088019080838360005b83811015620011f0578181015183820152602001620011d6565b50505050905090810190601f1680156200121e5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156200125357818101518382015260200162001239565b50505050905090810190601f168015620012815780820380516001836020036101000a031916815260200191505b509650505050505050604051809103906000f080158015620012a7573d6000803e3d6000fd5b50600160a060020a03808416600081815260208181526040808320805495871673ffffffffffffffffffffffffffffffffffffffff1996871681179091558084526001835292819020805490951684179094558351338152908101929092528183015290519192507fee201bea1b0aff77f5f792b979e4732ba6605c2203d0f92f9aa45625eff88222919081900360600190a19695505050505050565b600554600160a060020a031681565b6000606080620013638462001b1c565b915062001371858362000ac2565b9050806040518082805190602001908083835b60208310620013a55780518252601f19909201916020918201910162001384565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b600454600160a060020a031681565b600454600160a060020a031633146200140157600080fd5b600160a060020a03919091166000908152600360205260409020805460ff1916911515919091179055565b60008060006200143d863362001353565b600160a060020a038082166000908152602081905260409020549193501615620014d7576040805160e560020a62461bcd02815260206004820152602160248201527f746865206d61696e20636861696e206164647265737320686173206d6170706560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600554600160a060020a038381169116141562001564576040805160e560020a62461bcd02815260206004820152602360248201527f6d61696e436861696e41646472657373203d3d2073756e546f6b656e4164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3085856200157162001f56565b600160a060020a0384168152606060208083018281528551928401929092528451604084019160808501919087019080838360005b83811015620015c0578181015183820152602001620015a6565b50505050905090810190601f168015620015ee5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156200162357818101518382015260200162001609565b50505050905090810190601f168015620016515780820380516001836020036101000a031916815260200191505b5095505050505050604051809103906000f08015801562001676573d6000803e3d6000fd5b50600160a060020a03808416600081815260208181526040808320805495871673ffffffffffffffffffffffffffffffffffffffff1996871681179091558084526001835292819020805490951684179094558351338152908101929092528183015290519192507fa2399d6f422f35b470d7aff96f7b2d8ce1c07bc14d978c9fbad6083461c564a7919081900360600190a195945050505050565b60036020526000908152604090205460ff1681565b33600081815260016020526040812054909190600160a060020a03168015156200179b576040805160e560020a62461bcd02815260206004820152601e60248201527f6d61696e436861696e41646472657373203d3d20616464726573732830290000604482015290519081900360640190fd5b81600160a060020a03166342966c68866040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015620017e557600080fd5b505af1158015620017fa573d6000803e3d6000fd5b505050507fc7b54407df97321a6170a99eeb667db3dc95205c9a9b12a4f1673bac84066544868683876040518085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620018985781810151838201526020016200187e565b50505050905090810190601f168015620018c65780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1507fbcad917b0000000000000000000000000000000000000000000000000000000095945050505050565b33600081815260016020526040812054909190600160a060020a03168015156200199b576040805160e560020a62461bcd02815260206004820152602360248201527f74686520747263373231206d7573742068617665206265656e206465706f736960448201527f7465640000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b81600160a060020a03166342966c68866040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015620019e557600080fd5b505af1158015620019fa573d6000803e3d6000fd5b505050507fa93bdc38faeb2081566bca9d2c041ba1545a11a459c67a8baf5c671a262e9b7c868683876040518085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101562001a9857818101518382015260200162001a7e565b50505050905090810190601f16801562001ac65780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1507fcb912b1e0000000000000000000000000000000000000000000000000000000095945050505050565b600160205260009081526040902054600160a060020a031681565b60408051600160a060020a03929092167414000000000000000000000000000000000000000018601483015260348201905290565bd360009081526002602052604090205460ff16151562001bbb576040805160e560020a62461bcd02815260206004820152601e60248201527f74726331304d61705b6d73672e746f6b656e69645d203d3d2066616c73650000604482015290519081900360640190fd5b6000d280156108fc0290d38015801562001bd457600080fd5b50806780000000000000001115801562001bed57600080fd5b5080620f42401015801562001c0157600080fd5b50604051600081818185878a8ad094505050505015801562001c27573d6000803e3d6000fd5b507f4cdc0dc16c2640bf1cbeebfe9055747d6c36b74120ed1d06440846a8150cc4c333d2d3846040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101562001cb057818101518382015260200162001c96565b50505050905090810190601f16801562001cde5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a150565b3360009081526003602052604090205460ff16151562001d1057600080fd5b600654604080518381529051600160a060020a03909216916020808301926000929190829003018183865af15050604051600160a060020a038416915082156108fc029083906000818181858888f1935050505015801562001d76573d6000803e3d6000fd5b5060408051600160a060020a03841681526020810183905281517f0e3147459e9437f793e793b98df267ee885cfe4ad096b279287f03dcd0ca0497929181900390910190a15050565b3360009081526003602052604081205460ff16151562001dde57600080fd5b50600160a060020a038083166000908152602081905260409020541680151562001e77576040805160e560020a62461bcd028152602060048201526024808201527f746865206d61696e20636861696e2061646472657373206861736e2774206d6160448201527f7070656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b80600160a060020a03166340c10f1985846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801562001edb57600080fd5b505af115801562001ef0573d6000803e3d6000fd5b505060408051600160a060020a0380861682528816602082015280820186905290517fb49dbda83c867b85d55c88d22a084e7db05c8a29e16d027af1b02105906d16bc9350908190036060019150a150505050565b604051610d7c8062001f6883390190565b604051610ea08062002ce4833901905600608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50604051610d7c380380610d7c833981016040908152815160208084015192840151606085015160038054600160a060020a031916600160a060020a0386161790559385018051939590949101929091610089916004918601906100bf565b50815161009d9060059060208501906100bf565b506006805460ff191660ff92909216919091179055505060006002555061015a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010057805160ff191683800117855561012d565b8280016001018555821561012d579182015b8281111561012d578251825591602001919060010190610112565b5061013992915061013d565b5090565b61015791905b808211156101395760008155600101610143565b90565b610c13806101696000396000f3006080604052600436106100da5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100df578063095ea7b314610183578063116191b6146101d557806318160ddd1461022057806323b872dd14610261578063313ce567146102a557806339509351146102ea57806340c10f191461032857806342966c681461036857806349e118931461039a57806370a082311461041257806395d89b411461044d578063a457c2d71461047c578063a9059cbb146104ba578063dd62ed3e146104f8575b600080fd5b3480156100eb57600080fd5b50d380156100f857600080fd5b50d2801561010557600080fd5b5061010e610539565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610148578181015183820152602001610130565b50505050905090810190601f1680156101755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018f57600080fd5b50d3801561019c57600080fd5b50d280156101a957600080fd5b506101c1600160a060020a03600435166024356105c7565b604080519115158252519081900360200190f35b3480156101e157600080fd5b50d380156101ee57600080fd5b50d280156101fb57600080fd5b506102046105dd565b60408051600160a060020a039092168252519081900360200190f35b34801561022c57600080fd5b50d3801561023957600080fd5b50d2801561024657600080fd5b5061024f6105ec565b60408051918252519081900360200190f35b34801561026d57600080fd5b50d3801561027a57600080fd5b50d2801561028757600080fd5b506101c1600160a060020a03600435811690602435166044356105f2565b3480156102b157600080fd5b50d380156102be57600080fd5b50d280156102cb57600080fd5b506102d4610649565b6040805160ff9092168252519081900360200190f35b3480156102f657600080fd5b50d3801561030357600080fd5b50d2801561031057600080fd5b506101c1600160a060020a0360043516602435610652565b34801561033457600080fd5b50d3801561034157600080fd5b50d2801561034e57600080fd5b50610366600160a060020a036004351660243561068e565b005b34801561037457600080fd5b50d3801561038157600080fd5b50d2801561038e57600080fd5b5061036660043561074f565b3480156103a657600080fd5b50d380156103b357600080fd5b50d280156103c057600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261036695833595369560449491939091019190819084018382808284375094975061075c9650505050505050565b34801561041e57600080fd5b50d3801561042b57600080fd5b50d2801561043857600080fd5b5061024f600160a060020a03600435166108d0565b34801561045957600080fd5b50d3801561046657600080fd5b50d2801561047357600080fd5b5061010e6108eb565b34801561048857600080fd5b50d3801561049557600080fd5b50d280156104a257600080fd5b506101c1600160a060020a0360043516602435610946565b3480156104c657600080fd5b50d380156104d357600080fd5b50d280156104e057600080fd5b506101c1600160a060020a0360043516602435610982565b34801561050457600080fd5b50d3801561051157600080fd5b50d2801561051e57600080fd5b5061024f600160a060020a036004358116906024351661098f565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105bf5780601f10610594576101008083540402835291602001916105bf565b820191906000526020600020905b8154815290600101906020018083116105a257829003601f168201915b505050505081565b60006105d43384846109ba565b50600192915050565b600354600160a060020a031681565b60025490565b60006105ff848484610a46565b600160a060020a03841660009081526001602090815260408083203380855292529091205461063f91869161063a908663ffffffff610b1316565b6109ba565b5060019392505050565b60065460ff1681565b336000818152600160209081526040808320600160a060020a038716845290915281205490916105d491859061063a908663ffffffff610b2816565b600354600160a060020a031633146106a557600080fd5b600160a060020a03821615156106ba57600080fd5b6002546106cd908263ffffffff610b2816565b600255600160a060020a0382166000908152602081905260409020546106f9908263ffffffff610b2816565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6107593382610b3e565b50565b60035460009061077590600160a060020a031684610982565b506003546040517fbcad917b000000000000000000000000000000000000000000000000000000008152336004820181815260248301879052606060448401908152865160648501528651600160a060020a039095169463bcad917b94899389939092909160840190602085019080838360005b838110156108015781810151838201526020016107e9565b50505050905090810190601f16801561082e5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561084f57600080fd5b505af1158015610863573d6000803e3d6000fd5b505050506040513d602081101561087957600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbcad917b00000000000000000000000000000000000000000000000000000000146108cb57600080fd5b505050565b600160a060020a031660009081526020819052604090205490565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105bf5780601f10610594576101008083540402835291602001916105bf565b336000818152600160209081526040808320600160a060020a038716845290915281205490916105d491859061063a908663ffffffff610b1316565b60006105d4338484610a46565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b600160a060020a03821615156109cf57600080fd5b600160a060020a03831615156109e457600080fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600160a060020a0382161515610a5b57600080fd5b600160a060020a038316600090815260208190526040902054610a84908263ffffffff610b1316565b600160a060020a038085166000908152602081905260408082209390935590841681522054610ab9908263ffffffff610b2816565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115610b2257600080fd5b50900390565b81810182811015610b3857600080fd5b92915050565b600160a060020a0382161515610b5357600080fd5b600254610b66908263ffffffff610b1316565b600255600160a060020a038216600090815260208190526040902054610b92908263ffffffff610b1316565b600160a060020a038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a350505600a165627a7a7230582030edf24eb27134d7c77898452315198f9886970c7fed0049b49cd05f121562db0029608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060405162000ea038038062000ea083398101604090815281516020808401519284015160048054600160a060020a031916600160a060020a038516179055928401805192949093019161008491600591908501906100a1565b5080516100989060069060208401906100a1565b5050505061013c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e257805160ff191683800117855561010f565b8280016001018555821561010f579182015b8281111561010f5782518255916020019190600101906100f4565b5061011b92915061011f565b5090565b61013991905b8082111561011b5760008155600101610125565b90565b610d54806200014c6000396000f3006080604052600436106100cf5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100d4578063081812fc14610178578063095ea7b3146101c6578063116191b61461020657806323b872dd1461023557806340c10f191461027957806342966c68146102b757806349e11893146102e95780636352211e1461036157806370a082311461039357806395d89b41146103e0578063a22cb4651461040f578063a9059cbb1461044f578063e985e9c51461048d575b600080fd5b3480156100e057600080fd5b50d380156100ed57600080fd5b50d280156100fa57600080fd5b506101036104e2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013d578181015183820152602001610125565b50505050905090810190601f16801561016a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018457600080fd5b50d3801561019157600080fd5b50d2801561019e57600080fd5b506101aa600435610570565b60408051600160a060020a039092168252519081900360200190f35b3480156101d257600080fd5b50d380156101df57600080fd5b50d280156101ec57600080fd5b50610204600160a060020a03600435166024356105a2565b005b34801561021257600080fd5b50d3801561021f57600080fd5b50d2801561022c57600080fd5b506101aa610658565b34801561024157600080fd5b50d3801561024e57600080fd5b50d2801561025b57600080fd5b50610204600160a060020a0360043581169060243516604435610667565b34801561028557600080fd5b50d3801561029257600080fd5b50d2801561029f57600080fd5b50610204600160a060020a036004351660243561068c565b3480156102c357600080fd5b50d380156102d057600080fd5b50d280156102dd57600080fd5b50610204600435610763565b3480156102f557600080fd5b50d3801561030257600080fd5b50d2801561030f57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102049583359536956044949193909101919081908401838280828437509497506107709650505050505050565b34801561036d57600080fd5b50d3801561037a57600080fd5b50d2801561038757600080fd5b506101aa6004356108e0565b34801561039f57600080fd5b50d380156103ac57600080fd5b50d280156103b957600080fd5b506103ce600160a060020a036004351661090a565b60408051918252519081900360200190f35b3480156103ec57600080fd5b50d380156103f957600080fd5b50d2801561040657600080fd5b5061010361093d565b34801561041b57600080fd5b50d3801561042857600080fd5b50d2801561043557600080fd5b50610204600160a060020a03600435166024351515610998565b34801561045b57600080fd5b50d3801561046857600080fd5b50d2801561047557600080fd5b50610204600160a060020a0360043516602435610a1c565b34801561049957600080fd5b50d380156104a657600080fd5b50d280156104b357600080fd5b506104ce600160a060020a0360043581169060243516610a2b565b604080519115158252519081900360200190f35b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105685780601f1061053d57610100808354040283529160200191610568565b820191906000526020600020905b81548152906001019060200180831161054b57829003601f168201915b505050505081565b600061057b82610a59565b151561058657600080fd5b50600090815260016020526040902054600160a060020a031690565b60006105ad826108e0565b9050600160a060020a0383811690821614156105c857600080fd5b33600160a060020a03821614806105e457506105e48133610a2b565b15156105ef57600080fd5b600082815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600454600160a060020a031681565b6106713382610a76565b151561067c57600080fd5b610687838383610ad5565b505050565b600454600160a060020a031633146106a357600080fd5b600160a060020a03821615156106b857600080fd5b6106c181610a59565b156106cb57600080fd5b600081815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03871690811790915583526002909152902054610718906001610bf0565b600160a060020a0383166000818152600260205260408082209390935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61076d3382610c00565b50565b60045460009061078990600160a060020a031684610a1c565b600480546040517fcb912b1e0000000000000000000000000000000000000000000000000000000081523392810183815260248201879052606060448301908152865160648401528651600160a060020a039094169463cb912b1e949093899389939092909160840190602085019080838360005b838110156108165781810151838201526020016107fe565b50505050905090810190601f1680156108435780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b505050506040513d602081101561088e57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fcb912b1e000000000000000000000000000000000000000000000000000000001461068757600080fd5b600081815260208190526040812054600160a060020a031680151561090457600080fd5b92915050565b6000600160a060020a038216151561092157600080fd5b50600160a060020a031660009081526002602052604090205490565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105685780601f1061053d57610100808354040283529160200191610568565b600160a060020a0382163314156109ae57600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b610a27338383610ad5565b5050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b600090815260208190526040902054600160a060020a0316151590565b600080610a82836108e0565b905080600160a060020a031684600160a060020a03161480610abd575083600160a060020a0316610ab284610570565b600160a060020a0316145b80610acd5750610acd8185610a2b565b949350505050565b82600160a060020a0316610ae8826108e0565b600160a060020a031614610afb57600080fd5b600160a060020a0382161515610b1057600080fd5b610b1981610ccb565b600160a060020a038316600090815260026020526040902054610b4390600163ffffffff610d1316565b600160a060020a038085166000908152600260205260408082209390935590841681522054610b7990600163ffffffff610bf016565b600160a060020a03808416600081815260026020908152604080832095909555858252819052838120805473ffffffffffffffffffffffffffffffffffffffff1916831790559251849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8181018281101561090457600080fd5b81600160a060020a0316610c13826108e0565b600160a060020a031614610c2657600080fd5b610c2f81610ccb565b600160a060020a038216600090815260026020526040902054610c5990600163ffffffff610d1316565b600160a060020a038316600081815260026020908152604080832094909455848252819052828120805473ffffffffffffffffffffffffffffffffffffffff191690559151839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815260016020526040902054600160a060020a03161561076d576000908152600160205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b600082821115610d2257600080fd5b509003905600a165627a7a72305820e95bf2b25cae43edb66a8c2c9a5784778a3163ec94f09ffb86ca32624f6a8b1b0029a165627a7a72305820642e8c16e0d0768025001430bcf8dea875428b07fc9214f0b1b37c74a5b34c660029" - code_shieldTrc20Token = "60806040526002805460ff1916600617905534801561001d57600080fd5b506040516109a53803806109a583398101604090815281516020808401518385015160025460ff16600a0a84026003819055336000908152600485529586205590850180519395909491019261007592850190610092565b508051610089906001906020840190610092565b5050505061012d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100d357805160ff1916838001178555610100565b82800160010185558215610100579182015b828111156101005782518255916020019190600101906100e5565b5061010c929150610110565b5090565b61012a91905b8082111561010c5760008155600101610116565b90565b6108698061013c6000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063095ea7b31461014857806318160ddd1461018057806323b872dd146101a7578063313ce567146101d157806342966c68146101fc57806370a082311461021457806379cc67901461023557806395d89b4114610259578063a9059cbb1461026e578063cae9ca5114610292578063dd62ed3e146102fb575b600080fd5b3480156100ca57600080fd5b506100d3610322565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016c600160a060020a03600435166024356103b0565b604080519115158252519081900360200190f35b34801561018c57600080fd5b506101956103dd565b60408051918252519081900360200190f35b3480156101b357600080fd5b5061016c600160a060020a03600435811690602435166044356103e3565b3480156101dd57600080fd5b506101e6610453565b6040805160ff9092168252519081900360200190f35b34801561020857600080fd5b5061016c60043561045c565b34801561022057600080fd5b50610195600160a060020a03600435166104d4565b34801561024157600080fd5b5061016c600160a060020a03600435166024356104e6565b34801561026557600080fd5b506100d36105b7565b34801561027a57600080fd5b5061016c600160a060020a0360043516602435610611565b34801561029e57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261016c948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506106259650505050505050565b34801561030757600080fd5b50610195600160a060020a036004358116906024351661073e565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103a85780601f1061037d576101008083540402835291602001916103a8565b820191906000526020600020905b81548152906001019060200180831161038b57829003601f168201915b505050505081565b336000908152600560209081526040808320600160a060020a039590951683529390529190912055600190565b60035481565b600160a060020a038316600090815260056020908152604080832033845290915281205482111561041357600080fd5b600160a060020a038416600090815260056020908152604080832033845290915290208054839003905561044884848461075b565b506001949350505050565b60025460ff1681565b3360009081526004602052604081205482111561047857600080fd5b3360008181526004602090815260409182902080548690039055600380548690039055815185815291517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59281900390910190a2506001919050565b60046020526000908152604090205481565b600160a060020a03821660009081526004602052604081205482111561050b57600080fd5b600160a060020a038316600090815260056020908152604080832033845290915290205482111561053b57600080fd5b600160a060020a0383166000818152600460209081526040808320805487900390556005825280832033845282529182902080548690039055600380548690039055815185815291517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59281900390910190a250600192915050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103a85780601f1061037d576101008083540402835291602001916103a8565b600061061e33848461075b565b9392505050565b60008361063281856103b0565b15610736576040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018790523060448401819052608060648501908152875160848601528751600160a060020a03871695638f4ffcb195948b94938b939192909160a490910190602085019080838360005b838110156106ca5781810151838201526020016106b2565b50505050905090810190601f1680156106f75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561071957600080fd5b505af115801561072d573d6000803e3d6000fd5b50505050600191505b509392505050565b600560209081526000928352604080842090915290825290205481565b600080600160a060020a038416151561077357600080fd5b600160a060020a03851660009081526004602052604090205483111561079857600080fd5b600160a060020a03841660009081526004602052604090205483810110156107bf57600080fd5b50600160a060020a0380841660008181526004602090815260408083208054958a1680855282852080548a81039091559486905281548901909155815188815291519390950194927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019493505050505600a165627a7a723058208600353fffbf658cb8b57929fba657c57e83d756e4101cf874b153cc6eb4bb1c0029" - code_shield = "6104806040527f010000000000000000000000000000000000000000000000000000000000000060809081527f817de36ab2d57feb077634bca77819c8e0bd298c04f6fed0e6a83cc1356ca15560a0527fffe9fc03f18b176c998806439ff0bb8ad193afdb27b2ccbc88856916dd804e3460c0527fd8283386ef2ef07ebdbb4383c12a739a953a4d6e0d6fb1139a4036d693bfbb6c60e0527fe110de65c907b9dea4ae0bd83a4b0a51bea175646a64c12b4c9f931b2cb31b49610100527f912d82b2c2bca231f71efcf61737fbf0a08befa0416215aeef53e8bb6d23390a610120527f8ac9cf9c391e3fd42891d27238a81a8a5c1d3a72b1bcbea8cf44a58ce7389613610140527fd6c639ac24b46bd19341c91b13fdcab31581ddaf7f1411336a271f3d0aa52813610160527f7b99abdc3730991cc9274727d7d82d28cb794edbc7034b4f0053ff7c4b680444610180527f43ff5457f13b926b61df552d4e402ee6dc1463f99a535f9a713439264d5b616b6101a0527fba49b659fbd0b7334211ea6a9d9df185c757e70aa81da562fb912b84f49bce726101c0527f4777c8776a3b1e69b73a62fa701fa4f7a6282d9aee2c7a6b82e7937d7081c23c6101e0527fec677114c27206f5debc1c1ed66f95e2b1885da5b7be3d736b1de98579473048610200527f1b77dac4d24fb7258c3c528704c59430b630718bec486421837021cf75dab651610220527fbd74b25aacb92378a871bf27d225cfc26baca344a1ea35fdd94510f3d157082c610240527fd6acdedf95f608e09fa53fb43dcd0990475726c5131210c9e5caeab97f0e642f610260527f1ea6675f9551eeb9dfaaa9247bc9858270d3d3a4c5afa7177a984d5ed1be2451610280527f6edb16d01907b759977d7650dad7e3ec049af1a3d875380b697c862c9ec5d51c6102a0527fcd1c8dbf6e3acc7a80439bc4962cf25b9dce7c896f3a5bd70803fc5a0e33cf006102c0527f6aca8448d8263e547d5ff2950e2ed3839e998d31cbc6ac9fd57bc6002b1592166102e0527f8d5fa43e5a10d11605ac7430ba1f5d81fb1b68d29a640405767749e841527673610300527f08eeab0c13abd6069e6310197bf80f9c1ea6de78fd19cbae24d4a520e6cf3023610320527f0769557bc682b1bf308646fd0b22e648e8b9e98f57e29f5af40f6edb833e2c49610340527f4c6937d78f42685f84b43ad3b7b00f81285662f85c6a68ef11d62ad1a3ee0850610360527ffee0e52802cb0c46b1eb4d376c62697f4759f6c8917fa352571202fd778fd712610380527f16d6252968971a83da8521d65382e61f0176646d771c91528e3276ee45383e4a6103a0527fd2e1642c9a462229289e5b0e3b7f9008e0301cbb93385ee0e21da2545073cb586103c0527fa5122c08ff9c161d9ca6fc462073396c7d7d38e8ee48cdb3bea7e2230134ed6a6103e0527f28e7b841dcbc47cceb69d7cb8d94245fb7cb2ba3a7a6bc18f13f945f7dbd6e2a610400527fe1f34b034d4a3cd28557e2907ebf990c918f64ecb50a94f01d6fda5ca5c7ef72610420527f12935f14b676509b81eb49ef25f39269ed72309238b4c145803544b646dca62d610440527fb2eed031d4d6a4f02a097f80b54cc1541d4163c6b6f5971f88b6e41d35c5381461046052620004b390602890602062000580565b50348015620004c157600080fd5b50d38015620004cf57600080fd5b50d28015620004dd57600080fd5b506040516200354738038062003547833981016040819052620005009162000615565b604d811062000546576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053d90620006b5565b60405180910390fd5b600a0a60005560488054336001600160a01b031991821617909155604980549091166001600160a01b039290921691909117905562000713565b8260208101928215620005b1579160200282015b82811115620005b157825182559160200191906001019062000594565b50620005bf929150620005c3565b5090565b620005e091905b80821115620005bf5760008155600101620005ca565b90565b8051620005f081620006ee565b620005fb81620006d0565b9392505050565b80516200060f8162000708565b92915050565b600080604083850312156200062957600080fd5b6000620006378585620005e3565b92505060206200064a8582860162000602565b9150509250929050565b600062000663602a83620006c7565b7f546865207363616c696e67466163746f724578706f6e656e74206973206f757481527f206f662072616e67652100000000000000000000000000000000000000000000602082015260400192915050565b602080825281016200060f8162000654565b90815260200190565b60006001600160a01b0382166200060f565b6001600160a81b031690565b620006f981620006e2565b81146200070557600080fd5b50565b620006f981620005e0565b612e2480620007236000396000f3fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50600436106100c35760003560e01c80639110a55b1161008b5780639110a55b14610134578063ae6dead714610147578063cc1058751461015a578063d7b0fef11461016d578063e176507314610175578063ed3437f814610196576100c3565b80632997e86b146100c85780632a6bb45a146100f157806330e69fc314610104578063313529361461010c578063855d175e1461011f575b600080fd5b6100db6100d6366004611c30565b61019e565b6040516100e89190612a7d565b60405180910390f35b6100db6100ff366004611c30565b6101b0565b6100db6101c2565b6100db61011a366004611c30565b6101c8565b61013261012d366004611c6c565b6101da565b005b610132610142366004611a3d565b6105a9565b6100db610155366004611c30565b610bd4565b610132610168366004611b22565b610be6565b6100db61106c565b610188610183366004611c30565b611072565b6040516100e8929190612a8b565b6100db6111c5565b60036020526000908152604090205481565b60066020526000908152604090205481565b60015481565b60056020526000908152604090205481565b6049546040516323b872dd60e01b815233916000916001600160a01b03909116906323b872dd9061021390859030908b90600401612852565b602060405180830381600087803b15801561022d57600080fd5b505af1158015610241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102659190810190611c12565b90508061028d5760405162461bcd60e51b815260040161028490612ad8565b60405180910390fd5b8435600090815260066020526040902054156102bb5760405162461bcd60e51b815260040161028490612b58565b60006102c6876111cb565b905060006002308389886040516020016102e394939291906127fc565b60408051601f19818403018152908290526102fd91612846565b602060405180830381855afa15801561031a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061033d9190810190611c4e565b90506060630100000188888585600760015460405161036196959493929190612a1d565b600060405180830381855afa15801561037e573d6000803e3d6000fd5b5050503d80600081146103ad576040519150601f19603f3d011682016040523d82523d6000602084013e6103b2565b606091505b5090506000816000815181106103c457fe5b602002602001015160001c9050806001146103f15760405162461bcd60e51b815260040161028490612b68565b60008260018151811061040057fe5b60209081029190910181015160015463ffffffff016000818152600590935260409092208c359055915081610435578a356007555b60015b826001018110156104aa576002600019830104915084816001018151811061045c57fe5b60200260200101516005600084815260200190815260200160002081905550828114156104a2576000828152600560205260409020546007846021811061049f57fe5b01555b600101610438565b508382600201815181106104ba57fe5b60209081029190910181015160028190556000818152600490925260408220558b906020020135600660008d81602090810291909101358252810191909152604001600090812091909155600180548082019091557fbe22cbc129fd01d04b02a7b3258b72e8c8ae5bfcf054d7f0359779be627a6b27918d9060200201358d600160200201358e600260200201358d60405161055a959493929190612bb8565b60405180910390a17f36bf5aa3964be01dbd95a0154a8930793fe68353bdc580871ffb2c911366bbc7888d60405161059392919061287a565b60405180910390a1505050505050505050505050565b600188108015906105bb575060028811155b6105d75760405162461bcd60e51b815260040161028490612b98565b8786146105f65760405162461bcd60e51b815260040161028490612b08565b60018410801590610608575060028411155b6106245760405162461bcd60e51b815260040161028490612b18565b8381146106435760405162461bcd60e51b815260040161028490612b38565b60005b8881101561070757600360008b8b8481811061065e57fe5b905061014002016000600a811061067157fe5b60200201358152602001908152602001600020546000801b146106a65760405162461bcd60e51b815260040161028490612ba8565b600460008b8b848181106106b657fe5b905061014002016001600a81106106c957fe5b60200201358152602001908152602001600020546000801b14156106ff5760405162461bcd60e51b815260040161028490612af8565b600101610646565b5060005b84811015610773576006600087878481811061072357fe5b9050610120020160006009811061073657fe5b60200201358152602001908152602001600020546000801b1461076b5760405162461bcd60e51b815260040161028490612ae8565b60010161070b565b5060006002308b8b898988886040516020016107959796959493929190612751565b60408051601f19818403018152908290526107af91612846565b602060405180830381855afa1580156107cc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506107ef9190810190611c4e565b9050606063010000028b8b8b8b8b8b8b896000600760015460405161081e9b9a999897969594939291906128bd565b600060405180830381855afa15801561083b573d6000803e3d6000fd5b5050503d806000811461086a576040519150601f19603f3d011682016040523d82523d6000602084013e61086f565b606091505b50905060008160008151811061088157fe5b602002602001015160001c9050806001146108ae5760405162461bcd60e51b815260040161028490612b68565b600160005b888110156109d95760008483806001019450815181106108cf57fe5b602090810291909101015160015490915063ffffffff018b8b848181106108f257fe5b9050610120020160006009811061090557fe5b60008381526005602090815260409091209102919091013590558161094c578b8b8481811061093057fe5b9050610120020160006009811061094357fe5b60200201356007555b60015b826001018110156109c4576002600019830104915086858060010196508151811061097657fe5b60200260200101516005600084815260200190815260200160002081905550828114156109bc57600082815260056020526040902054600784602181106109b957fe5b01555b60010161094f565b505060018054810181559190910190506108b3565b508281815181106109e657fe5b60209081029190910181015160028190556000818152600490925260408220555b8c811015610a8f5760008e8e83818110610a1d57fe5b905061014002016000600a8110610a3057fe5b602002013590508060036000838152602001908152602001600020819055507fd13faa8100906cf559aebacf9c16532cfc9708645c198c8f15798ee049dbcfc181604051610a7e9190612a7d565b60405180910390a150600101610a07565b5060005b88811015610bc457898982818110610aa757fe5b90506101200201600060098110610aba57fe5b6020020135600660008c8c85818110610acf57fe5b90506101200201600060098110610ae257fe5b60200201358152602001908152602001600020819055507f0f190e6ff1f0e1c1f4ec51aecdafdd02278c568898b57df5ca7dccba83a8181c818b8b905003600154038b8b84818110610b3057fe5b90506101200201600060098110610b4357fe5b60200201358c8c85818110610b5457fe5b90506101200201600160098110610b6757fe5b60200201358d8d86818110610b7857fe5b90506101200201600260098110610b8b57fe5b60200201358b8b87818110610b9c57fe5b90506102a00201604051610bb4959493929190612bb8565b60405180910390a1600101610a93565b5050505050505050505050505050565b60046020526000908152604090205481565b6000610bf1896111cb565b905060006002308d888888888e89604051602001610c16989796959493929190612795565b60408051601f1981840301815290829052610c3091612846565b602060405180830381855afa158015610c4d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250610c709190810190611c4e565b8c356000818152600360209081526040909120549293509091908e01359015610cab5760405162461bcd60e51b815260040161028490612ba8565b600081815260046020526040902054610cd65760405162461bcd60e51b815260040161028490612af8565b6001871115610cf75760405162461bcd60e51b815260040161028490612b28565b868514610d165760405162461bcd60e51b815260040161028490612b88565b86610d9d57600063010000038f8f878f88604051610d389594939291906129cc565b602060405180830381855afa158015610d55573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250610d789190810190611c12565b905080610d975760405162461bcd60e51b815260040161028490612b68565b50610f21565b610f218e600a806020026040519081016040528092919082600a60200280828437600081840152601f19601f8201169050808301925050505050508e6002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050868e6002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050878d8d808060200260200160405190810160405280939291908181526020016000905b82821015610eae576040805161012081810190925290808402870190600990839083908082843760009201919091525050508152600190910190602001610e6c565b50505050508c8c808060200260200160405190810160405280939291908181526020016000905b82821015610f1757604080516102a081810190925290808402870190601590839083908082843760009201919091525050508152600190910190602001610ed5565b505050505061124e565b60008281526003602052604090819020839055517fd13faa8100906cf559aebacf9c16532cfc9708645c198c8f15798ee049dbcfc190610f62908490612a7d565b60405180910390a16000604960009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb8c8f6040518363ffffffff1660e01b8152600401610faf92919061287a565b602060405180830381600087803b158015610fc957600080fd5b505af1158015610fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110019190810190611c12565b9050806110205760405162461bcd60e51b815260040161028490612b48565b7f1daf70c304f467a9efbc9ac1ca7bfe859a478aa6c4b88131b4dbb1547029b9728b8e8c60405161105393929190612895565b60405180910390a1505050505050505050505050505050565b60025481565b600061107c611842565b600154831061109d5760405162461bcd60e51b815260040161028490612b78565b63ffffffff83016110ac611842565b60006110b7866115ab565b905060006110c587836115fa565b905060005b60208163ffffffff1610156111b4578263ffffffff168163ffffffff16141561110d57818482601f0363ffffffff166020811061110357fe5b60200201526111a2565b600285066111415760056000600187038152602001908152602001600020548482601f0363ffffffff166020811061110357fe5b60018501600090815260056020526040902054156111715760018501600090815260056020526040902054611187565b60288163ffffffff166020811061118457fe5b01545b8482601f0363ffffffff166020811061119c57fe5b60200201525b600260001986010494506001016110ca565b505060025494509092505050915091565b60005481565b60008082116111ec5760405162461bcd60e51b815260040161028490612ac8565b60005461120090839063ffffffff61174c16565b1561121d5760405162461bcd60e51b815260040161028490612ab8565b6000805461123290849063ffffffff61179516565b9050677fffffffffffffff811061124857600080fd5b92915050565b60008260008151811061125d57fe5b602002602001015160006009811061127157fe5b6020020151905060066000828152602001908152602001600020546000801b146112ad5760405162461bcd60e51b815260040161028490612ae8565b604080516001808252818301909252606091816020015b6112cc611861565b8152602001906001900390816112c457905050905088816000815181106112ef57fe5b6020908102919091010152604080516001808252818301909252606091816020015b611319611880565b815260200190600190039081611311579050509050888160008151811061133c57fe5b6020026020010181905250606063010000028383888b8b8e600760015460405161136d98979695949392919061294e565b600060405180830381855afa15801561138a573d6000803e3d6000fd5b5050503d80600081146113b9576040519150601f19603f3d011682016040523d82523d6000602084013e6113be565b606091505b5090506000816000815181106113d057fe5b602002602001015160001c9050806001146113fd5760405162461bcd60e51b815260040161028490612b68565b60008260018151811061140c57fe5b60209081029190910181015160015463ffffffff016000818152600590935260409092208890559150816114405760078790555b60015b826001018110156114b5576002600019830104915084816001018151811061146757fe5b60200260200101516005600084815260200190815260200160002081905550828114156114ad57600082815260056020526040902054600784602181106114aa57fe5b01555b600101611443565b508382600201815181106114c557fe5b602090810291909101810151600281905560008181526004835260408082209290925589815260069092528120889055600180548082019091558a517f3814d251636df4a739162facca3862684b45af01ce54bcc56ea488fa6a69412d928a918d919061152e57fe5b602002602001015160016009811061154257fe5b60200201518c60008151811061155457fe5b602002602001015160026009811061156857fe5b60200201518c60008151811061157a57fe5b6020026020010151604051611593959493929190612bfb565b60405180910390a15050505050505050505050505050565b60015460009063ffffffff83019063fffffffe01825b60026000198301046002600019850104146115f25760026000198401049250600260001983010491506001016115c1565b949350505050565b60015463fffffffe0160008181526005602052604081205490918291829163ffffffff8088019290871661167b578183101561163c5794506112489350505050565b8183141561167b576002830661166b575050600019016000908152600560205260409020549250611248915050565b5050602854935061124892505050565b60005b8763ffffffff168163ffffffff16101561174057600283066116ba576000198301600090815260056020526040902054955090935083906116d5565b81955060288163ffffffff16602081106116d057fe5b015494505b63010000048187876040516116ec93929190612c3e565b602060405180830381855afa158015611709573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061172c9190810190611c4e565b91506002600019840104925060010161167e565b50979650505050505050565b600061178e83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506117d7565b9392505050565b600061178e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061180b565b600081836117f85760405162461bcd60e51b81526004016102849190612aa7565b5082848161180257fe5b06949350505050565b6000818361182c5760405162461bcd60e51b81526004016102849190612aa7565b50600083858161183857fe5b0495945050505050565b6040518061040001604052806020906020820280388339509192915050565b604051806101400160405280600a906020820280388339509192915050565b60405180604001604052806002906020820280388339509192915050565b80356118a981612d93565b61178e81612cbd565b60008083601f8401126118c457600080fd5b50813567ffffffffffffffff8111156118dc57600080fd5b602083019150836101408202830111156118f557600080fd5b9250929050565b60008083601f84011261190e57600080fd5b50813567ffffffffffffffff81111561192657600080fd5b602083019150836102a08202830111156118f557600080fd5b60008083601f84011261195157600080fd5b50813567ffffffffffffffff81111561196957600080fd5b6020830191508360408202830111156118f557600080fd5b60008083601f84011261199357600080fd5b50813567ffffffffffffffff8111156119ab57600080fd5b602083019150836101208202830111156118f557600080fd5b80610140810183101561124857600080fd5b806102a0810183101561124857600080fd5b806040810183101561124857600080fd5b806060810183101561124857600080fd5b80610120810183101561124857600080fd5b805161124881612daa565b803561124881612db3565b805161124881612db3565b600080600080600080600080600060c08a8c031215611a5b57600080fd5b893567ffffffffffffffff811115611a7257600080fd5b611a7e8c828d016118b2565b995099505060208a013567ffffffffffffffff811115611a9d57600080fd5b611aa98c828d0161193f565b975097505060408a013567ffffffffffffffff811115611ac857600080fd5b611ad48c828d01611981565b95509550506060611ae78c828d016119e8565b93505060a08a013567ffffffffffffffff811115611b0457600080fd5b611b108c828d016118fc565b92509250509295985092959850929598565b6000806000806000806000806000806102a08b8d031215611b4257600080fd5b6000611b4e8d8d6119c4565b9a5050610140611b608d828e016119e8565b995050610180611b728d828e01611a27565b9850506101a0611b848d828e016119e8565b9750506101e0611b968d828e0161189e565b965050610200611ba88d828e016119f9565b9550506102608b013567ffffffffffffffff811115611bc657600080fd5b611bd28d828e01611981565b94509450506102808b013567ffffffffffffffff811115611bf257600080fd5b611bfe8d828e016118fc565b92509250509295989b9194979a5092959850565b600060208284031215611c2457600080fd5b60006115f28484611a1c565b600060208284031215611c4257600080fd5b60006115f28484611a27565b600060208284031215611c6057600080fd5b60006115f28484611a32565b6000806000806104208587031215611c8357600080fd5b6000611c8f8787611a27565b9450506020611ca087828801611a0a565b935050610140611cb2878288016119e8565b925050610180611cc4878288016119d6565b91505092959194509250565b6000611cdc838361203e565b50506101400190565b6000611cdc838361204f565b6000611cfd83836120a3565b50506102a00190565b6000611d1283836120fc565b505060400190565b6000611d128383612154565b6000611d32838361224b565b50506101200190565b6000611d328383612258565b6000611d5383836122a4565b505060200190565b611d6481612cbd565b82525050565b611d64611d7682612cbd565b612d55565b6000611d878385612cab565b9350611d9282612c59565b8060005b85811015611dc857611da88284612cb9565b611db28882611cd0565b9750611dbd83612c8a565b925050600101611d96565b509495945050505050565b6000611ddf8385612cb4565b9350611dea82612c59565b8060005b85811015611dc857611e008284612cb9565b611e0a8882611cd0565b9750611e1583612c8a565b925050600101611dee565b6000611e2b82612c62565b611e358185612cab565b9350611e4083612c5c565b8060005b83811015611dc8578151611e588882611ce5565b9750611e6383612c5c565b925050600101611e44565b6000611e7a8385612cb4565b9350611e8582612c59565b8060005b85811015611dc857611e9b8284612cb9565b611ea58882611cf1565b9750611eb083612c91565b925050600101611e89565b6000611ec78385612cab565b9350611ed282612c59565b8060005b85811015611dc857611ee88284612cb9565b611ef28882611d06565b9750611efd83612c98565b925050600101611ed6565b6000611f1382612c62565b611f1d8185612cab565b9350611f2883612c5c565b8060005b83811015611dc8578151611f408882611d1a565b9750611f4b83612c5c565b925050600101611f2c565b6000611f628385612cab565b9350611f6d82612c59565b8060005b85811015611dc857611f838284612cb9565b611f8d8882611d26565b9750611f9883612c9e565b925050600101611f71565b6000611faf8385612cb4565b9350611fba82612c59565b8060005b85811015611dc857611fd08284612cb9565b611fda8882611d26565b9750611fe583612c9e565b925050600101611fbe565b6000611ffb82612c62565b6120058185612cab565b935061201083612c5c565b8060005b83811015611dc85781516120288882611d3b565b975061203383612c5c565b925050600101612014565b61204b6101408383612d06565b5050565b61205881612c66565b6120628184612cb4565b925061206d82612c59565b8060005b8381101561209b5781516120858782611d47565b965061209083612c5c565b925050600101612071565b505050505050565b61204b6102a08383612d06565b6120b981612c6c565b6120c38184612cb4565b92506120ce82612c59565b8060005b8381101561209b5781516120e68782611d47565b96506120f183612c5c565b9250506001016120d2565b61204b60408383612d06565b61211181612c72565b61211b8184612cb4565b925061212682612c59565b8060005b8381101561209b57815161213e8782611d47565b965061214983612c5c565b92505060010161212a565b61215d81612c72565b6121678184612cb4565b925061217282612c59565b8060005b8381101561209b57815161218a8782611d47565b965061219583612c5c565b925050600101612176565b6121a981612c78565b6121b38184612cb4565b92506121be82612c59565b8060005b8381101561209b5781516121d68782611d47565b96506121e183612c5c565b9250506001016121c2565b6121f581612c7e565b6121ff8184612cb4565b925061220a82612c59565b8060005b8381101561209b5761221f82612d71565b6122298782611d47565b965061223483612ca5565b92505060010161220e565b61204b60608383612d06565b61204b6101208383612d06565b61226181612c84565b61226b8184612cb4565b925061227682612c59565b8060005b8381101561209b57815161228e8782611d47565b965061229983612c5c565b92505060010161227a565b611d6481612c59565b60006122b882612c62565b6122c28185612cb4565b93506122d2818560208601612d12565b9290920192915050565b611d6481612cfb565b60006122f082612c62565b6122fa8185612cab565b935061230a818560208601612d12565b61231381612d7d565b9093019392505050565b600061232a603183612cab565b7f56616c7565206d75737420626520696e7465676572206d756c7469706c6573208152706f66207363616c696e67466163746f722160781b602082015260400192915050565b600061237d601783612cab565b7f56616c7565206d75737420626520706f73697469766521000000000000000000815260200192915050565b60006123b6601483612cab565b735472616e7366657246726f6d206661696c65642160601b815260200192915050565b60006123e6601983612cab565b7f4475706c6963617465206e6f7465436f6d6d69746d656e742100000000000000815260200192915050565b600061241f601683612cab565b7554686520616e63686f72206d7573742065786973742160501b815260200192915050565b6000612451603d83612cab565b7f496e707574206e756d626572206d75737420626520657175616c20746f20737081527f656e64417574686f726974795369676e6174757265206e756d62657221000000602082015260400192915050565b60006124b0601d83612cab565b7f4f7574707574206e756d626572206d7573742062652031206f72203221000000815260200192915050565b60006124e9601e83612cab565b7f4f7574707574206e756d6265722063616e6e6f74206578636565642031210000815260200192915050565b6000612522602883612cab565b7f4f7574707574206e756d626572206d75737420626520657175616c20746f2063815267206e756d6265722160c01b602082015260400192915050565b600061256c601083612cab565b6f5472616e73666572206661696c65642160801b815260200192915050565b6000612598601a83612cab565b7f4475706c6963617465206e6f7465436f6d6d69746d656e747321000000000000815260200192915050565b60006125d1603f83612cab565b7f5468652070726f6f6620616e64207369676e61747572652068617665206e6f7481527f206265656e2076657269666965642062792074686520636f6e74726163742100602082015260400192915050565b6000612630602a83612cab565b7f506f736974696f6e2073686f756c6420626520736d616c6c6572207468616e208152696c656166436f756e742160b01b602082015260400192915050565b600061267c602b83612cab565b7f4f7574707574206e756d626572206d75737420626520657175616c20746f206c81526a656e677468206f6620632160a81b602082015260400192915050565b60006126c9601c83612cab565b7f496e707574206e756d626572206d7573742062652031206f7220322100000000815260200192915050565b6000612702602083612cab565b7f546865206e6f74652068617320616c7265616479206265656e207370656e7421815260200192915050565b611d6481612ce5565b611d6481612cee565b611d6461274c82612cee565b612d66565b600061275d828a611d6a565b60148201915061276e82888a611dd3565b915061277b828688611fa3565b9150612788828486611e6e565b9998505050505050505050565b60006127a1828b611d6a565b6014820191506127b1828a61203e565b610140820191506127c382888a611fa3565b91506127d0828688611e6e565b91506127dc8285611d6a565b6014820191506127ec8284612740565b5060080198975050505050505050565b60006128088287611d6a565b6014820191506128188286612740565b600882019150612828828561224b565b6101208201915061283982846120a3565b506102a001949350505050565b600061178e82846122ad565b606081016128608286611d5b565b61286d6020830185611d5b565b6115f260408301846122a4565b604081016128888285611d5b565b61178e60208301846122a4565b60a081016128a38286611d5b565b6128b060208301856122a4565b6115f2604083018461223f565b61052080825281016128d0818d8f611d7b565b905081810360208301526128e5818b8d611ebb565b905081810360408301526128fa81898b611f56565b905061290960608301886120fc565b61291660a08301876122a4565b61292360c08301866122dc565b61293060e08301856121ec565b61293e6105008301846122a4565b9c9b505050505050505050505050565b6105208082528101612960818b611e20565b90508181036020830152612974818a611f08565b905081810360408301526129888189611ff0565b90506129976060830188612108565b6129a460a08301876122a4565b6129b160c0830186612737565b6129be60e08301856121ec565b6127886105008301846122a4565b61020081016129db828861203e565b6129e96101408301876120fc565b6129f7610180830186612737565b612a056101a08301856120fc565b612a136101e08301846122a4565b9695505050505050565b6105e08101612a2c828961224b565b612a3a6101208301886120fc565b612a48610160830187612737565b612a566101808301866122a4565b612a646101a08301856121ec565b612a726105c08301846122a4565b979650505050505050565b6020810161124882846122a4565b6104208101612a9a82856122a4565b61178e60208301846121a0565b6020808252810161178e81846122e5565b602080825281016112488161231d565b6020808252810161124881612370565b60208082528101611248816123a9565b60208082528101611248816123d9565b6020808252810161124881612412565b6020808252810161124881612444565b60208082528101611248816124a3565b60208082528101611248816124dc565b6020808252810161124881612515565b602080825281016112488161255f565b602080825281016112488161258b565b60208082528101611248816125c4565b6020808252810161124881612623565b602080825281016112488161266f565b60208082528101611248816126bc565b60208082528101611248816126f5565b6103208101612bc782886122a4565b612bd460208301876122a4565b612be160408301866122a4565b612bee60608301856122a4565b612a1360808301846120a3565b6103208101612c0a82886122a4565b612c1760208301876122a4565b612c2460408301866122a4565b612c3160608301856122a4565b612a1360808301846120b0565b60608101612c4c828661272e565b61286d60208301856122a4565b90565b60200190565b5190565b50600a90565b50601590565b50600290565b50602090565b50602190565b50600990565b6101400190565b6102a00190565b60400190565b6101200190565b60010190565b90815260200190565b919050565b5090565b600061124882612ccd565b151590565b6001600160a01b031690565b6001600160a81b031690565b63ffffffff1690565b67ffffffffffffffff1690565b600061124882612cee565b82818337506000910152565b60005b83811015612d2d578181015183820152602001612d15565b83811115612d3c576000848401525b50505050565b6000611248612d5083612c59565b612c59565b600061124882600061124882612d8d565b600061124882612d87565b60006112488254612d42565b601f01601f191690565b60c01b90565b60601b90565b612d9c81612cd9565b8114612da757600080fd5b50565b612d9c81612cc8565b612d9c81612c5956fea36474726f6e58207ef421e01e827fa1d2e384579b655503e18aef0f4bf9ff3e5176a254c97da9036c6578706572696d656e74616cf564736f6c637828302e352e31322d646576656c6f702e323032302e362e31352b636f6d6d69742e34323336323638380065" - code_getAddressChange = "608060405260e3806100126000396000f3fe6080604052348015600f57600080fd5b50d38015601b57600080fd5b50d28015602757600080fd5b5060043610604a5760003560e01c806358c6464814604f578063b4cef28d146071575b600080fd5b605560a6565b604080516001600160a01b039092168252519081900360200190f35b609460048036036020811015608557600080fd5b50356001600160a01b031660aa565b60408051918252519081900360200190f35b3090565b50479056fea26474726f6e58208f096542a0e814a7dd8434fd85def0ee9521b022f5cad9176f1c993e2615bdad64736f6c634300050f0031" - code_fallbackOldVersionTest = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101d98061003a6000396000f3fe60c0604052600860808190526766616c6c6261636b60c01b60a0908152610029916000919061010a565b506040805181815260008054600260001961010060018416150201909116049282018390527f1f0af026fd1015e37743a803fa8c7b92c09a6fc99890b1681a1e3c888427c25e9290918291369190819060208201906060830190869080156100d25780601f106100a7576101008083540402835291602001916100d2565b820191906000526020600020905b8154815290600101906020018083116100b557829003601f168201915b50508381038252848152602001858580828437600083820152604051601f909101601f191690920182900397509095505050505050a1005b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061014b57805160ff1916838001178555610178565b82800160010185558215610178579182015b8281111561017857825182559160200191906001019061015d565b50610184929150610188565b5090565b6101a291905b80821115610184576000815560010161018e565b9056fea26474726f6e5820e77b862582c00095aa34fd5c2839c0d8f209bdac194c0adeec660fa15a08fbe464736f6c634300050f0031" - code_fallbackOldVersionCall = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506101748061003a6000396000f3fe60806040526004361061001e5760003560e01c8063f55332ab14610023575b600080fd5b6100496004803603602081101561003957600080fd5b50356001600160a01b031661005d565b604080519115158252519081900360200190f35b60408051600481526024810182526020810180516001600160e01b031663f85396d760e01b1781529151815160009384936001600160a01b038716939092909182918083835b602083106100c25780518252601f1990920191602091820191016100a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610124576040519150601f19603f3d011682016040523d82523d6000602084013e610129565b606091505b505090508061013757600080fd5b5060019291505056fea26474726f6e58203498e1c23a661ae640e44836405d25839850ec79748cabd2dab945fd13ee0c7c64736f6c634300050f0031" - code_arrayLength_0.5.15 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506102708061003a6000396000f3fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50600436106100455760003560e01c8063cbcec91e1461004a575b600080fd5b6100526100a2565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561008e578181015183820152602001610076565b505050509050019250505060405180910390f35b60008054600181018255818052602081047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301805460ff601f9093166101000a928302191690911790556060906003906100fc90826101e5565b50600080549061010f90600183016101e5565b5060008054906101239060001983016101e5565b5060008054906101379060001983016101e5565b50600080548061014357fe5b60008281526020808220600019909301818104909301805460ff601f86166101000a0219169055919092558154604080518284028101840190915281815292918301828280156101da57602002820191906000526020600020906000905b825461010083900a900460f81b6001600160f81b0319168152602060019283018181049485019490930390920291018084116101a15790505b505050505090505b90565b81548183558181111561021957601f016020900481601f01602090048360005260206000209182019101610219919061021e565b505050565b6101e291905b808211156102385760008155600101610224565b509056fea26474726f6e582030f1b13e292e442f2c4de67e0d5bb6f78dd7f44f99e5f2fa3952de6c9d94dd8b64736f6c634300050e0031" - code_override001 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060d8806100396000396000f3fe6080604052348015600f57600080fd5b50d38015601b57600080fd5b50d28015602757600080fd5b506004361060545760003560e01c80630c55699c14605957806355241077146071578063a56dfe4a14608d575b600080fd5b605f6093565b60408051918252519081900360200190f35b608b60048036036020811015608557600080fd5b50356099565b005b605f609e565b60005481565b600155565b6001548156fea26474726f6e58204b9c06785956097a789fe5d4b75dbe9390a30c48c3080d3c14d8655cb84e11e564736f6c634300050f0031" - code_override002 = "6080604052600460005534801561001557600080fd5b50d3801561002257600080fd5b50d2801561002f57600080fd5b5061012b8061003f6000396000f3fe6080604052348015600f57600080fd5b50d38015601b57600080fd5b50d28015602757600080fd5b506004361060545760003560e01c80630c55699c1460595780635524107714607157806374d393f014608d575b600080fd5b605f60a7565b60408051918252519081900360200190f35b608b60048036036020811015608557600080fd5b503560ad565b005b608b6004803603602081101560a157600080fd5b503560f2565b60005481565b6006600054101560f2576040805162461bcd60e51b815260206004820152600b60248201526a3c1036bab9ba101f1e901b60a91b604482015290519081900360640190fd5b60005556fea26474726f6e5820d72f89553adaa33af6034260ea794957bdaebd8e26bccaac25c685c1bd1e8f2764736f6c634300050f0031" - code_override003 = "608060405260008054600160ff19918216811761ff0019169092556301efa6ad9091556301efa6ac19600255630166654f6003908155600480546001600160a01b03191673dcad3a6d3569df655070ded06cb7a1b2ccd1d3af1790557fb55a21aaee0ce8f1c8ffaa0dbd23105cb55a21aaee0ce8f1c8ffaa0dbd23105c6005556006805490921617905534801561009557600080fd5b50d380156100a257600080fd5b50d280156100af57600080fd5b506101c8806100bf6000396000f3fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50600436106100a25760003560e01c806398f42fe31161007557806398f42fe31461012d578063a223e05d14610135578063e5aa3d581461013d578063f8aab23814610145576100a2565b806375f12b21146100a757806383cdfab8146100c357806387cfa5bf146100dd578063938b5f3214610109575b600080fd5b6100af61014d565b604080519115158252519081900360200190f35b6100cb61015b565b60408051918252519081900360200190f35b6100e5610161565b604051808260038111156100f557fe5b60ff16815260200191505060405180910390f35b61011161016a565b604080516001600160a01b039092168252519081900360200190f35b6100e5610179565b6100cb610182565b6100cb610188565b6100cb61018e565b600054610100900460ff1681565b60025481565b60005460ff1681565b6004546001600160a01b031681565b60065460ff1681565b60035481565b60015481565b6005548156fea26474726f6e5820dacca6ecfb02875aede259b98aa35a6aba6aea8284a01f0c82fdeba6ffc8012d64736f6c634300050f0031" - code_virtual001 = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506103778061003a6000396000f3fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506004361061007c5760003560e01c80630c55699c146100815780631e26fd331461009b57806355241077146100bc5780637fcaf666146100d9578063a56dfe4a14610149578063c5d7802e14610165575b600080fd5b6100896101e2565b60408051918252519081900360200190f35b6100ba600480360360208110156100b157600080fd5b503515156101e8565b005b6100ba600480360360208110156100d257600080fd5b50356101fb565b6100ba600480360360208110156100ef57600080fd5b81019060208101813564010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b509092509050610200565b610151610211565b604080519115158252519081900360200190f35b61016d61021a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101a757818101518382015260200161018f565b50505050905090810190601f1680156101d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60015481565b6002805460ff1916911515919091179055565b600155565b61020c600083836102a8565b505050565b60025460ff1681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156102a05780601f10610275576101008083540402835291602001916102a0565b820191906000526020600020905b81548152906001019060200180831161028357829003601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e95782800160ff19823516178555610316565b82800160010185558215610316579182015b828111156103165782358255916020019190600101906102fb565b50610322929150610326565b5090565b61034091905b80821115610322576000815560010161032c565b9056fea26474726f6e5820b48ac0b0a646831f6a4069f95888081a6e12cd0ffb453b66d879c3f04e3b71ec64736f6c634300050f0031" - code_slotAndOffset_06x = "608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b5060ba806100396000396000f3fe6080604052348015600f57600080fd5b50d38015601b57600080fd5b50d28015602757600080fd5b5060043610604a5760003560e01c8063b1cb267b14604f578063d46300fd14606e575b600080fd5b60556074565b6040805192835260208301919091528051918290030190f35b6055607c565b600460009091565b60016000909156fea264697066735822122076bb65351c887d12efbc6982560551c4979591981777ea571d32f7f267f8888864736f6c634300060c0033" -} - - -abi = { - abi_Scenario015_TRC20_TRON = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"nonpayable\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\",\"stateMutability\":\"nonpayable\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]" - abi_AssertException_testdivideInt = "[{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"int256\"},{\"name\":\"y\",\"type\":\"int256\"}],\"name\":\"divideIHaveArgsReturn\",\"outputs\":[{\"name\":\"z\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testfindArgsContractMinTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"findArgsByIndexTest\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testbyteMinContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"testBytesGet\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testenum = "[{\"constant\":true,\"inputs\":[],\"name\":\"getChoice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"choice\",\"type\":\"uint8\"}],\"name\":\"setGoStraight\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testmoveRight = "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"int256\"}],\"name\":\"binaryMoveR\",\"outputs\":[{\"name\":\"z\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testuninitializedContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"test2\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"test1\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_AssertException_testTestAssertContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"testAssert\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testRequire\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testThrow\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testRevert\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - - abi_ContractGrammar001_testGrammar001 = "[{\"constant\":false,\"inputs\":[{\"name\":\"useB\",\"type\":\"bool\"},{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"select\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"b\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"a\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar001_testGrammar002 = "[{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"contains\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi1_ContractGrammar001_testGrammar002 = "[{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar001_testGrammar003 = "[{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"contains\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi1_ContractGrammar001_testGrammar003 = "[{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar001_testGrammar004 = "[{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"uint256[] storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"indexOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi1_ContractGrammar001_testGrammar004 = "[{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getData\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"append\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_old\",\"type\":\"uint256\"},{\"name\":\"_new\",\"type\":\"uint256\"}],\"name\":\"replace\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"data\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_ContractGrammar001_testGrammar006 = "[{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d4\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d5\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"f\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d6\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d1\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"d2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - - abi_ContractGrammar002_testGrammar007 = "[{\"constant\":true,\"inputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getDougName\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_age\",\"type\":\"uint256\"}],\"name\":\"getDougAge\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"contracts\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - abi1_ContractGrammar002_testGrammar007 = "[{\"constant\":false,\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\"}],\"name\":\"uintOfName\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_doug\",\"type\":\"address\"}],\"name\":\"setDOUG\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_age\",\"type\":\"uint256\"}],\"name\":\"dougOfage\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"dogInterfaceAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"name\",\"type\":\"bytes32\"}],\"name\":\"FetchContract\",\"type\":\"event\"}]" - abi_ContractGrammar002_testGrammar008 = "[{\"constant\":false,\"inputs\":[],\"name\":\"utterance\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getContractName\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar002_testGrammar010 = "[{\"constant\":false,\"inputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setFeed\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"callFeed\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar002_testGrammar011 = "[{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"uint256\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"f\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"g\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar002_testGrammar012 = "[{\"constant\":false,\"inputs\":[],\"name\":\"info\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bytes4\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractGrammar002_testGrammar013 = "[{\"constant\":false,\"inputs\":[],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"increment\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - - abi_ContractGrammar003_testGrammar014 = "[{\"constant\":false,\"inputs\":[{\"name\":\"bAddress\",\"type\":\"address\"},{\"name\":\"_number\",\"type\":\"uint256\"}],\"name\":\"delegatecallTest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bAddress\",\"type\":\"address\"},{\"name\":\"_number\",\"type\":\"uint256\"}],\"name\":\"callTest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"senderForB\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getsenderForB\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bAddress\",\"type\":\"address\"},{\"name\":\"_number\",\"type\":\"uint256\"}],\"name\":\"callcodeTest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numberForB\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bAddress\",\"type\":\"address\"}],\"name\":\"callAddTest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getnumberForB\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi1_ContractGrammar003_testGrammar014 = "[{\"constant\":true,\"inputs\":[],\"name\":\"addr11\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addr2\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addr1\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_number\",\"type\":\"uint256\"}],\"name\":\"setValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"senderForB\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getsenderForB\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numberForB\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getnumberForB\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar003_testGrammar015 = "[{\"constant\":true,\"inputs\":[],\"name\":\"ExistFuncCalledTopic\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"para\",\"type\":\"uint256\"}],\"name\":\"existFunc\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FallbackCalledTopic\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"callNonExistFunc\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"callExistFunc\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"FallbackCalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"name\":\"para\",\"type\":\"uint256\"}],\"name\":\"ExistFuncCalled\",\"type\":\"event\"}]" - abi_ContractGrammar003_testGrammar016 = "[{\"constant\":false,\"inputs\":[],\"name\":\"readData\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi1_ContractGrammar003_testGrammar016 = "[{\"constant\":false,\"inputs\":[],\"name\":\"getData\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"setData\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"g\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar003_testGrammar017 = "[{\"constant\":false,\"inputs\":[{\"name\":\"compaingnID\",\"type\":\"uint256\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"comapingnId\",\"type\":\"uint256\"}],\"name\":\"check\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"beneficiary\",\"type\":\"address\"},{\"name\":\"goal\",\"type\":\"uint256\"}],\"name\":\"candidate\",\"outputs\":[{\"name\":\"compaingnID\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar003_testGrammar018 = "[{\"constant\":false,\"inputs\":[],\"name\":\"testKeccak256\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testMulmod\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testAddmod\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testSha256\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testRipemd160\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testSha3\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractGrammar003_testGrammar019 = "[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - abi_ContractGrammar003_testGrammar020 = "[{\"constant\":false,\"inputs\":[],\"name\":\"timetest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractScenario004_deployErc20TronToken = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_addressFounder\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]" - abi_ContractScenario005_deployIcoContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"checkGoalReached\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deadline\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"beneficiary\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenReward\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"fundingGoal\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"amountRaised\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"price\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"safeWithdrawal\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ifSuccessfulSendTo\",\"type\":\"address\"},{\"name\":\"fundingGoalInEthers\",\"type\":\"uint256\"},{\"name\":\"durationInMinutes\",\"type\":\"uint256\"},{\"name\":\"finneyCostOfEachToken\",\"type\":\"uint256\"},{\"name\":\"addressOfTokenUsedAsReward\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"totalAmountRaised\",\"type\":\"uint256\"}],\"name\":\"GoalReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"backer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"isContribution\",\"type\":\"bool\"}],\"name\":\"FundTransfer\",\"type\":\"event\"}]" - abi_ContractScenario006_deployFomo3D = "[{\"constant\":true,\"inputs\":[{\"name\":\"_customerAddress\",\"type\":\"address\"}],\"name\":\"dividendsOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_ethereumToSpend\",\"type\":\"uint256\"}],\"name\":\"calculateTokensReceived\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokensToSell\",\"type\":\"uint256\"}],\"name\":\"calculateEthereumReceived\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"onlyAmbassadors\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"administrators\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"sellPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stakingRequirement\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_includeReferralBonus\",\"type\":\"bool\"}],\"name\":\"myDividends\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalEthereumBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_customerAddress\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"setStakingRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"buyPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_identifier\",\"type\":\"bytes32\"},{\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setAdministrator\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"Hourglass\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"myTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"disableInitialStage\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_toAddress\",\"type\":\"address\"},{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"setSymbol\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"exit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_referredBy\",\"type\":\"address\"}],\"name\":\"buy\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"reinvest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"incomingEthereum\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokensMinted\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"referredBy\",\"type\":\"address\"}],\"name\":\"onTokenPurchase\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokensBurned\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"ethereumEarned\",\"type\":\"uint256\"}],\"name\":\"onTokenSell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"ethereumReinvested\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokensMinted\",\"type\":\"uint256\"}],\"name\":\"onReinvestment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"ethereumWithdrawn\",\"type\":\"uint256\"}],\"name\":\"onWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]" - abi_ContractScenario007_deployErc721CardMigration = "[{\"constant\":true,\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint16\"}],\"name\":\"getProto\",\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"season\",\"type\":\"uint8\"},{\"name\":\"cardType\",\"type\":\"uint8\"},{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"attack\",\"type\":\"uint8\"},{\"name\":\"health\",\"type\":\"uint8\"},{\"name\":\"tribe\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"transferAllFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"governor\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"migrated\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"burnAll\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"InterfaceId_ERC165\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"season\",\"type\":\"uint8\"}],\"name\":\"makePermanantlyTradable\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalID\",\"type\":\"uint16\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"packable\",\"type\":\"bool\"}],\"name\":\"addSpell\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"common\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getActiveCards\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"migrate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mythic\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"exists\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint16\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"cardType\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"attack\",\"type\":\"uint8\"},{\"name\":\"health\",\"type\":\"uint8\"},{\"name\":\"tribe\",\"type\":\"uint8\"}],\"name\":\"replaceProto\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"burnCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"seasonTradabilityLocked\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint16\"},{\"name\":\"limit\",\"type\":\"uint64\"}],\"name\":\"setLimit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"transferAll\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"seasonTradable\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"proposed\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"owns\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"approved\",\"type\":\"address\"}],\"name\":\"addPack\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"purity\",\"type\":\"uint16\"}],\"name\":\"getShine\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cards\",\"outputs\":[{\"name\":\"proto\",\"type\":\"uint16\"},{\"name\":\"purity\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"migrateAll\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getCard\",\"outputs\":[{\"name\":\"proto\",\"type\":\"uint16\"},{\"name\":\"purity\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint16\"}],\"name\":\"getLimit\",\"outputs\":[{\"name\":\"limit\",\"type\":\"uint64\"},{\"name\":\"set\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"limits\",\"outputs\":[{\"name\":\"limit\",\"type\":\"uint64\"},{\"name\":\"exists\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rare\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"proto\",\"type\":\"uint16\"}],\"name\":\"isTradable\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"proposed\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"ownsAll\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenMetadataBaseURI\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"packs\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"nextSeason\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentSeason\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_gov\",\"type\":\"address\"}],\"name\":\"setGovernor\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"season\",\"type\":\"uint8\"}],\"name\":\"makeUntradable\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"random\",\"type\":\"uint16\"}],\"name\":\"getRandomCard\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalID\",\"type\":\"uint16\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"attack\",\"type\":\"uint8\"},{\"name\":\"durability\",\"type\":\"uint8\"},{\"name\":\"packable\",\"type\":\"bool\"}],\"name\":\"addWeapon\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalID\",\"type\":\"uint16\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"attack\",\"type\":\"uint8\"},{\"name\":\"health\",\"type\":\"uint8\"},{\"name\":\"cardType\",\"type\":\"uint8\"},{\"name\":\"tribe\",\"type\":\"uint8\"},{\"name\":\"packable\",\"type\":\"bool\"}],\"name\":\"addProto\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"protoCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"epic\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalID\",\"type\":\"uint16\"},{\"name\":\"god\",\"type\":\"uint8\"},{\"name\":\"rarity\",\"type\":\"uint8\"},{\"name\":\"mana\",\"type\":\"uint8\"},{\"name\":\"attack\",\"type\":\"uint8\"},{\"name\":\"health\",\"type\":\"uint8\"},{\"name\":\"tribe\",\"type\":\"uint8\"},{\"name\":\"packable\",\"type\":\"bool\"}],\"name\":\"addMinion\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalIDs\",\"type\":\"uint16[]\"},{\"name\":\"gods\",\"type\":\"uint8[]\"},{\"name\":\"rarities\",\"type\":\"uint8[]\"},{\"name\":\"manas\",\"type\":\"uint8[]\"},{\"name\":\"attacks\",\"type\":\"uint8[]\"},{\"name\":\"healths\",\"type\":\"uint8[]\"},{\"name\":\"cardTypes\",\"type\":\"uint8[]\"},{\"name\":\"tribes\",\"type\":\"uint8[]\"},{\"name\":\"packable\",\"type\":\"bool[]\"}],\"name\":\"addProtos\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBurnCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"legendary\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"approveAll\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"season\",\"type\":\"uint8\"}],\"name\":\"makeTradable\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"SYMBOL\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"proto\",\"type\":\"uint16\"},{\"name\":\"purity\",\"type\":\"uint16\"}],\"name\":\"createCard\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"previous\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"proto\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"purity\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"CardCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_approved\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_operator\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"id\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"season\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"god\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"rarity\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"mana\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"attack\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"health\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"cardType\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"tribe\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"packable\",\"type\":\"bool\"}],\"name\":\"NewProtoCard\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}]" - abi_ContractScenario008_deployErc721CryptoKitties = "[{\"constant\":true,\"inputs\":[{\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cfoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_preferredTransport\",\"type\":\"string\"}],\"name\":\"tokenMetadata\",\"outputs\":[{\"name\":\"infoUrl\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"promoCreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ceoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_STARTING_PRICE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSiringAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pregnantKitties\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isPregnant\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_AUCTION_DURATION\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"siringAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setGeneScienceAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCEO\",\"type\":\"address\"}],\"name\":\"setCEO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCOO\",\"type\":\"address\"}],\"name\":\"setCOO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSaleAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sireAllowedToAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"canBreedWith\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToApproved\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSiringAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"setAutoBirthFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"approveSiring\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCFO\",\"type\":\"address\"}],\"name\":\"setCFO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"createPromoKitty\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"secs\",\"type\":\"uint256\"}],\"name\":\"setSecondsPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newContractAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSaleAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_v2Address\",\"type\":\"address\"}],\"name\":\"setNewAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsPerBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"name\":\"ownerTokens\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"giveBirth\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawAuctionBalances\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cooldowns\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cooAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"autoBirthFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"erc721Metadata\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"}],\"name\":\"createGen0Auction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isReadyToBreed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PROMO_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_contractAddress\",\"type\":\"address\"}],\"name\":\"setMetadataAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"saleAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getKitty\",\"outputs\":[{\"name\":\"isGestating\",\"type\":\"bool\"},{\"name\":\"isReady\",\"type\":\"bool\"},{\"name\":\"cooldownIndex\",\"type\":\"uint256\"},{\"name\":\"nextActionAt\",\"type\":\"uint256\"},{\"name\":\"siringWithId\",\"type\":\"uint256\"},{\"name\":\"birthTime\",\"type\":\"uint256\"},{\"name\":\"matronId\",\"type\":\"uint256\"},{\"name\":\"sireId\",\"type\":\"uint256\"},{\"name\":\"generation\",\"type\":\"uint256\"},{\"name\":\"genes\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sireId\",\"type\":\"uint256\"},{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"bidOnSiringAuction\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0CreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"geneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"breedWithAuto\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"cooldownEndBlock\",\"type\":\"uint256\"}],\"name\":\"Pregnant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kittyId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"genes\",\"type\":\"uint256\"}],\"name\":\"Birth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgrade\",\"type\":\"event\"}]" - abi_ContractScenario009_deployContainLibraryContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"contains\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"self\",\"type\":\"Set.Data storage\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractScenario010_deployContainLibraryContract = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"name\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"supply\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadata\",\"outputs\":[{\"name\":\"infoUrl\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"symbol\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"takeOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_approved\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]" - abi_ContractScenario012_deployTransactionCoin = "[{\"constant\":false,\"inputs\":[],\"name\":\"getBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"n\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"sendToAddress\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"user\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"nPlusOne\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositOneCoin\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"money\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"sendToAddress2\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getSenderBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractScenario013_deployTronTrxAndSunContract = "[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - abi_ContractScenario013_triggerTronTrxAndSunContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"time\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractScenario014_testTripleTrigger = "[{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"send5SunToReceiver\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi1_ContractScenario014_testTripleTrigger = "[{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"triggerContract1ButRevert\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"triggerContract1\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"payContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_add\",\"type\":\"address\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi2_ContractScenario014_testTripleTrigger = "[{\"constant\":false,\"inputs\":[{\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"triggerContract2\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"payContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_add\",\"type\":\"address\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_TronDice_tronDice = "[{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_point\",\"type\":\"uint256\"}],\"name\":\"rollDice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"ownerkill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getPendingBalane\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_point\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_random\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_P\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_O\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_W\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_B\",\"type\":\"uint256\"}],\"name\":\"UserWin\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_point\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_random\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_B\",\"type\":\"uint256\"}],\"name\":\"UserLose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_balance\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_reward\",\"type\":\"uint256\"}],\"name\":\"RollDice\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}]" - abi_TvmContract_deployErc721CryptoKitties = "[{\"constant\":true,\"inputs\":[{\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cfoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_preferredTransport\",\"type\":\"string\"}],\"name\":\"tokenMetadata\",\"outputs\":[{\"name\":\"infoUrl\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"promoCreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ceoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_STARTING_PRICE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSiringAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pregnantKitties\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isPregnant\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_AUCTION_DURATION\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"siringAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setGeneScienceAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCEO\",\"type\":\"address\"}],\"name\":\"setCEO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCOO\",\"type\":\"address\"}],\"name\":\"setCOO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSaleAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sireAllowedToAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"canBreedWith\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToApproved\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSiringAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"setAutoBirthFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"approveSiring\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCFO\",\"type\":\"address\"}],\"name\":\"setCFO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"createPromoKitty\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"secs\",\"type\":\"uint256\"}],\"name\":\"setSecondsPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newContractAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSaleAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_v2Address\",\"type\":\"address\"}],\"name\":\"setNewAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsPerBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"name\":\"ownerTokens\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"giveBirth\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawAuctionBalances\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cooldowns\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cooAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"autoBirthFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"erc721Metadata\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"}],\"name\":\"createGen0Auction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isReadyToBreed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PROMO_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_contractAddress\",\"type\":\"address\"}],\"name\":\"setMetadataAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"saleAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getKitty\",\"outputs\":[{\"name\":\"isGestating\",\"type\":\"bool\"},{\"name\":\"isReady\",\"type\":\"bool\"},{\"name\":\"cooldownIndex\",\"type\":\"uint256\"},{\"name\":\"nextActionAt\",\"type\":\"uint256\"},{\"name\":\"siringWithId\",\"type\":\"uint256\"},{\"name\":\"birthTime\",\"type\":\"uint256\"},{\"name\":\"matronId\",\"type\":\"uint256\"},{\"name\":\"sireId\",\"type\":\"uint256\"},{\"name\":\"generation\",\"type\":\"uint256\"},{\"name\":\"genes\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sireId\",\"type\":\"uint256\"},{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"bidOnSiringAuction\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0CreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"geneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"breedWithAuto\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"cooldownEndBlock\",\"type\":\"uint256\"}],\"name\":\"Pregnant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kittyId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"genes\",\"type\":\"uint256\"}],\"name\":\"Birth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgrade\",\"type\":\"event\"}]" - abi_ContractScenario011_deployErc721KittyCore = "[{\"constant\":true,\"inputs\":[{\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cfoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_preferredTransport\",\"type\":\"string\"}],\"name\":\"tokenMetadata\",\"outputs\":[{\"name\":\"infoUrl\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"promoCreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ceoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_STARTING_PRICE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSiringAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pregnantKitties\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isPregnant\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_AUCTION_DURATION\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"siringAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setGeneScienceAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCEO\",\"type\":\"address\"}],\"name\":\"setCEO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCOO\",\"type\":\"address\"}],\"name\":\"setCOO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSaleAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sireAllowedToAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"canBreedWith\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToApproved\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSiringAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"setAutoBirthFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"approveSiring\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCFO\",\"type\":\"address\"}],\"name\":\"setCFO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"createPromoKitty\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"secs\",\"type\":\"uint256\"}],\"name\":\"setSecondsPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newContractAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSaleAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_v2Address\",\"type\":\"address\"}],\"name\":\"setNewAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsPerBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"name\":\"ownerTokens\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"giveBirth\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawAuctionBalances\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cooldowns\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cooAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"autoBirthFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"erc721Metadata\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"}],\"name\":\"createGen0Auction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isReadyToBreed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PROMO_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_contractAddress\",\"type\":\"address\"}],\"name\":\"setMetadataAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"saleAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getKitty\",\"outputs\":[{\"name\":\"isGestating\",\"type\":\"bool\"},{\"name\":\"isReady\",\"type\":\"bool\"},{\"name\":\"cooldownIndex\",\"type\":\"uint256\"},{\"name\":\"nextActionAt\",\"type\":\"uint256\"},{\"name\":\"siringWithId\",\"type\":\"uint256\"},{\"name\":\"birthTime\",\"type\":\"uint256\"},{\"name\":\"matronId\",\"type\":\"uint256\"},{\"name\":\"sireId\",\"type\":\"uint256\"},{\"name\":\"generation\",\"type\":\"uint256\"},{\"name\":\"genes\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sireId\",\"type\":\"uint256\"},{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"bidOnSiringAuction\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0CreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"geneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"breedWithAuto\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"cooldownEndBlock\",\"type\":\"uint256\"}],\"name\":\"Pregnant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kittyId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"genes\",\"type\":\"uint256\"}],\"name\":\"Birth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgrade\",\"type\":\"event\"}]" - abi_ContractScenario011_deploySaleClockAuction = "[{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_seller\",\"type\":\"address\"}],\"name\":\"createAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lastGen0SalePrices\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuction\",\"outputs\":[{\"name\":\"seller\",\"type\":\"address\"},{\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"name\":\"duration\",\"type\":\"uint256\"},{\"name\":\"startedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCut\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isSaleClockAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuctionWhenPaused\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0SaleCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getCurrentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonFungibleContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"averageGen0SalePrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_nftAddr\",\"type\":\"address\"},{\"name\":\"_cut\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"AuctionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"totalPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"winner\",\"type\":\"address\"}],\"name\":\"AuctionSuccessful\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"AuctionCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}]" - abi_ContractScenario011_deploySiringClockAuction = "[{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_seller\",\"type\":\"address\"}],\"name\":\"createAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isSiringClockAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuction\",\"outputs\":[{\"name\":\"seller\",\"type\":\"address\"},{\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"name\":\"duration\",\"type\":\"uint256\"},{\"name\":\"startedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCut\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuctionWhenPaused\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getCurrentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonFungibleContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_nftAddr\",\"type\":\"address\"},{\"name\":\"_cut\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"AuctionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"totalPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"winner\",\"type\":\"address\"}],\"name\":\"AuctionSuccessful\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"AuctionCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}]" - abi_ContractScenario011_deployGeneScienceInterface = "[{\"constant\":true,\"inputs\":[{\"name\":\"genes1\",\"type\":\"uint256\"},{\"name\":\"genes2\",\"type\":\"uint256\"},{\"name\":\"targetBlock\",\"type\":\"uint256\"}],\"name\":\"mixGenes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isGeneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}]" - abi_WalletTestAccount012_storageAndCpu = "[{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"add2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fori2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"args\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"fori\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - abi_TestExceptionCodeAndAbi_testExceptionCodeAndAbi = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply1\",\"outputs\":[{\"name\":\"_totalSupply1\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"_decimals\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_UINT256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"_symbol\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"},{\"name\":\"_custom_fallback\",\"type\":\"string\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"}]" - abi_TestExceptionCodeAndAbi_testtimeout = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"iarray\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"testUseCpu\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"testUseStorage\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"m\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"calculatedFibNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"test\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"uint256\"}],\"name\":\"setFibonacci\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_TestMapBigLongAndNumbers_deployErc721KittyCore = "[{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"bytes\"},{\"name\":\"addr3\",\"type\":\"address\"}],\"name\":\"update3\",\"outputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances1\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances3\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"testUseCpu\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"s\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addr2\",\"type\":\"address\"},{\"name\":\"times\",\"type\":\"uint256\"}],\"name\":\"update1\",\"outputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"string\"},{\"name\":\"addr3\",\"type\":\"address\"}],\"name\":\"update2\",\"outputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"addr1\",\"type\":\"address\"}],\"name\":\"update\",\"outputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_TestNetErc721Cat_deployErc721KittyCore = "[{\"constant\":true,\"inputs\":[{\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cfoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_preferredTransport\",\"type\":\"string\"}],\"name\":\"tokenMetadata\",\"outputs\":[{\"name\":\"infoUrl\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"promoCreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ceoAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_STARTING_PRICE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSiringAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pregnantKitties\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isPregnant\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_AUCTION_DURATION\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"siringAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setGeneScienceAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCEO\",\"type\":\"address\"}],\"name\":\"setCEO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCOO\",\"type\":\"address\"}],\"name\":\"setCOO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSaleAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sireAllowedToAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"canBreedWith\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToApproved\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"createSiringAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"setAutoBirthFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"approveSiring\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newCFO\",\"type\":\"address\"}],\"name\":\"setCFO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"createPromoKitty\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"secs\",\"type\":\"uint256\"}],\"name\":\"setSecondsPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GEN0_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newContractAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setSaleAuctionAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_v2Address\",\"type\":\"address\"}],\"name\":\"setNewAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsPerBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"name\":\"ownerTokens\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"giveBirth\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawAuctionBalances\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cooldowns\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kittyIndexToOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cooAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"autoBirthFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"erc721Metadata\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_genes\",\"type\":\"uint256\"}],\"name\":\"createGen0Auction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_kittyId\",\"type\":\"uint256\"}],\"name\":\"isReadyToBreed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PROMO_CREATION_LIMIT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_contractAddress\",\"type\":\"address\"}],\"name\":\"setMetadataAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"saleAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getKitty\",\"outputs\":[{\"name\":\"isGestating\",\"type\":\"bool\"},{\"name\":\"isReady\",\"type\":\"bool\"},{\"name\":\"cooldownIndex\",\"type\":\"uint256\"},{\"name\":\"nextActionAt\",\"type\":\"uint256\"},{\"name\":\"siringWithId\",\"type\":\"uint256\"},{\"name\":\"birthTime\",\"type\":\"uint256\"},{\"name\":\"matronId\",\"type\":\"uint256\"},{\"name\":\"sireId\",\"type\":\"uint256\"},{\"name\":\"generation\",\"type\":\"uint256\"},{\"name\":\"genes\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sireId\",\"type\":\"uint256\"},{\"name\":\"_matronId\",\"type\":\"uint256\"}],\"name\":\"bidOnSiringAuction\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0CreatedCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"geneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_matronId\",\"type\":\"uint256\"},{\"name\":\"_sireId\",\"type\":\"uint256\"}],\"name\":\"breedWithAuto\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"cooldownEndBlock\",\"type\":\"uint256\"}],\"name\":\"Pregnant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kittyId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"matronId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sireId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"genes\",\"type\":\"uint256\"}],\"name\":\"Birth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgrade\",\"type\":\"event\"}]" - abi_TestNetErc721Cat_deploySaleClockAuction = "[{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_seller\",\"type\":\"address\"}],\"name\":\"createAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lastGen0SalePrices\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuction\",\"outputs\":[{\"name\":\"seller\",\"type\":\"address\"},{\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"name\":\"duration\",\"type\":\"uint256\"},{\"name\":\"startedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCut\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isSaleClockAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuctionWhenPaused\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gen0SaleCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getCurrentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonFungibleContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"averageGen0SalePrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_nftAddr\",\"type\":\"address\"},{\"name\":\"_cut\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"AuctionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"totalPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"winner\",\"type\":\"address\"}],\"name\":\"AuctionSuccessful\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"AuctionCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}]" - abi_TestNetErc721Cat_deploySiringClockAuction = "[{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"name\":\"_startingPrice\",\"type\":\"uint256\"},{\"name\":\"_endingPrice\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_seller\",\"type\":\"address\"}],\"name\":\"createAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isSiringClockAuction\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuction\",\"outputs\":[{\"name\":\"seller\",\"type\":\"address\"},{\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"name\":\"duration\",\"type\":\"uint256\"},{\"name\":\"startedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCut\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuctionWhenPaused\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getCurrentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonFungibleContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_nftAddr\",\"type\":\"address\"},{\"name\":\"_cut\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"startingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"endingPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"AuctionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"totalPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"winner\",\"type\":\"address\"}],\"name\":\"AuctionSuccessful\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"AuctionCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}]" - abi_TestNetErc721Cat_deployGeneScienceInterface = "[{\"constant\":true,\"inputs\":[{\"name\":\"genes1\",\"type\":\"uint256\"},{\"name\":\"genes2\",\"type\":\"uint256\"},{\"name\":\"targetBlock\",\"type\":\"uint256\"}],\"name\":\"mixGenes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isGeneScience\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}]" - abi_TestNetFomo3D_deployErc721CryptoKitties = "[{\"constant\":true,\"inputs\":[{\"name\":\"_customerAddress\",\"type\":\"address\"}],\"name\":\"dividendsOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_ethereumToSpend\",\"type\":\"uint256\"}],\"name\":\"calculateTokensReceived\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_tokensToSell\",\"type\":\"uint256\"}],\"name\":\"calculateEthereumReceived\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"onlyAmbassadors\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"administrators\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"sellPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stakingRequirement\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_includeReferralBonus\",\"type\":\"bool\"}],\"name\":\"myDividends\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalEthereumBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_customerAddress\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"setStakingRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"buyPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_identifier\",\"type\":\"bytes32\"},{\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setAdministrator\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"Hourglass\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"myTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"disableInitialStage\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_toAddress\",\"type\":\"address\"},{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"setSymbol\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_amountOfTokens\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"exit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_referredBy\",\"type\":\"address\"}],\"name\":\"buy\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"reinvest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"incomingEthereum\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokensMinted\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"referredBy\",\"type\":\"address\"}],\"name\":\"onTokenPurchase\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokensBurned\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"ethereumEarned\",\"type\":\"uint256\"}],\"name\":\"onTokenSell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"ethereumReinvested\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokensMinted\",\"type\":\"uint256\"}],\"name\":\"onReinvestment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"customerAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"ethereumWithdrawn\",\"type\":\"uint256\"}],\"name\":\"onWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]" - abi1_TestNetFomo3D_deployErc721CryptoKitties = "[{\"constant\":false,\"inputs\":[],\"name\":\"test\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_TestNetFomo3D_tooLargeStorage = "[{\"constant\":true,\"inputs\":[],\"name\":\"s\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"foo\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"times\",\"type\":\"uint256\"}],\"name\":\"slice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"refresh\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_TestStorageAndCpu_storageAndCpu = "[{\"constant\":false,\"inputs\":[],\"name\":\"oneCpu\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"iarray\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"storage8Char\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"testUseCpu\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"testUseStorage\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"m\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"iarray1\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"calculatedFibNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"test\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"uint256\"}],\"name\":\"setFibonacci\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_WalletTestAccount013 = "[{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"add2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fori2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"args\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"fori\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}] " - abi_ContractEventAndLog1 = "[{\"constant\":false,\"inputs\":[],\"name\":\"depositForLog\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"depositForLogCycle\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForAnonymousNoLog\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForEventAndLog\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getTransactionKeccak256\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForAnonymousHasLog\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForEventTwoIndex\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForEvent\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getDepositKeccak256\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForEventNoIndex\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"depositForEventCycle\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"yes\",\"type\":\"bool\"},{\"name\":\"no\",\"type\":\"bool\"}],\"name\":\"triggerBoolEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"triggerUintEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":\"string\"}],\"name\":\"triggerStringEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":\"string\"}],\"name\":\"triggerStringEventAnonymous\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"triggerintEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBanlance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositForEventOneIndex\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"value1\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"value2\",\"type\":\"uint64\"},{\"indexed\":false,\"name\":\"value3\",\"type\":\"uint128\"},{\"indexed\":false,\"name\":\"value4\",\"type\":\"uint248\"}],\"name\":\"uintErgodic\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"value1\",\"type\":\"int8\"},{\"indexed\":false,\"name\":\"value2\",\"type\":\"int72\"},{\"indexed\":false,\"name\":\"value3\",\"type\":\"int136\"},{\"indexed\":false,\"name\":\"value4\",\"type\":\"int232\"}],\"name\":\"intErgodic\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"},{\"indexed\":true,\"name\":\"age\",\"type\":\"string\"}],\"name\":\"stringEvent\",\"type\":\"event\"},{\"anonymous\":true,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"},{\"indexed\":true,\"name\":\"age\",\"type\":\"string\"}],\"name\":\"stringEventAnonymous\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"yes\",\"type\":\"bool\"},{\"indexed\":true,\"name\":\"no\",\"type\":\"bool\"}],\"name\":\"boolEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferNoIndex\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferOneIndex\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferTwoIndex\",\"type\":\"event\"},{\"anonymous\":true,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferAnonymous\",\"type\":\"event\"}]" - abi_ContractEventAndLog2 = "[{\"constant\":false,\"inputs\":[],\"name\":\"triggerEventBytes\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBanlance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"value10\",\"type\":\"bytes10\"},{\"indexed\":false,\"name\":\"value17\",\"type\":\"bytes17\"},{\"indexed\":false,\"name\":\"value32\",\"type\":\"bytes32\"}],\"name\":\"eventBytes\",\"type\":\"event\"},{\"anonymous\":true,\"inputs\":[{\"indexed\":false,\"name\":\"value10\",\"type\":\"bytes10\"},{\"indexed\":false,\"name\":\"value17\",\"type\":\"bytes17\"},{\"indexed\":false,\"name\":\"value32\",\"type\":\"bytes32\"}],\"name\":\"triggerBytesAnonymous\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"value10\",\"type\":\"bytes10\"},{\"indexed\":true,\"name\":\"value17\",\"type\":\"bytes17\"},{\"indexed\":true,\"name\":\"value32\",\"type\":\"bytes32\"}],\"name\":\"eventBytesIndex\",\"type\":\"event\"},{\"anonymous\":true,\"inputs\":[{\"indexed\":true,\"name\":\"value10\",\"type\":\"bytes10\"},{\"indexed\":true,\"name\":\"value17\",\"type\":\"bytes17\"},{\"indexed\":true,\"name\":\"value32\",\"type\":\"bytes32\"}],\"name\":\"triggerBytesAnonymousIndex\",\"type\":\"event\"}]" - - abi_OriginEnergyLimit001 = "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"findArgsByIndexTest\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_OriginEnergyLimit004 = "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"findArgsByIndexTest\",\"outputs\":[{\"name\":\"z\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - - abi_ContractTrcToken001_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]\n" - abi_ContractTrcToken002_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken005_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken006_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken011_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken011_resultContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken012_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken014_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken014_resultContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken016_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken016_resultContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken017_recieveTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"setFlag\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"flag\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken042_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken042_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken043_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken043_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken046_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken047_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi2_ContractTrcToken023_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken023_tokenTest = "[{\"constant\":true,\"inputs\":[],\"name\":\"flag\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken026_BTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"callCAddress\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transC\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi1_ContractTrcToken026_CTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi1_ContractTrcToken026_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"callBAddress\",\"type\":\"address\"},{\"name\":\"callCAddress\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"testInCall\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"callBddress\",\"type\":\"address\"},{\"name\":\"callAddressC\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"testIndelegateCall\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken027_BTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"callCAddress\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transC\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken027_CTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken027_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"callBAddress\",\"type\":\"address\"},{\"name\":\"callCAddress\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"testIndelegateCall\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"callBddress\",\"type\":\"address\"},{\"name\":\"callAddressC\",\"type\":\"address\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"testIndelegateCall\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken028_tokenTest = "[{\"constant\":true,\"inputs\":[],\"name\":\"a\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"tokenBalanceWithSameName\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getA\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken054_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken055_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken060_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]\n" - abi_ContractTrcToken061_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]\n" - abi_ContractTrcToken062_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken062_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken063_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken063_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken064_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken064_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken066_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken066_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken067_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken067_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken068_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken068_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken071_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestIDOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken071_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken073_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getToken\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logFallback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logGetToken\",\"type\":\"event\"}]" - abi_ContractTrcToken074_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getToken\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logFallback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logGetToken\",\"type\":\"event\"}]" - abi_ContractTrcToken075_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getTokenLongMin\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getToken\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getTokenLongMax\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logFallback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"logGetToken\",\"type\":\"event\"}]" - abi_ContractTrcToken0552_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken0553_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken0612_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]\n" - abi_ContractTrcToken0613_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]\n" - abi_ContractTrcToken0672_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"transferTokenTest\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueOverBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueRandomIdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getTokenBalanceTest\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\",\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValueMaxLong\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"}],\"name\":\"getTokenBalnce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTokenTestValue0IdBigInteger\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken0672_recieveTokenContract = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - - abi_ContractTrcToken029_tokenTest = "[{\"constant\":true,\"inputs\":[],\"name\":\"a\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferTokenWithSameName\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken030_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken031_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken034_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"failTransferTokenError\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"failTransferTokenRevert\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken035_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"failTransferTokenError\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"failTransferTokenRevert\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken036_transferTokenWithPureTest = "[{\"constant\":true,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"}],\"name\":\"transferTokenWithConstant\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - - abi_ContractTrcToken036_transferTokenWithViewTest = "[{\"constant\":true,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"}],\"name\":\"transferTokenWithView\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken036_transferTokenWithOutPayableTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"}],\"name\":\"transferTokenWithOutPayable\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken037_receiveTrc10Test = "[{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"tid\",\"type\":\"trcToken\"},{\"name\":\"meamount\",\"type\":\"uint256\"}],\"name\":\"checkTrc10\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - - abi_ContractTrcToken037_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"rec\",\"type\":\"address\"}],\"name\":\"receive\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken038_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"rec\",\"type\":\"address\"}],\"name\":\"receive\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken038_BTest = "[{\"constant\":false,\"inputs\":[],\"name\":\"AssertError\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - - abi_ContractTrcToken039_ProxyTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - - abi_ContractTrcToken039_ATest = "[{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken039_BTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken041_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken048_transferTokenContract = "[{\"constant\":false,\"inputs\":[],\"name\":\"testMsgValue\",\"outputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"testMsgTokenValue\",\"outputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - - abi_ContractTrcToken050_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - - abi_ContractTrcToken051_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - - - abi_ContractTrcToken052_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken036_tokenTest = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"tokenValue\",\"type\":\"uint256\"}],\"name\":\"transferTokenWithPure\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_ContractTrcToken049_transferTokenContract = "[{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_ContractTrcToken076_originTest = "[{\"constant\":true,\"inputs\":[],\"name\":\"result2\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"result1\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"sender\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getResult1\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"origin\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getResult2\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"test\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_ContractTrcToken077_AddressTest = "[{\"constant\":true,\"inputs\":[],\"name\":\"addressTest\",\"outputs\":[{\"name\":\"addressValue\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_ContractTrcToken077_AddressTest1 = "[{\"constant\":false,\"inputs\":[],\"name\":\"addressTest\",\"outputs\":[{\"name\":\"addressValue\",\"type\":\"bytes32\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_ContractTrcToken078_AddressTest1 = "[{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB3\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB2\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken078_AddressTest2 = "[{\"constant\":false,\"inputs\":[{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"setIinC\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken078_AddressTest3 = "[{\"constant\":true,\"inputs\":[],\"name\":\"sender\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"origin\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"\",\"type\":\"address\"}],\"name\":\"log\",\"type\":\"event\"}]" - - abi_ContractTrcToken078_AddressTest4 = "[{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB3\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"called_address\",\"type\":\"address\"},{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"sendToB2\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - - abi_ContractTrcToken078_AddressTest5 = "[{\"constant\":false,\"inputs\":[{\"name\":\"c\",\"type\":\"address\"}],\"name\":\"setIinC\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}],\"name\":\"transferTo\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_ContractTrcToken078_AddressTest6 = "[{\"constant\":true,\"inputs\":[],\"name\":\"sender\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"origin\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"\",\"type\":\"address\"}],\"name\":\"log\",\"type\":\"event\"}]" - abi_veryLarge = "[{\"constant\":false,\"inputs\":[],\"name\":\"getBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Address\",\"type\":\"address\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"num\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"}]" - abi_MainGateway = "[{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"checkOracle\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\"},{\"name\":\"uid\",\"type\":\"uint256\"},{\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"withdrawTRC721\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositTRX\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"depositTRC10\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"depositTRC20\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"uid\",\"type\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"depositTRC721\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numOracles\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"withdrawTRC20\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getTRC10\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"isOracle\",\"type\":\"bool\"}],\"name\":\"modifyOracle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"uid\",\"type\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"getNFT\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"withdrawTRC10\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowes\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onTRC20Received\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_uid\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onTRC721Received\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getTRX\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"mainChainToken\",\"type\":\"address\"},{\"name\":\"sideChainToken\",\"type\":\"address\"}],\"name\":\"migrationToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"withdrawTRX\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"getTRC20\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TRXReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"TRC10Received\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"TRC20Received\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"uid\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"TRC721Received\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kind\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kind\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"trcToken\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Token10Withdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"oracle\",\"type\":\"address\"}],\"name\":\"NewOracles\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"}],\"name\":\"OwnershipRenounced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}]" - abi_SideGateway = "[{\"constant\":false,\"inputs\":[{\"name\":\"_sunTokenAddress\",\"type\":\"address\"}],\"name\":\"setSunTokenAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"b1\",\"type\":\"bytes\"},{\"name\":\"b2\",\"type\":\"bytes\"}],\"name\":\"concatBytes\",\"outputs\":[{\"name\":\"r\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"withdrawTRX\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"trc10\",\"type\":\"uint256\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"name\",\"type\":\"bytes32\"},{\"name\":\"symbol\",\"type\":\"bytes32\"},{\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"depositTRC10\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"depositTRC20\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"trc10Map\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"mainToSideContractMap\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"txId\",\"type\":\"bytes\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\"},{\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"deployDAppTRC20AndMapping\",\"outputs\":[{\"name\":\"r\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"sunTokenAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"txId\",\"type\":\"bytes\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"calcContractAddress\",\"outputs\":[{\"name\":\"r\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"isOracle\",\"type\":\"bool\"}],\"name\":\"modifyOracle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"txId\",\"type\":\"bytes\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"deployDAppTRC721AndMapping\",\"outputs\":[{\"name\":\"r\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"oracles\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"onTRC20Received\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\"},{\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"onTRC721Received\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"sideToMainContractMap\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"addressToBytes\",\"outputs\":[{\"name\":\"b\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"withdrawTRC10\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"depositTRX\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"depositTRC721\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"developer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"sideChainAddress\",\"type\":\"address\"}],\"name\":\"DeployDAppTRC20AndMapping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"developer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"sideChainAddress\",\"type\":\"address\"}],\"name\":\"DeployDAppTRC721AndMapping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"trc10\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"DepositTRC10\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sideChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"DepositTRC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sideChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"DepositTRC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"DepositTRX\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"trc10\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"WithdrawTRC10\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"WithdrawTRC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"mainChainAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"WithdrawTRC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"txData\",\"type\":\"bytes\"}],\"name\":\"WithdrawTRX\",\"type\":\"event\"}]" - abi_shieldTrc20Token = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"initialSupply\",\"type\":\"uint256\"},{\"name\":\"tokenName\",\"type\":\"string\"},{\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"}]" - abi_shield = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"trc20ContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"scalingFactorExponent\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"position\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cm\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cv\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"epk\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32[21]\",\"name\":\"c\",\"type\":\"bytes32[21]\"}],\"name\":\"BurnNewLeaf\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"position\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cm\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cv\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"epk\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32[21]\",\"name\":\"c\",\"type\":\"bytes32[21]\"}],\"name\":\"MintNewLeaf\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"nf\",\"type\":\"bytes32\"}],\"name\":\"NoteSpent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32[3]\",\"name\":\"ciphertext\",\"type\":\"bytes32[3]\"}],\"name\":\"TokenBurn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TokenMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"position\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cm\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"cv\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"epk\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32[21]\",\"name\":\"c\",\"type\":\"bytes32[21]\"}],\"name\":\"TransferNewLeaf\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32[10]\",\"name\":\"input\",\"type\":\"bytes32[10]\"},{\"internalType\":\"bytes32[2]\",\"name\":\"spendAuthoritySignature\",\"type\":\"bytes32[2]\"},{\"internalType\":\"uint256\",\"name\":\"rawValue\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[2]\",\"name\":\"bindingSignature\",\"type\":\"bytes32[2]\"},{\"internalType\":\"address\",\"name\":\"payTo\",\"type\":\"address\"},{\"internalType\":\"bytes32[3]\",\"name\":\"burnCipher\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes32[9][]\",\"name\":\"output\",\"type\":\"bytes32[9][]\"},{\"internalType\":\"bytes32[21][]\",\"name\":\"c\",\"type\":\"bytes32[21][]\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"position\",\"type\":\"uint256\"}],\"name\":\"getPath\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"\",\"type\":\"bytes32[32]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"latestRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"leafCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"rawValue\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[9]\",\"name\":\"output\",\"type\":\"bytes32[9]\"},{\"internalType\":\"bytes32[2]\",\"name\":\"bindingSignature\",\"type\":\"bytes32[2]\"},{\"internalType\":\"bytes32[21]\",\"name\":\"c\",\"type\":\"bytes32[21]\"}],\"name\":\"mint\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"noteCommitment\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nullifiers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"roots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"scalingFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32[10][]\",\"name\":\"input\",\"type\":\"bytes32[10][]\"},{\"internalType\":\"bytes32[2][]\",\"name\":\"spendAuthoritySignature\",\"type\":\"bytes32[2][]\"},{\"internalType\":\"bytes32[9][]\",\"name\":\"output\",\"type\":\"bytes32[9][]\"},{\"internalType\":\"bytes32[2]\",\"name\":\"bindingSignature\",\"type\":\"bytes32[2]\"},{\"internalType\":\"bytes32[21][]\",\"name\":\"c\",\"type\":\"bytes32[21][]\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tree\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_getAddressChange = "[{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getamount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"testaddress1\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_fallbackOldVersionTest = "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"msg\",\"type\":\"bytes\"}],\"name\":\"FallbackCall\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" - abi_fallbackOldversionCall = "[{\"constant\":false,\"inputs\":[{\"internalType\":\"contract Test0\",\"name\":\"test\",\"type\":\"address\"}],\"name\":\"call\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]" - abi_arrayLenth_0.5.15 = "[{\"constant\":false,\"inputs\":[],\"name\":\"ChangeSize\",\"outputs\":[{\"internalType\":\"bytes1[]\",\"name\":\"\",\"type\":\"bytes1[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - abi_override001 = "[{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_y\",\"type\":\"uint256\"}],\"name\":\"setValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"y\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_override002 = "[{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_x\",\"type\":\"uint256\"}],\"name\":\"setValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_x\",\"type\":\"uint256\"}],\"name\":\"setValue2\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_override003 = "[{\"constant\":true,\"inputs\":[],\"name\":\"b32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"choice\",\"outputs\":[{\"internalType\":\"enum Base.ActionChoices\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"choice2\",\"outputs\":[{\"internalType\":\"enum Base.ActionChoices\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"i\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"i2\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"origin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ui\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_virtual001 = "[{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_y\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"string\",\"name\":\"_z\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_x\",\"type\":\"uint256\"}],\"name\":\"setValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"y\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"z\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - abi_slotAndOffset_06x = "[{\"inputs\":[],\"name\":\"getA\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" -} \ No newline at end of file From af3a0028febc8dc4fbfc4d67894c58b29b5ed4f8 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 27 Feb 2025 10:14:14 +0800 Subject: [PATCH 070/107] feat(validate): strengthen transaction result verification --- .../tron/core/capsule/TransactionCapsule.java | 13 ++++ .../org/tron/core/db/BandwidthProcessor.java | 2 +- .../main/java/org/tron/core/db/Manager.java | 6 ++ .../java/org/tron/core/db/ManagerTest.java | 61 +++++++++++++++++-- 4 files changed, 76 insertions(+), 6 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java index 2b5e8b98596..95f436b19f0 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java @@ -878,4 +878,17 @@ public void checkExpiration(long nextSlotTime) throws TransactionExpirationExcep getExpiration(), nextSlotTime)); } } + + public boolean retCountIsGreatThanContractCount() { + int contractCount = getContractCount(); + return getRetCount() > contractCount && contractCount > 0; + } + + public int getRetCount() { + return this.getInstance().getRetCount(); + } + + public int getContractCount() { + return this.getInstance().getRawData().getContractCount(); + } } diff --git a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java index 73b9efaa35e..2488686bfb0 100644 --- a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java @@ -101,7 +101,7 @@ public void consume(TransactionCapsule trx, TransactionTrace trace) long resultSizeWithMaxContractRet = trx.getResultSizeWithMaxContractRet(); boolean optimizeTxs = !trx.isInBlock() || chainBaseManager .getDynamicPropertiesStore().allowConsensusLogicOptimization(); - if (optimizeTxs && resultSizeWithMaxContractRet > + if (!trx.isInBlock() && resultSizeWithMaxContractRet > Constant.MAX_RESULT_SIZE_IN_TX * contracts.size()) { throw new TooBigTransactionResultException(String.format( "Too big transaction result, TxId %s, the result size is %d bytes, maxResultSize %d", diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index cb7164a3bac..9b7bbf65621 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1802,6 +1802,12 @@ private void processBlock(BlockCapsule block, List txs) List results = new ArrayList<>(); long num = block.getNum(); for (TransactionCapsule transactionCapsule : block.getTransactions()) { + if (chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization() + && transactionCapsule.retCountIsGreatThanContractCount()) { + throw new BadBlockException(String.format("The result count %d of this transaction %s is " + + "greater than its contract count %d", transactionCapsule.getRetCount(), + transactionCapsule.getTransactionId(), transactionCapsule.getContractCount())); + } transactionCapsule.setBlockNum(num); if (block.generatedByMyself) { transactionCapsule.setVerified(true); diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index a7fc2feaf87..a9cf1087c2a 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -7,8 +7,11 @@ import static org.tron.common.utils.Commons.adjustAssetBalanceV2; import static org.tron.common.utils.Commons.adjustTotalShieldedPoolValue; import static org.tron.common.utils.Commons.getExchangeStoreFinal; +import static org.tron.common.utils.StringUtil.encode58Check; import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; +import static org.tron.protos.Protocol.Transaction.Result.contractResult.SUCCESS; +import com.beust.jcommander.internal.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.protobuf.Any; @@ -481,7 +484,7 @@ public void adjustAssetBalanceV2Test() { } catch (BalanceInsufficientException e) { Assert.assertTrue(e instanceof BalanceInsufficientException); Assert.assertEquals( - "reduceAssetAmount failed! account: " + StringUtil.encode58Check(account.createDbKey()), + "reduceAssetAmount failed! account: " + encode58Check(account.createDbKey()), e.getMessage()); } @@ -744,7 +747,7 @@ public void fork() chainManager.addWitness(ByteString.copyFrom(address)); chainManager.getWitnessStore().put(address, witnessCapsule); - Block block = getSignedBlock(witnessCapsule.getAddress(), 1533529947843L, privateKey); + Block block = getSignedBlock(witnessCapsule.getAddress(), 1533529947000L, privateKey); dbManager.pushBlock(new BlockCapsule(block)); @@ -754,7 +757,7 @@ public void fork() long num = chainManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); BlockCapsule blockCapsule0 = createTestBlockCapsule( - 1533529947843L + 3000, + 1533529947000L + 3000, num + 1, chainManager.getDynamicPropertiesStore().getLatestBlockHeaderHash() .getByteString(), @@ -762,7 +765,7 @@ public void fork() BlockCapsule blockCapsule1 = createTestBlockCapsule( - 1533529947843L + 3000, + 1533529947000L + 3000, num + 1, chainManager.getDynamicPropertiesStore().getLatestBlockHeaderHash() .getByteString(), @@ -773,7 +776,7 @@ public void fork() BlockCapsule blockCapsule2 = createTestBlockCapsule( - 1533529947843L + 6000, + 1533529947000L + 6000, num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys); dbManager.pushBlock(blockCapsule2); @@ -800,6 +803,24 @@ public void fork() Assert.assertEquals( chainManager.getHead().getBlockId(), chainManager.getDynamicPropertiesStore().getLatestBlockHeaderHash()); + + dbManager.getDynamicPropertiesStore().saveConsensusLogicOptimization(1); + BlockCapsule blockCapsule3 = + createTestBlockCapsule2(1533529947000L + 9000, + num + 3, blockCapsule2.getBlockId().getByteString(), addressToProvateKeys); + + assertThrows(BadBlockException.class, () -> dbManager.pushBlock(blockCapsule3)); + } + + private Transaction buildTransaction(com.google.protobuf.Message message, + ContractType contractType) { + Transaction.raw.Builder rawBuilder = Transaction.raw.newBuilder().addContract( + Transaction.Contract.newBuilder().setType(contractType).setParameter( + (message instanceof Any ? (Any) message : Any.pack(message))).build()); + Transaction.Builder transactionBuilder = Transaction.newBuilder().setRawData(rawBuilder) + .addRet(Transaction.Result.newBuilder().setContractRet(SUCCESS).build()) + .addRet(Transaction.Result.newBuilder().setContractRet(SUCCESS).build()); + return transactionBuilder.build(); } @Test @@ -1095,6 +1116,36 @@ private BlockCapsule createTestBlockCapsule(long time, return blockCapsule; } + private BlockCapsule createTestBlockCapsule2(long time, long number, ByteString hash, + Map addressToProvateKeys) { + TransferContract c1 = TransferContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom("f1".getBytes())) + .setAmount(1).build(); + ByteString witnessAddress = dposSlot.getScheduledWitness(dposSlot.getSlot(time)); + Protocol.BlockHeader.raw.Builder blockHeaderRawBuild = Protocol.BlockHeader.raw.newBuilder(); + Protocol.BlockHeader.raw blockHeaderRaw = blockHeaderRawBuild + .setTimestamp(time) + .setParentHash(hash) + .setWitnessAddress(witnessAddress) + .setNumber(number) + .build(); + + // block header + Protocol.BlockHeader.Builder blockHeaderBuild = Protocol.BlockHeader.newBuilder(); + Protocol.BlockHeader blockHeader = blockHeaderBuild.setRawData(blockHeaderRaw).build(); + + // block + Block.Builder blockBuild = Block.newBuilder(); + List transactions = Lists.newArrayList(buildTransaction(c1, + ContractType.TransferContract)); + transactions.forEach(blockBuild::addTransactions); + BlockCapsule blockCapsule = new BlockCapsule(blockBuild.setBlockHeader(blockHeader).build()); + blockCapsule.generatedByMyself = true; + blockCapsule.setMerkleRoot(); + blockCapsule.sign(ByteArray.fromHexString(addressToProvateKeys.get(witnessAddress))); + return blockCapsule; + } + private BlockCapsule createTestBlockCapsuleError(long time, long number, ByteString hash, Map addressToProvateKeys) { From f653cfd109ba72557ca0a7b077892ee9b000646c Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Mon, 3 Mar 2025 19:05:33 +0800 Subject: [PATCH 071/107] feat(event): optimize event service log --- .../org/tron/core/services/event/BlockEventCache.java | 5 +++-- .../org/tron/core/services/event/SolidEventService.java | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java index aac457ba29b..3548859262e 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventCache.java @@ -43,8 +43,8 @@ public static void init(BlockCapsule.BlockId blockId) { } public static void add(BlockEvent blockEvent) throws EventException { - logger.info("Add block event, {}, {}", blockEvent.getBlockId().getString(), - blockEvent.getParentId().getString()); + logger.info("Add block event, {}, {}, {}", blockEvent.getBlockId().getString(), + blockEvent.getParentId().getString(), blockEvent.getSolidId().getString()); if (blockEventMap.get(blockEvent.getParentId()) == null) { throw new EventException("unlink BlockEvent, " + blockEvent.getBlockId().getString() + ", " @@ -83,6 +83,7 @@ public static void remove(BlockCapsule.BlockId solidId) { } public static List getSolidBlockEvents(BlockCapsule.BlockId solidId) { + logger.info("Get solid events {}, {}", solidNum, solidId); List blockEvents = new ArrayList<>(); BlockCapsule.BlockId tmp = solidId; while (tmp.getNum() > solidNum) { diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java index 6178b247b1d..e67a1618ce1 100644 --- a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -47,7 +47,14 @@ public void work() { return; } - List blockEvents = BlockEventCache.getSolidBlockEvents(solidId); + List blockEvents; + + try { + blockEvents = BlockEventCache.getSolidBlockEvents(solidId); + } catch (Exception e) { + logger.warn("Get solid events failed. {}", e.getMessage()); + return; + } blockEvents.forEach(v -> flush(v)); From ae24ba84264dc7c70fa835f4805c0363b4ce7150 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 4 Mar 2025 10:42:04 +0800 Subject: [PATCH 072/107] fix BlockEventCacheTest unit test issue --- .../src/test/java/org/tron/core/event/BlockEventCacheTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java b/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java index a23c4b5c9c8..e99433db3c6 100644 --- a/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java +++ b/framework/src/test/java/org/tron/core/event/BlockEventCacheTest.java @@ -17,6 +17,7 @@ public void test() throws Exception { BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(getBlockId(), 1); be1.setBlockId(b1); be1.setParentId(b1); + be1.setSolidId(b1); try { BlockEventCache.add(be1); Assert.fail(); From a75e41dbbe888882d9077322da61076a7a6ced0a Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 4 Mar 2025 11:46:29 +0800 Subject: [PATCH 073/107] add SolidEventServiceTest unit test --- .../java/org/tron/core/event/SolidEventServiceTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java index ef71a3d39a9..de0300e31d7 100644 --- a/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/SolidEventServiceTest.java @@ -32,6 +32,15 @@ public class SolidEventServiceTest { @Test public void test() throws Exception { + BlockEvent be0 = new BlockEvent(); + BlockCapsule.BlockId b0 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); + be0.setBlockId(b0); + be0.setParentId(b0); + be0.setSolidId(new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 100)); + BlockEventCache.init(b0); + BlockEventCache.add(be0); + solidEventService.work(); + BlockEvent be1 = new BlockEvent(); BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); be1.setBlockId(b1); From 7a5ae39a3eaedcf54f628c47de8d275d7fcb253a Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 4 Mar 2025 12:45:29 +0800 Subject: [PATCH 074/107] func(cfg): parameters should have a higher priority on the command line than in the configuration file --- .../src/main/java/org/tron/core/config/args/Args.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 45fedbb3906..aebff31e95d 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -915,15 +915,18 @@ public static void setParam(final Config config) { PARAMETER.vmTrace = config.hasPath(Constant.VM_TRACE) && config.getBoolean(Constant.VM_TRACE); - if (config.hasPath(Constant.VM_SAVE_INTERNAL_TX)) { + if (!PARAMETER.saveInternalTx + && config.hasPath(Constant.VM_SAVE_INTERNAL_TX)) { PARAMETER.saveInternalTx = config.getBoolean(Constant.VM_SAVE_INTERNAL_TX); } - if (config.hasPath(Constant.VM_SAVE_FEATURED_INTERNAL_TX)) { + if (!PARAMETER.saveFeaturedInternalTx + && config.hasPath(Constant.VM_SAVE_FEATURED_INTERNAL_TX)) { PARAMETER.saveFeaturedInternalTx = config.getBoolean(Constant.VM_SAVE_FEATURED_INTERNAL_TX); } - if (config.hasPath(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS)) { + if (!PARAMETER.saveCancelAllUnfreezeV2Details + && config.hasPath(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS)) { PARAMETER.saveCancelAllUnfreezeV2Details = config.getBoolean(Constant.VM_SAVE_CANCEL_ALL_UNFREEZE_V2_DETAILS); } From 658a4e22dc69081496913df4ea28dfd304764039 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 4 Mar 2025 16:17:47 +0800 Subject: [PATCH 075/107] feat(event): optimize transaction trigger acquisition --- .../capsule/TransactionLogTriggerCapsule.java | 43 +++++++++++++++-- .../core/services/event/BlockEventGet.java | 47 ++++++++++++++++--- .../services/event/HistoryEventService.java | 2 +- .../TransactionLogTriggerCapsuleTest.java | 42 +++++++++++++++++ .../tron/core/event/BlockEventGetTest.java | 28 +++++++++++ 5 files changed, 152 insertions(+), 10 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index f5d457f541d..efd580a60cd 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -49,6 +49,12 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule this(trxCapsule, blockCapsule, 0, 0, 0, null, 0); } + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, + BlockCapsule blockCapsule, + TransactionInfo transactionInfo) { + this(trxCapsule, blockCapsule, 0, 0, 0, transactionInfo, 0); + } + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount, TransactionInfo transactionInfo, long energyUnitPrice) { @@ -63,7 +69,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule String transactionHash = trxCapsule.getTransactionId().toString(); transactionLogTrigger.setTransactionId(transactionHash); transactionLogTrigger.setTimeStamp(blockCapsule.getTimeStamp()); - transactionLogTrigger.setBlockNumber(trxCapsule.getBlockNum()); + transactionLogTrigger.setBlockNumber(blockCapsule.getNum()); transactionLogTrigger.setData(Hex.toHexString(trxCapsule .getInstance().getRawData().getData().toByteArray())); @@ -281,6 +287,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) { if (Objects.nonNull(transactionInfo) + && EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible() && contractType != null && contractType != CreateSmartContract) { transactionLogTrigger.setContractAddress(null); } else { @@ -294,8 +301,38 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule getInternalTransactionList(programResult.getInternalTransactions())); } + if (Objects.isNull(trxTrace) && Objects.nonNull(transactionInfo)) { + Protocol.ResourceReceipt receipt = transactionInfo.getReceipt(); + energyUsageTotal = receipt.getEnergyUsageTotal(); + transactionLogTrigger.setEnergyFee(receipt.getEnergyFee()); + transactionLogTrigger.setOriginEnergyUsage(receipt.getOriginEnergyUsage()); + transactionLogTrigger.setEnergyUsageTotal(energyUsageTotal); + transactionLogTrigger.setNetUsage(receipt.getNetUsage()); + transactionLogTrigger.setNetFee(receipt.getNetFee()); + transactionLogTrigger.setEnergyUsage(receipt.getEnergyUsage()); + + if (transactionInfo.getContractResultCount() > 0) { + ByteString contractResult = transactionInfo.getContractResult(0); + if (Objects.nonNull(contractResult) && contractResult.size() > 0) { + transactionLogTrigger.setContractResult(Hex.toHexString(contractResult.toByteArray())); + } + } + + ByteString contractAddress = transactionInfo.getContractAddress(); + if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) { + if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible() + && contractType != null && contractType != CreateSmartContract) { + transactionLogTrigger.setContractAddress(null); + } else { + transactionLogTrigger + .setContractAddress(StringUtil.encode58Check((contractAddress.toByteArray()))); + } + } + } + // process transactionInfo list, only enabled when ethCompatible is true - if (Objects.nonNull(transactionInfo)) { + if (Objects.nonNull(transactionInfo) + && EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { transactionLogTrigger.setTransactionIndex(txIndex); transactionLogTrigger.setCumulativeEnergyUsed(preCumulativeEnergyUsed + energyUsageTotal); transactionLogTrigger.setPreCumulativeLogCount(preCumulativeLogCount); @@ -309,7 +346,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule logPojo.setAddress((log.getAddress() != null) ? Hex.toHexString(log.getAddress().toByteArray()) : ""); logPojo.setBlockHash(blockHash); - logPojo.setBlockNumber(trxCapsule.getBlockNum()); + logPojo.setBlockNumber(blockCapsule.getNum()); logPojo.setData(Hex.toHexString(log.getData().toByteArray())); logPojo.setLogIndex(preCumulativeLogCount + index); diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java index 25fb54bce8c..8733faaa1c4 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java @@ -322,12 +322,7 @@ public List getTransactionLogTrigger(BlockCapsule long solidNum) { List transactionLogTriggerCapsules = new ArrayList<>(); if (!EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { - for (TransactionCapsule t : block.getTransactions()) { - TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(t, block); - trx.setLatestSolidifiedBlockNumber(solidNum); - transactionLogTriggerCapsules.add(trx); - } - return transactionLogTriggerCapsules; + return getTransactionTriggers(block, solidNum); } List transactionCapsuleList = block.getTransactions(); GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI @@ -389,4 +384,44 @@ public long getEnergyPrice(long blockTime) { } return energyPrice; } + + public List getTransactionTriggers(BlockCapsule block, + long solidNum) { + List list = new ArrayList<>(); + if (block.getTransactions().size() == 0) { + return list; + } + GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI + .TransactionInfoList.newBuilder().build(); + GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI + .TransactionInfoList.newBuilder(); + try { + TransactionRetCapsule result = manager.getChainBaseManager().getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(block.getNum())); + if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { + result.getInstance().getTransactioninfoList() + .forEach(transactionInfoListBuilder::addTransactionInfo); + transactionInfoList = transactionInfoListBuilder.build(); + } + } catch (Exception e) { + logger.warn("Get TransactionInfo failed, blockNum {}, {}.", block.getNum(), e.getMessage()); + } + + if (block.getTransactions().size() != transactionInfoList.getTransactionInfoCount()) { + for (TransactionCapsule t : block.getTransactions()) { + TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule(t, block); + triggerCapsule.setLatestSolidifiedBlockNumber(solidNum); + list.add(triggerCapsule); + } + } else { + for (int i = 0; i < transactionInfoList.getTransactionInfoCount(); i++) { + TransactionLogTriggerCapsule triggerCapsule = new TransactionLogTriggerCapsule( + block.getTransactions().get(i), block, transactionInfoList.getTransactionInfo(i)); + triggerCapsule.setLatestSolidifiedBlockNumber(solidNum); + list.add(triggerCapsule); + } + } + + return list; + } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java index 73422944f08..fb202734b22 100644 --- a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -39,7 +39,7 @@ public void init() { isRunning = true; - new Thread(() -> syncEvent()).start(); + new Thread(() -> syncEvent(), "history-event").start(); logger.info("History event service start."); } diff --git a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java index a2487ac470b..ce0f63ef7a4 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/TransactionLogTriggerCapsuleTest.java @@ -4,11 +4,13 @@ import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; import com.google.protobuf.ByteString; +import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; import org.tron.common.utils.Sha256Hash; +import org.tron.common.utils.StringUtil; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.p2p.utils.ByteArray; @@ -242,6 +244,46 @@ public void testConstructorWithCreateSmartContract() { Assert.assertNotNull(triggerCapsule.getTransactionLogTrigger().getFromAddress()); } + @Test + public void testConstructorWithCreateTransactionInfo() { + Protocol.TransactionInfo.Builder infoBuild = Protocol.TransactionInfo.newBuilder(); + + Protocol.ResourceReceipt.Builder resourceBuild = Protocol.ResourceReceipt.newBuilder(); + resourceBuild.setEnergyFee(1); + resourceBuild.setEnergyUsageTotal(2); + resourceBuild.setEnergyUsage(3); + resourceBuild.setOriginEnergyUsage(4); + resourceBuild.setNetFee(5); + resourceBuild.setNetUsage(6); + + infoBuild + .setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS))) + .addContractResult(ByteString.copyFrom(ByteArray.fromHexString("112233"))) + .setReceipt(resourceBuild.build()); + + SmartContractOuterClass.CreateSmartContract.Builder builder2 = + SmartContractOuterClass.CreateSmartContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))); + TransactionCapsule tc = new TransactionCapsule(builder2.build(), + Protocol.Transaction.Contract.ContractType.CreateSmartContract); + BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH, + System.currentTimeMillis(), Sha256Hash.ZERO_HASH.getByteString()); + + + TransactionLogTriggerCapsule trigger = + new TransactionLogTriggerCapsule(tc, bc, infoBuild.build()); + + Assert.assertEquals(1, trigger.getTransactionLogTrigger().getEnergyFee()); + Assert.assertEquals(2, trigger.getTransactionLogTrigger().getEnergyUsageTotal()); + Assert.assertEquals(3, trigger.getTransactionLogTrigger().getEnergyUsage()); + Assert.assertEquals(4, trigger.getTransactionLogTrigger().getOriginEnergyUsage()); + Assert.assertEquals(5, trigger.getTransactionLogTrigger().getNetFee()); + Assert.assertEquals(6, trigger.getTransactionLogTrigger().getNetUsage()); + + Assert.assertEquals(StringUtil.encode58Check(Hex.decode(CONTRACT_ADDRESS)), + trigger.getTransactionLogTrigger().getContractAddress()); + Assert.assertEquals("112233", trigger.getTransactionLogTrigger().getContractResult()); + } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java index db959d9a0fd..fb10f261482 100644 --- a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java +++ b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java @@ -6,6 +6,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import lombok.extern.slf4j.Slf4j; import org.junit.After; @@ -18,9 +19,11 @@ import org.tron.common.logsfilter.EventPluginConfig; import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.logsfilter.TriggerConfig; +import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.PublicMethod; +import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; @@ -182,4 +185,29 @@ public void test() throws Exception { Assert.fail(); } } + + @Test + public void getTransactionTriggers() { + BlockEventGet blockEventGet = new BlockEventGet(); + BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH, + 100, Sha256Hash.ZERO_HASH.getByteString()); + + List list = blockEventGet.getTransactionTriggers(bc, 1); + Assert.assertEquals(0, list.size()); + + List transactionList = new ArrayList<>(); + + Protocol.Transaction.raw rw = Protocol.Transaction.raw.newBuilder() + .addContract(Protocol.Transaction.Contract.newBuilder().build()).build(); + + Protocol.Transaction transaction = Protocol.Transaction.newBuilder().setRawData(rw).build(); + + transactionList.add(transaction); + + bc = new BlockCapsule(100, ByteString.empty(), 1, transactionList); + + list = blockEventGet.getTransactionTriggers(bc, 1); + Assert.assertEquals(1, list.size()); + Assert.assertEquals(100, list.get(0).getTransactionLogTrigger().getTimeStamp()); + } } \ No newline at end of file From 67c4a09842d513ab653647dde0f697583b010789 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 4 Mar 2025 15:51:38 +0800 Subject: [PATCH 076/107] feat(service): exit when services init failed 1. init logback xml 2. init event plugin 3. init prometheus 4. init p2p service 5. init zksnark --- .../java/org/tron/common/log/LogService.java | 26 ++++++++++ .../org/tron/common/prometheus/Metrics.java | 7 ++- .../org/tron/core/exception/TronError.java | 5 ++ .../main/java/org/tron/core/db/Manager.java | 5 +- .../org/tron/core/net/TronNetService.java | 3 +- .../org/tron/core/zen/ZksnarkInitService.java | 3 +- .../main/java/org/tron/program/FullNode.java | 24 +--------- .../tron/core/db/TransactionExpireTest.java | 1 + .../tron/core/exception/TronErrorTest.java | 48 +++++++++++++++++++ .../core/services/RpcApiServicesTest.java | 1 + .../filter/HttpApiAccessFilterTest.java | 1 + .../LiteFnQueryGrpcInterceptorTest.java | 1 + .../filter/LiteFnQueryHttpFilterTest.java | 1 + .../filter/RpcApiAccessInterceptorTest.java | 1 + .../http/TriggerSmartContractServletTest.java | 1 + 15 files changed, 98 insertions(+), 30 deletions(-) create mode 100644 common/src/main/java/org/tron/common/log/LogService.java diff --git a/common/src/main/java/org/tron/common/log/LogService.java b/common/src/main/java/org/tron/common/log/LogService.java new file mode 100644 index 00000000000..801e13f54f7 --- /dev/null +++ b/common/src/main/java/org/tron/common/log/LogService.java @@ -0,0 +1,26 @@ +package org.tron.common.log; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import java.io.File; +import org.slf4j.LoggerFactory; +import org.tron.core.exception.TronError; + +public class LogService { + + public static void load(String path) { + try { + File file = new File(path); + if (!file.exists() || !file.isFile() || !file.canRead()) { + return; + } + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(lc); + lc.reset(); + configurator.doConfigure(file); + } catch (Exception e) { + throw new TronError(e, TronError.ErrCode.LOG_LOAD); + } + } +} diff --git a/common/src/main/java/org/tron/common/prometheus/Metrics.java b/common/src/main/java/org/tron/common/prometheus/Metrics.java index 3f37cf331aa..6774dd7c315 100644 --- a/common/src/main/java/org/tron/common/prometheus/Metrics.java +++ b/common/src/main/java/org/tron/common/prometheus/Metrics.java @@ -5,9 +5,9 @@ import io.prometheus.client.Histogram; import io.prometheus.client.exporter.HTTPServer; import io.prometheus.client.hotspot.DefaultExports; -import java.io.IOException; import lombok.extern.slf4j.Slf4j; import org.tron.common.parameter.CommonParameter; +import org.tron.core.exception.TronError; @Slf4j(topic = "metrics") public class Metrics { @@ -32,9 +32,8 @@ public static synchronized void init() { new HTTPServer.Builder().withPort(port).build(); logger.info("prometheus exposed on port : {}", port); initialized = true; - } catch (IOException e) { - CommonParameter.getInstance().setMetricsPrometheusEnable(false); - logger.error("{}", e.getMessage()); + } catch (Exception e) { + throw new TronError(e, TronError.ErrCode.PROMETHEUS_INIT); } } } diff --git a/common/src/main/java/org/tron/core/exception/TronError.java b/common/src/main/java/org/tron/core/exception/TronError.java index c7ddfc38bad..8946a6528b3 100644 --- a/common/src/main/java/org/tron/core/exception/TronError.java +++ b/common/src/main/java/org/tron/core/exception/TronError.java @@ -40,6 +40,11 @@ public enum ErrCode { EVENT_SUBSCRIBE_ERROR(1), AUTO_STOP_PARAMS(1), API_SERVER_INIT(1), + EVENT_SUBSCRIBE_INIT(1), + PROMETHEUS_INIT(1), + TRON_NET_SERVICE_INIT(1), + ZCASH_INIT(1), + LOG_LOAD(1), SOLID_NODE_INIT(0); private final int code; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 9b7bbf65621..3635f38d9ad 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -137,6 +137,7 @@ import org.tron.core.metrics.MetricsUtil; import org.tron.core.service.MortgageService; import org.tron.core.service.RewardViCalService; +import org.tron.core.services.event.exception.EventException; import org.tron.core.store.AccountAssetStore; import org.tron.core.store.AccountIdIndexStore; import org.tron.core.store.AccountIndexStore; @@ -2098,7 +2099,7 @@ private void startEventSubscribing() { .start(Args.getInstance().getEventPluginConfig()); if (!eventPluginLoaded) { - logger.error("Failed to load eventPlugin."); + throw new EventException("Failed to load eventPlugin."); } FilterQuery eventFilter = Args.getInstance().getEventFilter(); @@ -2107,7 +2108,7 @@ private void startEventSubscribing() { } } catch (Exception e) { - logger.error("{}", e); + throw new TronError(e, TronError.ErrCode.EVENT_SUBSCRIBE_INIT); } } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 5b99f94c0db..8b97c8d9f4d 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -15,6 +15,7 @@ import org.tron.common.overlay.message.Message; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; +import org.tron.core.exception.TronError; import org.tron.core.net.message.adv.TransactionMessage; import org.tron.core.net.messagehandler.TransactionsMsgHandler; import org.tron.core.net.peer.PeerConnection; @@ -102,7 +103,7 @@ public void start() { effectiveCheckService.init(); logger.info("Net service start successfully"); } catch (Exception e) { - logger.error("Net service start failed", e); + throw new TronError(e, TronError.ErrCode.TRON_NET_SERVICE_INIT); } } diff --git a/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java b/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java index 04405dfc758..a1f812426f7 100644 --- a/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java +++ b/framework/src/main/java/org/tron/core/zen/ZksnarkInitService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Component; import org.tron.common.zksnark.JLibrustzcash; import org.tron.common.zksnark.LibrustzcashParam; +import org.tron.core.exception.TronError; import org.tron.core.exception.ZksnarkException; @Slf4j(topic = "API") @@ -40,7 +41,7 @@ public static void librustzcashInitZksnarkParams() { JLibrustzcash.librustzcashInitZksnarkParams( new LibrustzcashParam.InitZksnarkParams(spendPath, spendHash, outputPath, outputHash)); } catch (ZksnarkException e) { - logger.error("librustzcashInitZksnarkParams fail!", e); + throw new TronError(e, TronError.ErrCode.ZCASH_INIT); } logger.info("init zk param done"); } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 7fc72e6ba88..ef23d20ce52 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -1,16 +1,13 @@ package org.tron.program; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; import com.beust.jcommander.JCommander; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.exit.ExitManager; +import org.tron.common.log.LogService; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.Metrics; import org.tron.core.Constant; @@ -20,23 +17,6 @@ @Slf4j(topic = "app") public class FullNode { - - public static void load(String path) { - try { - File file = new File(path); - if (!file.exists() || !file.isFile() || !file.canRead()) { - return; - } - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(lc); - lc.reset(); - configurator.doConfigure(file); - } catch (Exception e) { - logger.error(e.getMessage()); - } - } - /** * Start the FullNode. */ @@ -46,7 +26,7 @@ public static void main(String[] args) { Args.setParam(args, Constant.TESTNET_CONF); CommonParameter parameter = Args.getInstance(); - load(parameter.getLogbackPath()); + LogService.load(parameter.getLogbackPath()); if (parameter.isHelp()) { JCommander jCommander = JCommander.newBuilder().addObject(Args.PARAMETER).build(); diff --git a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java index 5193f4128cd..420b54525e4 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java @@ -46,6 +46,7 @@ public void init() throws IOException { Args.setParam(new String[] {"--output-directory", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); CommonParameter.PARAMETER.setMinEffectiveConnection(0); + CommonParameter.getInstance().setP2pDisable(true); context = new TronApplicationContext(DefaultConfig.class); wallet = context.getBean(Wallet.class); diff --git a/framework/src/test/java/org/tron/core/exception/TronErrorTest.java b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java index 0ec1bcca349..3176a62f56c 100644 --- a/framework/src/test/java/org/tron/core/exception/TronErrorTest.java +++ b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java @@ -1,10 +1,36 @@ package org.tron.core.exception; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mockStatic; + +import java.io.IOException; +import java.nio.file.Path; +import org.junit.After; import org.junit.Assert; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.tron.common.log.LogService; +import org.tron.common.zksnark.JLibrustzcash; +import org.tron.core.zen.ZksnarkInitService; +@RunWith(MockitoJUnitRunner.class) public class TronErrorTest { + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @After + public void clearMocks() { + Mockito.clearAllCaches(); + } + @Test public void testTronError() { TronError tronError = new TronError("message", TronError.ErrCode.WITNESS_KEYSTORE_LOAD); @@ -16,4 +42,26 @@ public void testTronError() { tronError = new TronError(new Throwable(), TronError.ErrCode.LEVELDB_INIT); Assert.assertEquals(tronError.getErrCode(), TronError.ErrCode.LEVELDB_INIT); } + + @Test + public void ZksnarkInitTest() { + try (MockedStatic mock = mockStatic(JLibrustzcash.class)) { + mock.when(JLibrustzcash::isOpenZen).thenReturn(true); + mock.when(() -> JLibrustzcash.librustzcashInitZksnarkParams(any())) + .thenAnswer(invocation -> { + throw new ZksnarkException("Zksnark init failed"); + }); + TronError thrown = assertThrows(TronError.class, + ZksnarkInitService::librustzcashInitZksnarkParams); + assertEquals(TronError.ErrCode.ZCASH_INIT, thrown.getErrCode()); + } + } + + @Test + public void LogLoadTest() throws IOException { + LogService.load("non-existent.xml"); + Path path = temporaryFolder.newFile("logback.xml").toPath(); + TronError thrown = assertThrows(TronError.class, () -> LogService.load(path.toString())); + assertEquals(TronError.ErrCode.LOG_LOAD, thrown.getErrCode()); + } } diff --git a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java index 7179215393f..3ae090d3caf 100644 --- a/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java +++ b/framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java @@ -143,6 +143,7 @@ public static void init() throws IOException { getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); getInstance().setMetricsPrometheusPort(PublicMethod.chooseRandomPort()); getInstance().setMetricsPrometheusEnable(true); + getInstance().setP2pDisable(true); String fullNode = String.format("%s:%d", getInstance().getNodeLanIp(), getInstance().getRpcPort()); String solidityNode = String.format("%s:%d", getInstance().getNodeLanIp(), diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java index 9484155a0b7..420d890aa48 100644 --- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -45,6 +45,7 @@ public class HttpApiAccessFilterTest extends BaseTest { Args.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); Args.getInstance().setSolidityNodeHttpEnable(true); Args.getInstance().setSolidityHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setP2pDisable(true); } @Test diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java index c5c7185b6d8..84869ea0750 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java @@ -61,6 +61,7 @@ public static void init() throws IOException { Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); Args.getInstance().setRpcPBFTEnable(true); Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setP2pDisable(true); String fullnode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), Args.getInstance().getRpcPort()); String solidityNode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index a9068c228b6..0f0bdf1eb1f 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -44,6 +44,7 @@ public class LiteFnQueryHttpFilterTest extends BaseTest { Args.getInstance().setJsonRpcHttpFullNodeEnable(false); Args.getInstance().setJsonRpcHttpSolidityNodeEnable(false); Args.getInstance().setJsonRpcHttpPBFTNodeEnable(false); + Args.getInstance().setP2pDisable(true); } /** diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java index 5845a89c2e4..900ca304e7d 100644 --- a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -62,6 +62,7 @@ public static void init() throws IOException { Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); Args.getInstance().setRpcPBFTEnable(true); Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setP2pDisable(true); String fullNode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), Args.getInstance().getRpcPort()); String solidityNode = String.format("%s:%d", Args.getInstance().getNodeLanIp(), diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index e9cd9cb1f26..4cbb729a787 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -35,6 +35,7 @@ public static void init() throws Exception { Args.getInstance().needSyncCheck = false; Args.getInstance().setFullNodeHttpEnable(true); Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setP2pDisable(true); httpNode = String.format("%s:%d", "127.0.0.1", Args.getInstance().getFullNodeHttpPort()); } From 300d3ac381fa2ec28590a454623a32645f9fde93 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 6 Mar 2025 22:18:11 +0800 Subject: [PATCH 077/107] feat(build): add implicit_dependency for build Task ':xxx' uses this output of task ':xxx' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. --- chainbase/build.gradle | 1 + framework/build.gradle | 4 ++++ plugins/build.gradle | 2 +- protocol/build.gradle | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/chainbase/build.gradle b/chainbase/build.gradle index 0fb98629856..bc82d9496c3 100644 --- a/chainbase/build.gradle +++ b/chainbase/build.gradle @@ -41,6 +41,7 @@ test { } jacocoTestReport { + dependsOn(processResources) // explicit_dependency reports { xml.enabled = true html.enabled = true diff --git a/framework/build.gradle b/framework/build.gradle index fb4f2278294..0f04685f2d8 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -156,6 +156,10 @@ def binaryRelease(taskName, jarName, mainClass) { include "/**" } + // explicit_dependency + dependsOn (project(':actuator').jar, project(':consensus').jar, project(':chainbase').jar, + project(':crypto').jar, project(':common').jar, project(':protocol').jar) + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) diff --git a/plugins/build.gradle b/plugins/build.gradle index 03ac6d84150..01afaa01708 100644 --- a/plugins/build.gradle +++ b/plugins/build.gradle @@ -94,7 +94,7 @@ def binaryRelease(taskName, jarName, mainClass) { from(sourceSets.main.output) { include "/**" } - + dependsOn project(':protocol').jar // explicit_dependency from { configurations.runtimeClasspath.collect { // https://docs.gradle.org/current/userguide/upgrading_version_6.html#changes_6.3 it.isDirectory() ? it : zipTree(it) diff --git a/protocol/build.gradle b/protocol/build.gradle index 02158f9fdd4..535fac43a65 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -66,3 +66,4 @@ clean.doFirst { delete "src/main/java" } +processResources.dependsOn(generateProto) // explicit_dependency From 09c803ffc32dc52f87f81d5d7b39ee01b3ec2d38 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 7 Mar 2025 12:48:16 +0800 Subject: [PATCH 078/107] add getTransactionTriggers unit test --- .../capsule/TransactionLogTriggerCapsule.java | 20 ++++-- .../core/services/event/BlockEventGet.java | 4 +- .../tron/core/event/BlockEventGetTest.java | 69 ++++++++++++++++++- 3 files changed, 85 insertions(+), 8 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index efd580a60cd..ace19060b1f 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -6,7 +6,9 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import lombok.Getter; import lombok.Setter; @@ -50,14 +52,20 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule } public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, - BlockCapsule blockCapsule, - TransactionInfo transactionInfo) { - this(trxCapsule, blockCapsule, 0, 0, 0, transactionInfo, 0); + BlockCapsule blockCapsule, TransactionInfo transactionInfo) { + this(trxCapsule, blockCapsule, 0, 0, 0, transactionInfo, 0, true); } public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount, TransactionInfo transactionInfo, long energyUnitPrice) { + this(trxCapsule, blockCapsule, txIndex, preCumulativeEnergyUsed, preCumulativeLogCount, + transactionInfo, energyUnitPrice, false); + } + + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, + int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount, + TransactionInfo transactionInfo, long energyUnitPrice, boolean flag) { transactionLogTrigger = new TransactionLogTrigger(); String blockHash = ""; @@ -69,7 +77,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule String transactionHash = trxCapsule.getTransactionId().toString(); transactionLogTrigger.setTransactionId(transactionHash); transactionLogTrigger.setTimeStamp(blockCapsule.getTimeStamp()); - transactionLogTrigger.setBlockNumber(blockCapsule.getNum()); + transactionLogTrigger.setBlockNumber(trxCapsule.getBlockNum()); transactionLogTrigger.setData(Hex.toHexString(trxCapsule .getInstance().getRawData().getData().toByteArray())); @@ -301,7 +309,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule getInternalTransactionList(programResult.getInternalTransactions())); } - if (Objects.isNull(trxTrace) && Objects.nonNull(transactionInfo)) { + if (Objects.isNull(trxTrace) && Objects.nonNull(transactionInfo) && flag) { Protocol.ResourceReceipt receipt = transactionInfo.getReceipt(); energyUsageTotal = receipt.getEnergyUsageTotal(); transactionLogTrigger.setEnergyFee(receipt.getEnergyFee()); @@ -346,7 +354,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule logPojo.setAddress((log.getAddress() != null) ? Hex.toHexString(log.getAddress().toByteArray()) : ""); logPojo.setBlockHash(blockHash); - logPojo.setBlockNumber(blockCapsule.getNum()); + logPojo.setBlockNumber(trxCapsule.getBlockNum()); logPojo.setData(Hex.toHexString(log.getData().toByteArray())); logPojo.setLogIndex(preCumulativeLogCount + index); diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java index 8733faaa1c4..fd34a1fe50f 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java @@ -54,6 +54,7 @@ public class BlockEventGet { public BlockEvent getBlockEvent(long blockNum) throws Exception { BlockCapsule block = manager.getChainBaseManager().getBlockByNum(blockNum); + block.getTransactions().forEach(t -> t.setBlockNum(block.getNum())); long solidNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); BlockEvent blockEvent = new BlockEvent(); blockEvent.setBlockId(block.getBlockId()); @@ -359,7 +360,7 @@ public List getTransactionLogTrigger(BlockCapsule TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); transactionCapsule.setBlockNum(block.getNum()); TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(transactionCapsule, block, - i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); + i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice, true); trx.setLatestSolidifiedBlockNumber(solidNum); cumulativeEnergyUsed += trx.getTransactionLogTrigger().getEnergyUsageTotal(); cumulativeLogCount += transactionInfo.getLogCount(); @@ -391,6 +392,7 @@ public List getTransactionTriggers(BlockCapsule bl if (block.getTransactions().size() == 0) { return list; } + GrpcAPI.TransactionInfoList transactionInfoList = GrpcAPI .TransactionInfoList.newBuilder().build(); GrpcAPI.TransactionInfoList.Builder transactionInfoListBuilder = GrpcAPI diff --git a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java index fb10f261482..14479566815 100644 --- a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java +++ b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java @@ -1,5 +1,7 @@ package org.tron.core.event; +import static org.mockito.Mockito.mock; + import com.google.protobuf.ByteString; import java.io.IOException; import java.time.LocalDateTime; @@ -15,6 +17,7 @@ import org.junit.ClassRule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.mockito.Mockito; import org.tron.common.application.TronApplicationContext; import org.tron.common.logsfilter.EventPluginConfig; import org.tron.common.logsfilter.EventPluginLoader; @@ -23,11 +26,13 @@ import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.PublicMethod; +import org.tron.common.utils.ReflectUtils; import org.tron.common.utils.Sha256Hash; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionRetCapsule; import org.tron.core.capsule.WitnessCapsule; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @@ -38,6 +43,7 @@ import org.tron.core.services.event.BlockEventGet; import org.tron.core.services.event.bo.BlockEvent; import org.tron.core.store.DynamicPropertiesStore; +import org.tron.core.store.TransactionRetStore; import org.tron.protos.Protocol; @Slf4j @@ -187,7 +193,7 @@ public void test() throws Exception { } @Test - public void getTransactionTriggers() { + public void getTransactionTriggers() throws Exception { BlockEventGet blockEventGet = new BlockEventGet(); BlockCapsule bc = new BlockCapsule(1, Sha256Hash.ZERO_HASH, 100, Sha256Hash.ZERO_HASH.getByteString()); @@ -209,5 +215,66 @@ public void getTransactionTriggers() { list = blockEventGet.getTransactionTriggers(bc, 1); Assert.assertEquals(1, list.size()); Assert.assertEquals(100, list.get(0).getTransactionLogTrigger().getTimeStamp()); + + Protocol.TransactionInfo.Builder infoBuild = Protocol.TransactionInfo.newBuilder(); + + Protocol.ResourceReceipt.Builder resourceBuild = Protocol.ResourceReceipt.newBuilder(); + resourceBuild.setEnergyFee(1); + resourceBuild.setEnergyUsageTotal(2); + resourceBuild.setEnergyUsage(3); + resourceBuild.setOriginEnergyUsage(4); + resourceBuild.setNetFee(5); + resourceBuild.setNetUsage(6); + + String address = "A0B4750E2CD76E19DCA331BF5D089B71C3C2798548"; + infoBuild + .setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(address))) + .addContractResult(ByteString.copyFrom(ByteArray.fromHexString("112233"))) + .setReceipt(resourceBuild.build()); + + Manager manager = mock(Manager.class); + ReflectUtils.setFieldValue(blockEventGet, "manager", manager); + + ChainBaseManager chainBaseManager = mock(ChainBaseManager.class); + Mockito.when(manager.getChainBaseManager()).thenReturn(chainBaseManager); + + TransactionRetStore transactionRetStore = mock(TransactionRetStore.class); + Mockito.when(chainBaseManager.getTransactionRetStore()).thenReturn(transactionRetStore); + + Protocol.TransactionRet transactionRet = Protocol.TransactionRet.newBuilder() + .addTransactioninfo(infoBuild.build()).build(); + + TransactionRetCapsule result = new TransactionRetCapsule(transactionRet.toByteArray()); + + Mockito.when(transactionRetStore.getTransactionInfoByBlockNum(ByteArray.fromLong(0))) + .thenReturn(result); + + Protocol.Block block = Protocol.Block.newBuilder() + .addTransactions(transaction).build(); + + BlockCapsule blockCapsule = new BlockCapsule(block); + blockCapsule.getTransactions().forEach(t -> t.setBlockNum(blockCapsule.getNum())); + + list = blockEventGet.getTransactionTriggers(blockCapsule, 1); + + Assert.assertEquals(1, list.size()); + Assert.assertEquals(1, + list.get(0).getTransactionLogTrigger().getLatestSolidifiedBlockNumber()); + Assert.assertEquals(0, + list.get(0).getTransactionLogTrigger().getBlockNumber()); + Assert.assertEquals(2, + list.get(0).getTransactionLogTrigger().getEnergyUsageTotal()); + + Mockito.when(transactionRetStore.getTransactionInfoByBlockNum(ByteArray.fromLong(0))) + .thenReturn(null); + list = blockEventGet.getTransactionTriggers(blockCapsule, 1); + Assert.assertEquals(1, list.size()); + Assert.assertEquals(1, + list.get(0).getTransactionLogTrigger().getLatestSolidifiedBlockNumber()); + Assert.assertEquals(0, + list.get(0).getTransactionLogTrigger().getBlockNumber()); + Assert.assertEquals(0, + list.get(0).getTransactionLogTrigger().getEnergyUsageTotal()); } + } \ No newline at end of file From bfb11973d89ab3dce8c72b5885ebe780891e0369 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 7 Mar 2025 16:40:00 +0800 Subject: [PATCH 079/107] optimize event service close logic --- .../org/tron/core/services/event/BlockEventLoad.java | 11 ++++++++--- .../org/tron/core/services/event/EventService.java | 8 ++++++-- .../core/services/event/RealtimeEventService.java | 3 ++- .../tron/core/services/event/SolidEventService.java | 3 ++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java index bebe3bcbc60..382973ccfa5 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java @@ -42,11 +42,16 @@ public void init() { } public void close() { - executor.shutdown(); - logger.info("Event load service close."); + try { + load(); + executor.shutdown(); + logger.info("Event load service close."); + } catch (Exception e) { + logger.warn("Stop event load service fail. {}", e.getMessage()); + } } - public void load() throws Exception { + public synchronized void load() throws Exception { long cacheHeadNum = BlockEventCache.getHead().getBlockId().getNum(); long tmpNum = manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); if (cacheHeadNum >= tmpNum) { diff --git a/framework/src/main/java/org/tron/core/services/event/EventService.java b/framework/src/main/java/org/tron/core/services/event/EventService.java index b2e01ab3a9d..0dc61a7809c 100644 --- a/framework/src/main/java/org/tron/core/services/event/EventService.java +++ b/framework/src/main/java/org/tron/core/services/event/EventService.java @@ -18,6 +18,9 @@ public class EventService { @Autowired private HistoryEventService historyEventService; + @Autowired + private SolidEventService solidEventService; + @Autowired private Manager manager; @@ -54,8 +57,9 @@ public void init() { } public void close() { - realtimeEventService.close(); - blockEventLoad.close(); historyEventService.close(); + blockEventLoad.close(); + realtimeEventService.close(); + solidEventService.close(); } } diff --git a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java index 0f46115bc5a..02dc3aab364 100644 --- a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java @@ -45,6 +45,7 @@ public void init() { } public void close() { + work(); executor.shutdown(); logger.info("Realtime event service close."); } @@ -57,7 +58,7 @@ public void add(Event event) { queue.offer(event); } - public void work() { + public synchronized void work() { while (queue.size() > 0) { Event event = queue.poll(); flush(event.getBlockEvent(), event.isRemove()); diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java index e67a1618ce1..a27c5bf7ab8 100644 --- a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -37,11 +37,12 @@ public void init() { } public void close() { + work(); executor.shutdown(); logger.info("Solid event service close."); } - public void work() { + public synchronized void work() { BlockCapsule.BlockId solidId = BlockEventCache.getSolidId(); if (solidId.getNum() <= BlockEventCache.getSolidNum()) { return; From c8195ca55838c24012eea6841c4d32be9a342e13 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 7 Mar 2025 17:44:26 +0800 Subject: [PATCH 080/107] fix EventServiceTest unit test --- .../java/org/tron/common/application/ApplicationImpl.java | 2 +- .../test/java/org/tron/core/event/EventServiceTest.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index ffb70722822..2c41bedffb7 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -52,11 +52,11 @@ public void startup() { @Override public void shutdown() { this.shutdownServices(); - eventService.close(); if (!Args.getInstance().isSolidityNode() && (!Args.getInstance().p2pDisable)) { tronNetService.close(); } consensusService.stop(); + eventService.close(); dbManager.close(); shutdown.countDown(); } diff --git a/framework/src/test/java/org/tron/core/event/EventServiceTest.java b/framework/src/test/java/org/tron/core/event/EventServiceTest.java index b20e33404fd..373bfe7d3ec 100644 --- a/framework/src/test/java/org/tron/core/event/EventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/EventServiceTest.java @@ -5,22 +5,30 @@ import org.junit.Test; import org.mockito.Mockito; import org.tron.common.utils.ReflectUtils; +import org.tron.core.capsule.BlockCapsule; import org.tron.core.db.Manager; +import org.tron.core.services.event.BlockEventCache; import org.tron.core.services.event.BlockEventLoad; import org.tron.core.services.event.EventService; import org.tron.core.services.event.HistoryEventService; import org.tron.core.services.event.RealtimeEventService; +import org.tron.core.services.event.SolidEventService; public class EventServiceTest { @Test public void test() { + BlockCapsule.BlockId b1 = new BlockCapsule.BlockId(BlockEventCacheTest.getBlockId(), 1); + BlockEventCache.init(b1); + EventService eventService = new EventService(); HistoryEventService historyEventService = new HistoryEventService(); RealtimeEventService realtimeEventService = new RealtimeEventService(); + SolidEventService solidEventService = new SolidEventService(); BlockEventLoad blockEventLoad = new BlockEventLoad(); ReflectUtils.setFieldValue(eventService, "historyEventService", historyEventService); + ReflectUtils.setFieldValue(eventService, "solidEventService", solidEventService); ReflectUtils.setFieldValue(eventService, "realtimeEventService", realtimeEventService); ReflectUtils.setFieldValue(eventService, "blockEventLoad", blockEventLoad); From d56502f87bdc07e6508b0fa90b666ac15681d5db Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 7 Mar 2025 18:51:41 +0800 Subject: [PATCH 081/107] fix unit test when process exit --- .../tron/core/services/event/RealtimeEventService.java | 10 +++++++--- .../tron/core/services/event/SolidEventService.java | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java index 02dc3aab364..093594f1c95 100644 --- a/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/RealtimeEventService.java @@ -45,9 +45,13 @@ public void init() { } public void close() { - work(); - executor.shutdown(); - logger.info("Realtime event service close."); + try { + work(); + executor.shutdown(); + logger.info("Realtime event service close."); + } catch (Exception e) { + logger.warn("Close realtime event service fail. {}", e.getMessage()); + } } public void add(Event event) { diff --git a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java index a27c5bf7ab8..6102a87f892 100644 --- a/framework/src/main/java/org/tron/core/services/event/SolidEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/SolidEventService.java @@ -37,9 +37,13 @@ public void init() { } public void close() { - work(); - executor.shutdown(); - logger.info("Solid event service close."); + try { + work(); + executor.shutdown(); + logger.info("Solid event service close."); + } catch (Exception e) { + logger.warn("Close solid event service fail. {}", e.getMessage()); + } } public synchronized void work() { From a30a3b72c7a46ea92d7c5f5a53959e1096afd1ae Mon Sep 17 00:00:00 2001 From: Liulei Date: Mon, 10 Mar 2025 17:07:15 +0800 Subject: [PATCH 082/107] feat(tvm): add blob opcodes add kzg point evaluation precompile contract --- .../src/main/java/org/tron/core/vm/Op.java | 4 + .../org/tron/core/vm/OperationActions.java | 10 + .../org/tron/core/vm/OperationRegistry.java | 12 + .../tron/core/vm/PrecompiledContracts.java | 54 ++++ .../java/ethereum/ckzg4844/CKZG4844JNI.java | 257 ++++++++++++++++++ .../java/ethereum/ckzg4844/CKZGException.java | 45 +++ .../ethereum/ckzg4844/CellsAndProofs.java | 23 ++ .../java/ethereum/ckzg4844/ProofAndY.java | 23 ++ .../lib/aarch64/libckzg4844jni.dylib | Bin 0 -> 259496 bytes .../resources/lib/aarch64/libckzg4844jni.so | Bin 0 -> 251848 bytes .../main/resources/lib/amd64/ckzg4844jni.dll | Bin 0 -> 288032 bytes .../resources/lib/amd64/libckzg4844jni.so | Bin 0 -> 293960 bytes .../resources/lib/x86_64/libckzg4844jni.dylib | Bin 0 -> 275232 bytes .../zen/KZGPointEvaluationInitService.java | 53 ++++ .../common/runtime/vm/OperationsTest.java | 38 +++ .../runtime/vm/PrecompiledContractsTest.java | 54 ++++ .../core/zksnark/KZGPointEvaluationTest.java | 21 ++ 17 files changed, 594 insertions(+) create mode 100644 crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java create mode 100644 crypto/src/main/java/ethereum/ckzg4844/CKZGException.java create mode 100644 crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java create mode 100644 crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java create mode 100755 crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib create mode 100755 crypto/src/main/resources/lib/aarch64/libckzg4844jni.so create mode 100755 crypto/src/main/resources/lib/amd64/ckzg4844jni.dll create mode 100755 crypto/src/main/resources/lib/amd64/libckzg4844jni.so create mode 100755 crypto/src/main/resources/lib/x86_64/libckzg4844jni.dylib create mode 100644 framework/src/main/java/org/tron/core/zen/KZGPointEvaluationInitService.java create mode 100644 framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java diff --git a/actuator/src/main/java/org/tron/core/vm/Op.java b/actuator/src/main/java/org/tron/core/vm/Op.java index 5125f067d31..f1bc3003d36 100644 --- a/actuator/src/main/java/org/tron/core/vm/Op.java +++ b/actuator/src/main/java/org/tron/core/vm/Op.java @@ -120,6 +120,10 @@ public class Op { public static final int SELFBALANCE = 0x47; // (0x48) Get block's basefee public static final int BASEFEE = 0x48; + // (0x49) Get blob hash + public static final int BLOBAHASH = 0x49; + // (0x4a) Get block's blob basefee + public static final int BLOBBASEFEE = 0x4a; /* Memory, Storage and Flow Operations */ // (0x50) Remove item from stack diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index fa1aedbb5f8..4ace088a6c9 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -677,6 +677,16 @@ public static void mCopyAction(Program program) { program.step(); } + public static void blobHashAction(Program program) { + program.stackPush(DataWord.ZERO()); + program.step(); + } + + public static void blobBaseFeeAction(Program program) { + program.stackPush(DataWord.ZERO()); + program.step(); + } + public static void push0Action(Program program) { program.stackPush(DataWord.ZERO()); program.step(); diff --git a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java index da1c9b38e9e..bc73cfd9aa7 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java @@ -681,5 +681,17 @@ public static void appendCancunOperations(JumpTable table) { EnergyCost::getMCopyCost, OperationActions::mCopyAction, proposal)); + + table.set(new Operation( + Op.BLOBAHASH, 1, 1, + EnergyCost::getVeryLowTierCost, + OperationActions::blobHashAction, + proposal)); + + table.set(new Operation( + Op.BLOBBASEFEE, 0, 1, + EnergyCost::getBaseTierCost, + OperationActions::blobBaseFeeAction, + proposal)); } } diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index b53a196e0b6..a8dbfe1dbf7 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -32,6 +32,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import ethereum.ckzg4844.CKZG4844JNI; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -39,6 +40,7 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; +import org.bouncycastle.util.encoders.Hex; import org.tron.common.crypto.Blake2bfMessageDigest; import org.tron.common.crypto.Hash; import org.tron.common.crypto.SignUtils; @@ -104,6 +106,7 @@ public class PrecompiledContracts { private static final EthRipemd160 ethRipemd160 = new EthRipemd160(); private static final Blake2F blake2F = new Blake2F(); + private static final KZGPointEvaluation kzgPointEvaluation = new KZGPointEvaluation(); // FreezeV2 PrecompileContracts private static final GetChainParameter getChainParameter = new GetChainParameter(); @@ -198,6 +201,9 @@ public class PrecompiledContracts { private static final DataWord blake2FAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000020009"); + private static final DataWord kzgPointEvaluationAddr = new DataWord( + "000000000000000000000000000000000000000000000000000000000002000a"); + public static PrecompiledContract getOptimizedContractForConstant(PrecompiledContract contract) { try { Constructor constructor = contract.getClass().getDeclaredConstructor(); @@ -279,6 +285,9 @@ public static PrecompiledContract getContractForAddress(DataWord address) { if (VMConfig.allowTvmCompatibleEvm() && address.equals(blake2FAddr)) { return blake2F; } + if (VMConfig.allowTvmCancun() && address.equals(kzgPointEvaluationAddr)) { + return kzgPointEvaluation; + } if (VMConfig.allowTvmFreezeV2()) { if (address.equals(getChainParameterAddr)) { @@ -2191,4 +2200,49 @@ public Pair execute(byte[] data) { } } + public static class KZGPointEvaluation extends PrecompiledContract { + + private static final int BLOB_VERIFY_INPUT_LENGTH = 192; + private static final byte BLOB_COMMITMENT_VERSION_KZG = 0x01; + private static final byte[] BLOB_PRECOMPILED_RETURN_VALUE = Hex.decode( + "0000000000000000000000000000000000000000000000000000000000001000" + + "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); + + @Override + public long getEnergyForData(byte[] data) { + return 50000; + } + + @Override + public Pair execute(byte[] data) { + if (data == null || data.length != BLOB_VERIFY_INPUT_LENGTH) { + return Pair.of(false, DataWord.ZERO().getData()); + } + + byte[] versionedHash = parseBytes(data, 0, 32); + byte[] z = parseBytes(data, 32, 32); + byte[] y = parseBytes(data, 64, 32); + byte[] commitment = parseBytes(data, 96, 48); + byte[] proof = parseBytes(data, 144, 48); + + byte[] hash = Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), commitment); + hash[0] = BLOB_COMMITMENT_VERSION_KZG; + if (!Arrays.equals(versionedHash, hash)) { + return Pair.of(false, DataWord.ZERO().getData()); + } + + try { + if (CKZG4844JNI.verifyKzgProof(commitment, z, y, proof)) { + return Pair.of(true, BLOB_PRECOMPILED_RETURN_VALUE); + } else { + return Pair.of(false, DataWord.ZERO().getData()); + } + } catch (RuntimeException exception) { + logger.warn("KZG point evaluation precompile contract failed", exception); + return Pair.of(false, DataWord.ZERO().getData()); + } + } + } + } diff --git a/crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java b/crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java new file mode 100644 index 00000000000..782e8e3710f --- /dev/null +++ b/crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java @@ -0,0 +1,257 @@ +package ethereum.ckzg4844; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +public class CKZG4844JNI { + + private static final String LIBRARY_NAME = "ckzg4844jni"; + private static final String PLATFORM_NATIVE_LIBRARY_NAME = System.mapLibraryName(LIBRARY_NAME); + + /** Loads the appropriate native library based on your platform. */ + public static void loadNativeLibrary() { + String libraryResourcePath = + "/lib/" + System.getProperty("os.arch") + "/" + PLATFORM_NATIVE_LIBRARY_NAME; + InputStream libraryResource = CKZG4844JNI.class.getResourceAsStream(libraryResourcePath); + if (libraryResource == null) { + try { + System.loadLibrary(LIBRARY_NAME); + } catch (UnsatisfiedLinkError __) { + String exceptionMessage = + String.format( + "Couldn't load native library (%s). It wasn't available at %s or the library path.", + LIBRARY_NAME, libraryResourcePath); + throw new RuntimeException(exceptionMessage); + } + } else { + try { + Path tempDir = Files.createTempDirectory(LIBRARY_NAME + "@"); + tempDir.toFile().deleteOnExit(); + Path tempDll = tempDir.resolve(PLATFORM_NATIVE_LIBRARY_NAME); + tempDll.toFile().deleteOnExit(); + Files.copy(libraryResource, tempDll, StandardCopyOption.REPLACE_EXISTING); + libraryResource.close(); + System.load(tempDll.toString()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + } + + /** Scalar field modulus of BLS12-381. */ + public static final BigInteger BLS_MODULUS = + new BigInteger( + "52435875175126190479447740508185965837690552500527637822603658699938581184513"); + + /** The number of bytes in a g1 point. */ + protected static final int BYTES_PER_G1 = 48; + + /** The number of bytes in a g2 point. */ + protected static final int BYTES_PER_G2 = 96; + + /** The number of bytes in a BLS scalar field element. */ + public static final int BYTES_PER_FIELD_ELEMENT = 32; + + /** The number of bits in a BLS scalar field element. */ + protected static final int BITS_PER_FIELD_ELEMENT = 255; + + /** The number of field elements in a blob. */ + public static final int FIELD_ELEMENTS_PER_BLOB = 4096; + + /** The number of field elements in an extended blob. */ + protected static final int FIELD_ELEMENTS_PER_EXT_BLOB = FIELD_ELEMENTS_PER_BLOB * 2; + + /** The number of field elements in a cell. */ + public static final int FIELD_ELEMENTS_PER_CELL = 64; + + /** The number of bytes in a KZG commitment. */ + public static final int BYTES_PER_COMMITMENT = 48; + + /** The number of bytes in a KZG proof. */ + public static final int BYTES_PER_PROOF = 48; + + /** The number of bytes in a blob. */ + public static final int BYTES_PER_BLOB = FIELD_ELEMENTS_PER_BLOB * BYTES_PER_FIELD_ELEMENT; + + /** The number of bytes in a single cell. */ + public static final int BYTES_PER_CELL = BYTES_PER_FIELD_ELEMENT * FIELD_ELEMENTS_PER_CELL; + + /** The number of cells in an extended blob. */ + public static final int CELLS_PER_EXT_BLOB = + FIELD_ELEMENTS_PER_EXT_BLOB / FIELD_ELEMENTS_PER_CELL; + + private CKZG4844JNI() {} + + /** + * Loads the trusted setup from a file. Once loaded, the same setup will be used for all the + * crypto native calls. To load a new setup, free the current one by calling {@link + * #freeTrustedSetup()} and then load the new one. If no trusted setup has been loaded, all the + * crypto native calls will throw a {@link RuntimeException}. + * + * @param file a path to a trusted setup file + * @param precompute configurable value between 0-15 + * @throws CKZGException if there is a crypto error + */ + public static native void loadTrustedSetup(String file, long precompute); + + /** + * An alternative to {@link #loadTrustedSetup(String,long)}. Loads the trusted setup from method + * parameters instead of a file. + * + * @param g1MonomialBytes g1 values in monomial form as bytes + * @param g1LagrangeBytes g1 values in Lagrange form as bytes + * @param g2MonomialBytes g2 values in monomial form as bytes + * @param precompute configurable value between 0-15 + * @throws CKZGException if there is a crypto error + */ + public static native void loadTrustedSetup( + byte[] g1MonomialBytes, byte[] g1LagrangeBytes, byte[] g2MonomialBytes, long precompute); + + /** + * An alternative to {@link #loadTrustedSetup(String,long)}. Loads the trusted setup from a + * resource. + * + * @param clazz the class to use to get the resource + * @param resource the resource name that contains the trusted setup + * @param precompute configurable value between 0-15 + * @param the type of the class + * @throws CKZGException if there is a crypto error + * @throws IllegalArgumentException if the resource does not exist + */ + public static void loadTrustedSetupFromResource( + String resource, Class clazz, long precompute) { + InputStream is = clazz.getResourceAsStream(resource); + if (is == null) { + throw new IllegalArgumentException("Resource " + resource + " does not exist."); + } + + try (InputStream closableIs = is) { + Path jniWillLoadFrom = Files.createTempFile("kzg-trusted-setup", ".txt"); + jniWillLoadFrom.toFile().deleteOnExit(); + Files.copy(closableIs, jniWillLoadFrom, StandardCopyOption.REPLACE_EXISTING); + loadTrustedSetup(jniWillLoadFrom.toString(), precompute); + } catch (IOException ex) { + throw new UncheckedIOException("Error loading trusted setup from resource " + resource, ex); + } + } + + /** + * Free the current trusted setup. This method will throw an exception if no trusted setup has + * been loaded. + */ + public static native void freeTrustedSetup(); + + /** + * Calculates commitment for a given blob + * + * @param blob blob bytes + * @return the commitment + * @throws CKZGException if there is a crypto error + */ + public static native byte[] blobToKzgCommitment(byte[] blob); + + /** + * Compute proof at point z for the polynomial represented by blob. + * + * @param blob blob bytes + * @param zBytes a point + * @return an instance of {@link ProofAndY} holding the proof and the value y = f(z) + * @throws CKZGException if there is a crypto error + */ + public static native ProofAndY computeKzgProof(byte[] blob, byte[] zBytes); + + /** + * Given a blob, return the KZG proof that is used to verify it against the commitment + * + * @param blob blob bytes + * @param commitmentBytes commitment bytes + * @return the proof + * @throws CKZGException if there is a crypto error + */ + public static native byte[] computeBlobKzgProof(byte[] blob, byte[] commitmentBytes); + + /** + * Verify the proof by point evaluation for the given commitment + * + * @param commitmentBytes commitment bytes + * @param zBytes Z + * @param yBytes Y + * @param proofBytes the proof that needs verifying + * @return true if the proof is valid and false otherwise + * @throws CKZGException if there is a crypto error + */ + public static native boolean verifyKzgProof( + byte[] commitmentBytes, byte[] zBytes, byte[] yBytes, byte[] proofBytes); + + /** + * Given a blob and a KZG proof, verify that the blob data corresponds to the provided commitment. + * + * @param blob blob bytes + * @param commitmentBytes commitment bytes + * @param proofBytes proof bytes + * @return true if the proof is valid and false otherwise + * @throws CKZGException if there is a crypto error + */ + public static native boolean verifyBlobKzgProof( + byte[] blob, byte[] commitmentBytes, byte[] proofBytes); + + /** + * Given a list of blobs and blob KZG proofs, verify that they correspond to the provided + * commitments. + * + * @param blobs flattened blobs bytes + * @param commitmentsBytes flattened commitments bytes + * @param proofsBytes flattened proofs bytes + * @param count the number of blobs (should be same as the number of proofs and commitments) + * @return true if the proof is valid and false otherwise + * @throws CKZGException if there is a crypto error + */ + public static native boolean verifyBlobKzgProofBatch( + byte[] blobs, byte[] commitmentsBytes, byte[] proofsBytes, long count); + + /** + * Get the cells for a given blob. + * + * @param blob the blob to get cells for + * @return the cells + * @throws CKZGException if there is a crypto error + */ + public static native byte[] computeCells(byte[] blob); + + /** + * Get the cells and proofs for a given blob. + * + * @param blob the blob to get cells/proofs for + * @return a CellsAndProofs object + * @throws CKZGException if there is a crypto error + */ + public static native CellsAndProofs computeCellsAndKzgProofs(byte[] blob); + + /** + * Given at least 50% of cells, reconstruct the missing cells/proofs. + * + * @param cellIndices the identifiers for the cells you have + * @param cells the cells you have + * @return all cells/proofs for that blob + * @throws CKZGException if there is a crypto error + */ + public static native CellsAndProofs recoverCellsAndKzgProofs(long[] cellIndices, byte[] cells); + + /** + * Verify that multiple cells' proofs are valid. + * + * @param commitmentsBytes the commitments for each cell + * @param cellIndices the column index for each cell + * @param cells the cells to verify + * @param proofsBytes the proof for each cell + * @return true if the cells are valid with respect to the given commitments + * @throws CKZGException if there is a crypto error + */ + public static native boolean verifyCellKzgProofBatch( + byte[] commitmentsBytes, long[] cellIndices, byte[] cells, byte[] proofsBytes); +} diff --git a/crypto/src/main/java/ethereum/ckzg4844/CKZGException.java b/crypto/src/main/java/ethereum/ckzg4844/CKZGException.java new file mode 100644 index 00000000000..cbf087364d2 --- /dev/null +++ b/crypto/src/main/java/ethereum/ckzg4844/CKZGException.java @@ -0,0 +1,45 @@ +package ethereum.ckzg4844; + + +import java.util.Arrays; + +/** Thrown when there is an error in the underlying c-kzg library. */ +public class CKZGException extends RuntimeException { + + private final CKZGError error; + private final String errorMessage; + + public CKZGException(int errorCode, String errorMessage) { + super(String.format("%s (%s)", errorMessage, CKZGError.fromErrorCode(errorCode))); + this.error = CKZGError.fromErrorCode(errorCode); + this.errorMessage = errorMessage; + } + + public CKZGError getError() { + return error; + } + + public String getErrorMessage() { + return errorMessage; + } + + public enum CKZGError { + UNKNOWN(0), + C_KZG_BADARGS(1), + C_KZG_ERROR(2), + C_KZG_MALLOC(3); + + public final int errorCode; + + CKZGError(int errorCode) { + this.errorCode = errorCode; + } + + public static CKZGError fromErrorCode(int errorCode) { + return Arrays.stream(CKZGError.values()) + .filter(error -> error.errorCode == errorCode) + .findFirst() + .orElse(UNKNOWN); + } + } +} diff --git a/crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java b/crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java new file mode 100644 index 00000000000..7f57431acab --- /dev/null +++ b/crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java @@ -0,0 +1,23 @@ +package ethereum.ckzg4844; + +public class CellsAndProofs { + private final byte[] cells; + private final byte[] proofs; + + public CellsAndProofs(final byte[] cells, final byte[] proofs) { + this.cells = cells; + this.proofs = proofs; + } + + public byte[] getCells() { + return cells; + } + + public byte[] getProofs() { + return proofs; + } + + public static CellsAndProofs of(final byte[] cells, final byte[] proofs) { + return new CellsAndProofs(cells, proofs); + } +} diff --git a/crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java b/crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java new file mode 100644 index 00000000000..ada1034ee4e --- /dev/null +++ b/crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java @@ -0,0 +1,23 @@ +package ethereum.ckzg4844; + +public class ProofAndY { + private final byte[] proof; + private final byte[] y; + + public ProofAndY(byte[] proof, byte[] y) { + this.proof = proof; + this.y = y; + } + + public byte[] getProof() { + return proof; + } + + public byte[] getY() { + return y; + } + + public static ProofAndY of(byte[] proof, byte[] y) { + return new ProofAndY(proof, y); + } +} diff --git a/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib b/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib new file mode 100755 index 0000000000000000000000000000000000000000..733aca4f74782cff6d4e47dadc4b99d37ebfd713 GIT binary patch literal 259496 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 pR`B~~GbooT0jA9(Mh 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±2@DOFMH$!0ihhALUl}dIEU;{qtSZRE%7v0I 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

eb3FKa*a? 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 (obfG_sY7Z^vvK%e{PpegF7DyBD5>IZGo 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 literal 0 HcmV?d00001 diff --git a/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll b/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll new file mode 100755 index 0000000000000000000000000000000000000000..7be02e81985a87c7970cbc5805aeea3ff67eb624 GIT binary patch literal 288032 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

)@ks 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 z¬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ñ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 MMKuBFySz1^9(oot~ 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 literal 0 HcmV?d00001 diff --git a/crypto/src/main/resources/lib/x86_64/libckzg4844jni.dylib b/crypto/src/main/resources/lib/x86_64/libckzg4844jni.dylib new file mode 100755 index 0000000000000000000000000000000000000000..7ab7c008aa9a8eda14deb34c7503033a19a798da GIT binary patch literal 275232 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%0D`@m<;GT_!x-7A7xz5DbJ`rAzkN50r(!u*@@ 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 ef*)Zq?)+tg4_6^-biB6VB!$mM res = contract.execute(null); + Assert.assertFalse(res.getLeft()); + Assert.assertArrayEquals(DataWord.ZERO().getData(), res.getRight()); + + byte[] data1 = Arrays.copyOf(data, data.length); + data1[0] = 0x02; + res = contract.execute(data1); + Assert.assertFalse(res.getLeft()); + Assert.assertArrayEquals(DataWord.ZERO().getData(), res.getRight()); + + byte[] data2 = Arrays.copyOf(data, data.length); + byte[] z2 = Hex.decode("0000000000000000000000000000000000000000000000000000000000000066"); + System.arraycopy(z2, 0, data2, 32, 32); + res = contract.execute(data2); + Assert.assertFalse(res.getLeft()); + Assert.assertArrayEquals(DataWord.ZERO().getData(), res.getRight()); + + res = contract.execute(data); + byte[] expected = Hex.decode( + "0000000000000000000000000000000000000000000000000000000000001000" + + "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); + Assert.assertTrue(res.getLeft()); + Assert.assertArrayEquals(expected, res.getRight()); + VMConfig.initAllowTvmCancun(0); + } } diff --git a/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java new file mode 100644 index 00000000000..24e2f9f0f1c --- /dev/null +++ b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java @@ -0,0 +1,21 @@ +package org.tron.core.zksnark; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.tron.common.BaseTest; +import org.tron.core.zen.KZGPointEvaluationInitService; + +@Slf4j +public class KZGPointEvaluationTest extends BaseTest { + + @Test + public void testKZGPointEvaluation() { + KZGPointEvaluationInitService.freeSetup(); + + KZGPointEvaluationInitService.initCKZG4844(); + + + + + } +} From 0a2fb53e175e60c684697687745f8ca847ac32c0 Mon Sep 17 00:00:00 2001 From: textml <37575478+textml@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:55:13 +0800 Subject: [PATCH 083/107] feat(tvm): add allowTvmBlob proposal for TVM blob related ops and precompiles --- .../java/org/tron/core/utils/ProposalUtil.java | 18 +++++++++++++++++- .../src/main/java/org/tron/core/vm/Op.java | 2 +- .../org/tron/core/vm/OperationActions.java | 1 + .../org/tron/core/vm/OperationRegistry.java | 7 ++++--- .../org/tron/core/vm/PrecompiledContracts.java | 2 +- .../org/tron/core/vm/config/ConfigLoader.java | 1 + .../core/store/DynamicPropertiesStore.java | 13 +++++++++++++ .../tron/common/parameter/CommonParameter.java | 4 ++++ .../src/main/java/org/tron/core/Constant.java | 2 ++ .../java/org/tron/core/vm/config/VMConfig.java | 10 ++++++++++ .../src/main/java/org/tron/core/Wallet.java | 5 +++++ .../java/org/tron/core/config/args/Args.java | 5 +++++ .../tron/core/consensus/ProposalService.java | 4 ++++ .../tron/common/runtime/vm/OperationsTest.java | 8 ++++---- .../runtime/vm/PrecompiledContractsTest.java | 4 ++-- 15 files changed, 74 insertions(+), 12 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index 6b558011c73..0bad940da7e 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -824,6 +824,21 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } break; } + case ALLOW_TVM_BLOB: { + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_0)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_BLOB]"); + } + if (dynamicPropertiesStore.getAllowTvmBlob() == 1) { + throw new ContractValidateException( + "[ALLOW_TVM_BLOB] has been valid, no need to propose again"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_BLOB] is only allowed to be 1"); + } + break; + } default: break; } @@ -905,7 +920,8 @@ public enum ProposalType { // current value, value range MAX_CREATE_ACCOUNT_TX_SIZE(82), // [500, 10000] ALLOW_TVM_CANCUN(83), // 0, 1 ALLOW_STRICT_MATH(87), // 0, 1 - CONSENSUS_LOGIC_OPTIMIZATION(88); // 0, 1 + CONSENSUS_LOGIC_OPTIMIZATION(88), // 0, 1 + ALLOW_TVM_BLOB(89); // 0, 1 private long code; diff --git a/actuator/src/main/java/org/tron/core/vm/Op.java b/actuator/src/main/java/org/tron/core/vm/Op.java index f1bc3003d36..ed2d8eb2f53 100644 --- a/actuator/src/main/java/org/tron/core/vm/Op.java +++ b/actuator/src/main/java/org/tron/core/vm/Op.java @@ -121,7 +121,7 @@ public class Op { // (0x48) Get block's basefee public static final int BASEFEE = 0x48; // (0x49) Get blob hash - public static final int BLOBAHASH = 0x49; + public static final int BLOBHASH = 0x49; // (0x4a) Get block's blob basefee public static final int BLOBBASEFEE = 0x4a; diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java index 4ace088a6c9..f10fb37dd7e 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationActions.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -678,6 +678,7 @@ public static void mCopyAction(Program program) { } public static void blobHashAction(Program program) { + program.stackPop(); program.stackPush(DataWord.ZERO()); program.step(); } diff --git a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java index bc73cfd9aa7..be29238a775 100644 --- a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java +++ b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java @@ -663,6 +663,7 @@ public static void adjustForFairEnergy(JumpTable table) { public static void appendCancunOperations(JumpTable table) { BooleanSupplier proposal = VMConfig::allowTvmCancun; + BooleanSupplier tvmBlobProposal = VMConfig::allowTvmBlob; table.set(new Operation( Op.TLOAD, 1, 1, @@ -683,15 +684,15 @@ public static void appendCancunOperations(JumpTable table) { proposal)); table.set(new Operation( - Op.BLOBAHASH, 1, 1, + Op.BLOBHASH, 1, 1, EnergyCost::getVeryLowTierCost, OperationActions::blobHashAction, - proposal)); + tvmBlobProposal)); table.set(new Operation( Op.BLOBBASEFEE, 0, 1, EnergyCost::getBaseTierCost, OperationActions::blobBaseFeeAction, - proposal)); + tvmBlobProposal)); } } diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index a8dbfe1dbf7..1245bc23718 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -285,7 +285,7 @@ public static PrecompiledContract getContractForAddress(DataWord address) { if (VMConfig.allowTvmCompatibleEvm() && address.equals(blake2FAddr)) { return blake2F; } - if (VMConfig.allowTvmCancun() && address.equals(kzgPointEvaluationAddr)) { + if (VMConfig.allowTvmBlob() && address.equals(kzgPointEvaluationAddr)) { return kzgPointEvaluation; } diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index 81ed4ba2b8f..1ec8a75d669 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -43,6 +43,7 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowStrictMath(ds.getAllowStrictMath()); VMConfig.initAllowTvmCancun(ds.getAllowTvmCancun()); VMConfig.initDisableJavaLangMath(ds.getConsensusLogicOptimization()); + VMConfig.initAllowTvmBlob(ds.getAllowTvmBlob()); } } } diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 865555b35a8..91b0cff68a0 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -230,6 +230,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] ALLOW_TVM_CANCUN = "ALLOW_TVM_CANCUN".getBytes(); + private static final byte[] ALLOW_TVM_BLOB = "ALLOW_TVM_BLOB".getBytes(); + @Autowired private DynamicPropertiesStore(@Value("properties") String dbName) { super(dbName); @@ -2933,6 +2935,17 @@ public long getAllowTvmCancun() { .orElse(CommonParameter.getInstance().getAllowTvmCancun()); } + public void saveAllowTvmBlob(long allowTvmBlob) { + this.put(ALLOW_TVM_BLOB, new BytesCapsule(ByteArray.fromLong(allowTvmBlob))); + } + + public long getAllowTvmBlob() { + return Optional.ofNullable(getUnchecked(ALLOW_TVM_BLOB)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElse(CommonParameter.getInstance().getAllowTvmBlob()); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 506b9c20ea3..16fb752d82a 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -713,6 +713,10 @@ public class CommonParameter { @Setter public long allowTvmCancun; + @Getter + @Setter + public long allowTvmBlob; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 1b974052a01..bb35b207795 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -401,4 +401,6 @@ public class Constant { = "committee.consensusLogicOptimization"; public static final String COMMITTEE_ALLOW_TVM_CANCUN = "committee.allowTvmCancun"; + + public static final String COMMITTEE_ALLOW_TVM_BLOB = "committee.allowTvmBlob"; } diff --git a/common/src/main/java/org/tron/core/vm/config/VMConfig.java b/common/src/main/java/org/tron/core/vm/config/VMConfig.java index 23210f284c0..2bdbeb78b92 100644 --- a/common/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/common/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -57,6 +57,8 @@ public class VMConfig { private static Boolean DISABLE_JAVA_LANG_MATH = false; + private static boolean ALLOW_TVM_BLOB = false; + private VMConfig() { } @@ -160,6 +162,10 @@ public static void initDisableJavaLangMath(long allow) { DISABLE_JAVA_LANG_MATH = allow == 1; } + public static void initAllowTvmBlob(long allow) { + ALLOW_TVM_BLOB = allow == 1; + } + public static boolean getEnergyLimitHardFork() { return CommonParameter.ENERGY_LIMIT_HARD_FORK; } @@ -251,4 +257,8 @@ public static boolean allowTvmCancun() { public static boolean disableJavaLangMath() { return DISABLE_JAVA_LANG_MATH; } + + public static boolean allowTvmBlob() { + return ALLOW_TVM_BLOB; + } } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 27c942bf6b4..24978304fba 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -1382,6 +1382,11 @@ public Protocol.ChainParameters getChainParameters() { .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCancun()) .build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() + .setKey("getAllowTvmBlob") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmBlob()) + .build()); + return builder.build(); } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index aebff31e95d..4eab79b16fa 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -244,6 +244,7 @@ public static void clearParam() { PARAMETER.allowStrictMath = 0; PARAMETER.consensusLogicOptimization = 0; PARAMETER.allowTvmCancun = 0; + PARAMETER.allowTvmBlob = 0; } /** @@ -1274,6 +1275,10 @@ public static void setParam(final Config config) { config.hasPath(Constant.COMMITTEE_ALLOW_TVM_CANCUN) ? config .getInt(Constant.COMMITTEE_ALLOW_TVM_CANCUN) : 0; + PARAMETER.allowTvmBlob = + config.hasPath(Constant.COMMITTEE_ALLOW_TVM_BLOB) ? config + .getInt(Constant.COMMITTEE_ALLOW_TVM_BLOB) : 0; + logConfig(); } diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalService.java b/framework/src/main/java/org/tron/core/consensus/ProposalService.java index 1a95fd5064d..b25f0d6fa8d 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalService.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalService.java @@ -380,6 +380,10 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule) manager.getDynamicPropertiesStore().saveAllowTvmCancun(entry.getValue()); break; } + case ALLOW_TVM_BLOB: { + manager.getDynamicPropertiesStore().saveAllowTvmBlob(entry.getValue()); + break; + } default: find = false; break; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index 8b4c80c49c2..3315005b7d2 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -1011,7 +1011,7 @@ public void testMCOPY() throws ContractValidateException { @Test public void testBlobHash() throws ContractValidateException { - VMConfig.initAllowTvmCancun(1); + VMConfig.initAllowTvmBlob(1); invoke = new ProgramInvokeMockImpl(); Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); @@ -1025,12 +1025,12 @@ public void testBlobHash() throws ContractValidateException { Assert.assertEquals(6, program.getResult().getEnergyUsed()); Assert.assertEquals(DataWord.ZERO(), program.getStack().pop()); - VMConfig.initAllowTvmCancun(0); + VMConfig.initAllowTvmBlob(0); } @Test public void testBlobBaseFee() throws ContractValidateException { - VMConfig.initAllowTvmCancun(1); + VMConfig.initAllowTvmBlob(1); invoke = new ProgramInvokeMockImpl(); Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); @@ -1044,7 +1044,7 @@ public void testBlobBaseFee() throws ContractValidateException { Assert.assertEquals(5, program.getResult().getEnergyUsed()); Assert.assertEquals(DataWord.ZERO(), program.getStack().pop()); - VMConfig.initAllowTvmCancun(0); + VMConfig.initAllowTvmBlob(0); } private void testOperations(Program program) { diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java index 90d66dc00bc..0f1b8754fd5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java @@ -1172,7 +1172,7 @@ private static byte[] encodeMultiWord(byte[]... words) { @Test public void ckzgPointEvaluationTest() { - VMConfig.initAllowTvmCancun(1); + VMConfig.initAllowTvmBlob(1); PrecompiledContract contract = createPrecompiledContract(kzgPointEvaluationAddr, OWNER_ADDRESS); @@ -1217,6 +1217,6 @@ public void ckzgPointEvaluationTest() { "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); Assert.assertTrue(res.getLeft()); Assert.assertArrayEquals(expected, res.getRight()); - VMConfig.initAllowTvmCancun(0); + VMConfig.initAllowTvmBlob(0); } } From d442c9318237a7bf9b8be1622d96b989e39ae0f1 Mon Sep 17 00:00:00 2001 From: Liulei Date: Mon, 10 Mar 2025 18:19:21 +0800 Subject: [PATCH 084/107] feat(crypto): add setup file --- .../kzg-trusted-setups/trusted_setup.txt | 8259 +++++++++++++++++ 1 file changed, 8259 insertions(+) create mode 100644 framework/src/main/resources/kzg-trusted-setups/trusted_setup.txt diff --git a/framework/src/main/resources/kzg-trusted-setups/trusted_setup.txt b/framework/src/main/resources/kzg-trusted-setups/trusted_setup.txt new file mode 100644 index 00000000000..5ecccf5e5e5 --- /dev/null +++ b/framework/src/main/resources/kzg-trusted-setups/trusted_setup.txt @@ -0,0 +1,8259 @@ +4096 +65 +a0413c0dcafec6dbc9f47d66785cf1e8c981044f7d13cfe3e4fcbb71b5408dfde6312493cb3c1d30516cb3ca88c03654 +8b997fb25730d661918371bb41f2a6e899cac23f04fc5365800b75433c0a953250e15e7a98fb5ca5cc56a8cd34c20c57 +83302852db89424d5699f3f157e79e91dc1380f8d5895c5a772bb4ea3a5928e7c26c07db6775203ce33e62a114adaa99 +a759c48b7e4a685e735c01e5aa6ef9c248705001f470f9ad856cd87806983e917a8742a3bd5ee27db8d76080269b7c83 +967f8dc45ebc3be14c8705f43249a30ff48e96205fb02ae28daeab47b72eb3f45df0625928582aa1eb4368381c33e127 +a418eb1e9fb84cb32b370610f56f3cb470706a40ac5a47c411c464299c45c91f25b63ae3fcd623172aa0f273c0526c13 +8f44e3f0387293bc7931e978165abbaed08f53acd72a0a23ac85f6da0091196b886233bcee5b4a194db02f3d5a9b3f78 +97173434b336be73c89412a6d70d416e170ea355bf1956c32d464090b107c090ef2d4e1a467a5632fbc332eeb679bf2d +a24052ad8d55ad04bc5d951f78e14213435681594110fd18173482609d5019105b8045182d53ffce4fc29fc8810516c1 +b950768136b260277590b5bec3f56bbc2f7a8bc383d44ce8600e85bf8cf19f479898bcc999d96dfbd2001ede01d94949 +92ab8077871037bd3b57b95cbb9fb10eb11efde9191690dcac655356986fd02841d8fdb25396faa0feadfe3f50baf56d +a79b096dff98038ac30f91112dd14b78f8ad428268af36d20c292e2b3b6d9ed4fb28480bb04e465071cc67d05786b6d1 +b9ff71461328f370ce68bf591aa7fb13027044f42a575517f3319e2be4aa4843fa281e756d0aa5645428d6dfa857cef2 +8d765808c00b3543ff182e2d159c38ae174b12d1314da88ea08e13bd9d1c37184cb515e6bf6420531b5d41767987d7ce +b8c9a837d20c3b53e6f578e4a257bb7ef8fc43178614ec2a154915b267ad2be135981d01ed2ee1b5fbd9d9bb27f0800a +a9773d92cf23f65f98ef68f6cf95c72b53d0683af2f9bf886bb9036e4a38184b1131b26fd24397910b494fbef856f3aa +b41ebe38962d112da4a01bf101cb248d808fbd50aaf749fc7c151cf332032eb3e3bdbd716db899724b734d392f26c412 +90fbb030167fb47dcc13d604a726c0339418567c1d287d1d87423fa0cb92eec3455fbb46bcbe2e697144a2d3972142e4 +b11d298bd167464b35fb923520d14832bd9ed50ed841bf6d7618424fd6f3699190af21759e351b89142d355952149da1 +8bc36066f69dc89f7c4d1e58d67497675050c6aa002244cebd9fc957ec5e364c46bab4735ea3db02b73b3ca43c96e019 +ab7ab92c5d4d773068e485aa5831941ebd63db7118674ca38089635f3b4186833af2455a6fb9ed2b745df53b3ce96727 +af191ca3089892cb943cd97cf11a51f38e38bd9be50844a4e8da99f27e305e876f9ed4ab0628e8ae3939066b7d34a15f +a3204c1747feabc2c11339a542195e7cb6628fd3964f846e71e2e3f2d6bb379a5e51700682ea1844eba12756adb13216 +903a29883846b7c50c15968b20e30c471aeac07b872c40a4d19eb1a42da18b649d5bbfde4b4cf6225d215a461b0deb6d +8e6e9c15ffbf1e16e5865a5fef7ed751dc81957a9757b535cb38b649e1098cda25d42381dc4f776778573cdf90c3e6e0 +a8f6dd26100b512a8c96c52e00715c4b2cb9ac457f17aed8ffe1cf1ea524068fe5a1ddf218149845fc1417b789ecfc98 +a5b0ffc819451ea639cfd1c18cbc9365cc79368d3b2e736c0ae54eba2f0801e6eb0ee14a5f373f4a70ca463bdb696c09 +879f91ccd56a1b9736fbfd20d8747354da743fb121f0e308a0d298ff0d9344431890e41da66b5009af3f442c636b4f43 +81bf3a2d9755e206b515a508ac4d1109bf933c282a46a4ae4a1b4cb4a94e1d23642fad6bd452428845afa155742ade7e +8de778d4742f945df40004964e165592f9c6b1946263adcdd5a88b00244bda46c7bb49098c8eb6b3d97a0dd46148a8ca +b7a57b21d13121907ee28c5c1f80ee2e3e83a3135a8101e933cf57171209a96173ff5037f5af606e9fd6d066de6ed693 +b0877d1963fd9200414a38753dffd9f23a10eb3198912790d7eddbc9f6b477019d52ddd4ebdcb9f60818db076938a5a9 +88da2d7a6611bc16adc55fc1c377480c828aba4496c645e3efe0e1a67f333c05a0307f7f1d2df8ac013602c655c6e209 +95719eb02e8a9dede1a888c656a778b1c69b7716fbe3d1538fe8afd4a1bc972183c7d32aa7d6073376f7701df80116d8 +8e8a1ca971f2444b35af3376e85dccda3abb8e8e11d095d0a4c37628dfe5d3e043a377c3de68289ef142e4308e9941a0 +b720caaff02f6d798ac84c4f527203e823ff685869e3943c979e388e1c34c3f77f5c242c6daa7e3b30e511aab917b866 +86040d55809afeec10e315d1ad950d269d37cfee8c144cd8dd4126459e3b15a53b3e68df5981df3c2346d23c7b4baaf4 +82d8cabf13ab853db0377504f0aec00dba3a5cd3119787e8ad378ddf2c40b022ecfc67c642b7acc8c1e3dd03ab50993e +b8d873927936719d2484cd03a6687d65697e17dcf4f0d5aed6f5e4750f52ef2133d4645894e7ebfc4ef6ce6788d404c8 +b1235594dbb15b674a419ff2b2deb644ad2a93791ca05af402823f87114483d6aa1689b7a9bea0f547ad12fe270e4344 +a53fda86571b0651f5affb74312551a082fffc0385cfd24c1d779985b72a5b1cf7c78b42b4f7e51e77055f8e5e915b00 +b579adcfd9c6ef916a5a999e77a0cb21d378c4ea67e13b7c58709d5da23a56c2e54218691fc4ac39a4a3d74f88cc31f7 +ab79e584011713e8a2f583e483a91a0c2a40771b77d91475825b5acbea82db4262132901cb3e4a108c46d7c9ee217a4e +a0fe58ea9eb982d7654c8aaf9366230578fc1362f6faae0594f8b9e659bcb405dff4aac0c7888bbe07f614ecf0d800a6 +867e50e74281f28ecd4925560e2e7a6f8911b135557b688254623acce0dbc41e23ac3e706a184a45d54c586edc416eb0 +89f81b61adda20ea9d0b387a36d0ab073dc7c7cbff518501962038be19867042f11fcc7ff78096e5d3b68c6d8dc04d9b +a58ee91bb556d43cf01f1398c5811f76dc0f11efdd569eed9ef178b3b0715e122060ec8f945b4dbf6eebfa2b90af6fa6 +ac460be540f4c840def2eef19fc754a9af34608d107cbadb53334cf194cc91138d53b9538fcd0ec970b5d4aa455b224a +b09b91f929de52c09d48ca0893be6eb44e2f5210a6c394689dc1f7729d4be4e11d0474b178e80cea8c2ac0d081f0e811 +8d37a442a76b06a02a4e64c2504aea72c8b9b020ab7bcc94580fe2b9603c7c50d7b1e9d70d2a7daea19c68667e8f8c31 +a9838d4c4e3f3a0075a952cf7dd623307ec633fcc81a7cf9e52e66c31780de33dbb3d74c320dc7f0a4b72f7a49949515 +a44766b6251af458fe4f5f9ed1e02950f35703520b8656f09fc42d9a2d38a700c11a7c8a0436ac2e5e9f053d0bb8ff91 +ad78d9481c840f5202546bea0d13c776826feb8b1b7c72e83d99a947622f0bf38a4208551c4c41beb1270d7792075457 +b619ffa8733b470039451e224b777845021e8dc1125f247a4ff2476cc774657d0ff9c5279da841fc1236047de9d81c60 +af760b0a30a1d6af3bc5cd6686f396bd41779aeeb6e0d70a09349bd5da17ca2e7965afc5c8ec22744198fbe3f02fb331 +a0cc209abdb768b589fcb7b376b6e1cac07743288c95a1cf1a0354b47f0cf91fca78a75c1fcafa6f5926d6c379116608 +864add673c89c41c754eeb3cd8dcff5cdde1d739fce65c30e474a082bb5d813cba6412e61154ce88fdb6c12c5d9be35b +b091443b0ce279327dc37cb484e9a5b69b257a714ce21895d67539172f95ffa326903747b64a3649e99aea7bb10d03f7 +a8c452b8c4ca8e0a61942a8e08e28f17fb0ef4c5b018b4e6d1a64038280afa2bf1169202f05f14af24a06ca72f448ccd +a23c24721d18bc48d5dcf70effcbef89a7ae24e67158d70ae1d8169ee75d9a051d34b14e9cf06488bac324fe58549f26 +92a730e30eb5f3231feb85f6720489dbb1afd42c43f05a1610c6b3c67bb949ec8fde507e924498f4ffc646f7b07d9123 +8dbe5abf4031ec9ba6bb06d1a47dd1121fb9e03b652804069250967fd5e9577d0039e233441b7f837a7c9d67ba18c28e +aa456bcfef6a21bb88181482b279df260297b3778e84594ebddbdf337e85d9e3d46ca1d0b516622fb0b103df8ec519b7 +a3b31ae621bd210a2b767e0e6f22eb28fe3c4943498a7e91753225426168b9a26da0e02f1dc5264da53a5ad240d9f51b +aa8d66857127e6e71874ce2202923385a7d2818b84cb73a6c42d71afe70972a70c6bdd2aad1a6e8c5e4ca728382a8ea8 +ac7e8e7a82f439127a5e40558d90d17990f8229852d21c13d753c2e97facf077cf59582b603984c3dd3faebd80aff4f5 +93a8bcf4159f455d1baa73d2ef2450dcd4100420de84169bbe28b8b7a5d1746273f870091a87a057e834f754f34204b1 +89d0ebb287c3613cdcae7f5acc43f17f09c0213fc40c074660120b755d664109ffb9902ed981ede79e018ddb0c845698 +a87ccbfad431406aadbee878d9cf7d91b13649d5f7e19938b7dfd32645a43b114eef64ff3a13201398bd9b0337832e5a +833c51d0d0048f70c3eefb4e70e4ff66d0809c41838e8d2c21c288dd3ae9d9dfaf26d1742bf4976dab83a2b381677011 +8bcd6b1c3b02fffead432e8b1680bad0a1ac5a712d4225e220690ee18df3e7406e2769e1f309e2e803b850bc96f0e768 +b61e3dbd88aaf4ff1401521781e2eea9ef8b66d1fac5387c83b1da9e65c2aa2a56c262dea9eceeb4ad86c90211672db0 +866d3090db944ecf190dd0651abf67659caafd31ae861bab9992c1e3915cb0952da7c561cc7e203560a610f48fae633b +a5e8971543c14274a8dc892b0be188c1b4fbc75c692ed29f166e0ea80874bc5520c2791342b7c1d2fb5dd454b03b8a5b +8f2f9fc50471bae9ea87487ebd1bc8576ef844cc42d606af5c4c0969670fdf2189afd643e4de3145864e7773d215f37f +b1bb0f2527db6d51f42b9224383c0f96048bbc03d469bf01fe1383173ef8b1cc9455d9dd8ba04d46057f46949bfc92b5 +aa7c99d906b4d7922296cfe2520473fc50137c03d68b7865c5bfb8adbc316b1034310ec4b5670c47295f4a80fb8d61e9 +a5d1da4d6aba555919df44cbaa8ff79378a1c9e2cfdfbf9d39c63a4a00f284c5a5724e28ecbc2d9dba27fe4ee5018bd5 +a8db53224f70af4d991b9aae4ffe92d2aa5b618ad9137784b55843e9f16cefbfd25ada355d308e9bbf55f6d2f7976fb3 +b6536c4232bb20e22af1a8bb12de76d5fec2ad9a3b48af1f38fa67e0f8504ef60f305a73d19385095bb6a9603fe29889 +87f7e371a1817a63d6838a8cf4ab3a8473d19ce0d4f40fd013c03d5ddd5f4985df2956531cc9f187928ef54c68f4f9a9 +ae13530b1dbc5e4dced9d909ea61286ec09e25c12f37a1ed2f309b0eb99863d236c3b25ed3484acc8c076ad2fa8cd430 +98928d850247c6f7606190e687d5c94a627550198dbdbea0161ef9515eacdb1a0f195cae3bb293112179082daccf8b35 +918528bb8e6a055ad4db6230d3a405e9e55866da15c4721f5ddd1f1f37962d4904aad7a419218fe6d906fe191a991806 +b71e31a06afe065773dd3f4a6e9ef81c3292e27a3b7fdfdd452d03e05af3b6dd654c355f7516b2a93553360c6681a73a +8870b83ab78a98820866f91ac643af9f3ff792a2b7fda34185a9456a63abdce42bfe8ad4dc67f08a6392f250d4062df4 +91eea1b668e52f7a7a5087fabf1cab803b0316f78d9fff469fbfde2162f660c250e4336a9eea4cb0450bd30ac067bc8b +8b74990946de7b72a92147ceac1bd9d55999a8b576e8df68639e40ed5dc2062cfcd727903133de482b6dca19d0aaed82 +8ebad537fece090ebbab662bdf2618e21ca30cf6329c50935e8346d1217dcbe3c1fe1ea28efca369c6003ce0a94703c1 +a8640479556fb59ebd1c40c5f368fbd960932fdbb782665e4a0e24e2bdb598fc0164ce8c0726d7759cfc59e60a62e182 +a9a52a6bf98ee4d749f6d38be2c60a6d54b64d5cbe4e67266633dc096cf28c97fe998596707d31968cbe2064b72256bf +847953c48a4ce6032780e9b39d0ed4384e0be202c2bbe2dfda3910f5d87aa5cd3c2ffbfcfae4dddce16d6ab657599b95 +b6f6e1485d3ec2a06abaecd23028b200b2e4a0096c16144d07403e1720ff8f9ba9d919016b5eb8dc5103880a7a77a1d3 +98dfc2065b1622f596dbe27131ea60bef7a193b12922cecb27f8c571404f483014f8014572e86ae2e341ab738e4887ef +acb0d205566bacc87bbe2e25d10793f63f7a1f27fd9e58f4f653ceae3ffeba511eaf658e068fad289eeb28f9edbeb35b +ae4411ed5b263673cee894c11fe4abc72a4bf642d94022a5c0f3369380fcdfc1c21e277f2902972252503f91ada3029a +ac4a7a27ba390a75d0a247d93d4a8ef1f0485f8d373a4af4e1139369ec274b91b3464d9738eeaceb19cd6f509e2f8262 +87379c3bf231fdafcf6472a79e9e55a938d851d4dd662ab6e0d95fd47a478ed99e2ad1e6e39be3c0fc4f6d996a7dd833 +81316904b035a8bcc2041199a789a2e6879486ba9fddcba0a82c745cc8dd8374a39e523b91792170cd30be7aa3005b85 +b8206809c6cd027ed019f472581b45f7e12288f89047928ba32b4856b6560ad30395830d71e5e30c556f6f182b1fe690 +88d76c028f534a62e019b4a52967bb8642ede6becfa3807be68fdd36d366fc84a4ac8dc176e80a68bc59eb62caf5dff9 +8c3b8be685b0f8aad131ee7544d0e12f223f08a6f8edaf464b385ac644e0ddc9eff7cc7cb5c1b50ab5d71ea0f41d2213 +8d91410e004f76c50fdc05784157b4d839cb5090022c629c7c97a5e0c3536eeafee17a527b54b1165c3cd81774bb54ce +b25c2863bc28ec5281ce800ddf91a7e1a53f4c6d5da1e6c86ef4616e93bcf55ed49e297216d01379f5c6e7b3c1e46728 +865f7b09ac3ca03f20be90c48f6975dd2588838c2536c7a3532a6aa5187ed0b709cd03d91ff4048061c10d0aa72b69ce +b3f7477c90c11596eb4f8bbf34adbcb832638c4ff3cdd090d4d477ee50472ac9ddaf5be9ad7eca3f148960d362bbd098 +8db35fd53fca04faecd1c76a8227160b3ab46ac1af070f2492445a19d8ff7c25bbaef6c9fa0c8c088444561e9f7e4eb2 +a478b6e9d058a2e01d2fc053b739092e113c23a6a2770a16afbef044a3709a9e32f425ace9ba7981325f02667c3f9609 +98caa6bd38916c08cf221722a675a4f7577f33452623de801d2b3429595f988090907a7e99960fff7c076d6d8e877b31 +b79aaaacefc49c3038a14d2ac468cfec8c2161e88bdae91798d63552cdbe39e0e02f9225717436b9b8a40a022c633c6e +845a31006c680ee6a0cc41d3dc6c0c95d833fcf426f2e7c573fa15b2c4c641fbd6fe5ebb0e23720cc3467d6ee1d80dc4 +a1bc287e272cf8b74dbf6405b3a5190883195806aa351f1dc8e525aa342283f0a35ff687e3b434324dedee74946dd185 +a4fd2dc8db75d3783a020856e2b3aa266dc6926e84f5c491ef739a3bddd46dc8e9e0fc1177937839ef1b18d062ffbb9e +acbf0d3c697f57c202bb8c5dc4f3fc341b8fc509a455d44bd86acc67cad2a04495d5537bcd3e98680185e8aa286f2587 +a5caf423a917352e1b8e844f5968a6da4fdeae467d10c6f4bbd82b5eea46a660b82d2f5440d3641c717b2c3c9ed0be52 +8a39d763c08b926599ab1233219c49c825368fad14d9afc7c0c039224d37c00d8743293fd21645bf0b91eaf579a99867 +b2b53a496def0ba06e80b28f36530fbe0fb5d70a601a2f10722e59abee529369c1ae8fd0f2db9184dd4a2519bb832d94 +a73980fcef053f1b60ebbb5d78ba6332a475e0b96a0c724741a3abf3b59dd344772527f07203cf4c9cb5155ebed81fa0 +a070d20acce42518ece322c9db096f16aed620303a39d8d5735a0df6e70fbeceb940e8d9f5cc38f3314b2240394ec47b +a50cf591f522f19ca337b73089557f75929d9f645f3e57d4f241e14cdd1ea3fb48d84bcf05e4f0377afbb789fbdb5d20 +82a5ffce451096aca8eeb0cd2ae9d83db3ed76da3f531a80d9a70a346359bf05d74863ce6a7c848522b526156a5e20cd +88e0e84d358cbb93755a906f329db1537c3894845f32b9b0b691c29cbb455373d9452fadd1e77e20a623f6eaf624de6f +aa07ac7b84a6d6838826e0b9e350d8ec75e398a52e9824e6b0da6ae4010e5943fec4f00239e96433f291fef9d1d1e609 +ac8887bf39366034bc63f6cc5db0c26fd27307cbc3d6cce47894a8a019c22dd51322fb5096edc018227edfafc053a8f6 +b7d26c26c5b33f77422191dca94977588ab1d4b9ce7d0e19c4a3b4cd1c25211b78c328dbf81e755e78cd7d1d622ad23e +99a676d5af49f0ba44047009298d8474cabf2d5bca1a76ba21eff7ee3c4691a102fdefea27bc948ccad8894a658abd02 +b0d09a91909ab3620c183bdf1d53d43d39eb750dc7a722c661c3de3a1a5d383ad221f71bae374f8a71867505958a3f76 +84681a883de8e4b93d68ac10e91899c2bbb815ce2de74bb48a11a6113b2a3f4df8aceabda1f5f67bc5aacac8c9da7221 +9470259957780fa9b43521fab3644f555f5343281c72582b56d2efd11991d897b3b481cafa48681c5aeb80c9663b68f7 +ab1b29f7ece686e6fa968a4815da1d64f3579fed3bc92e1f3e51cd13a3c076b6cf695ed269d373300a62463dc98a4234 +8ab415bfcd5f1061f7687597024c96dd9c7cb4942b5989379a7a3b5742f7d394337886317659cbeacaf030234a24f972 +b9b524aad924f9acc63d002d617488f31b0016e0f0548f050cada285ce7491b74a125621638f19e9c96eabb091d945be +8c4c373e79415061837dd0def4f28a2d5d74d21cb13a76c9049ad678ca40228405ab0c3941df49249847ecdefc1a5b78 +a8edf4710b5ab2929d3db6c1c0e3e242261bbaa8bcec56908ddadd7d2dad2dca9d6eb9de630b960b122ebeea41040421 +8d66bb3b50b9df8f373163629f9221b3d4b6980a05ea81dc3741bfe9519cf3ebba7ab98e98390bae475e8ede5821bd5c +8d3c21bae7f0cfb97c56952bb22084b58e7bb718890935b73103f33adf5e4d99cd262f929c6eeab96209814f0dbae50a +a5c66cfab3d9ebf733c4af24bebc97070e7989fe3c73e79ac85fb0e4d40ae44fb571e0fad4ad72560e13ed453900d14f +9362e6b50b43dbefbc3254471372297b5dcce809cd3b60bf74a1268ab68bdb50e46e462cbd78f0d6c056330e982846af +854630d08e3f0243d570cc2e856234cb4c1a158d9c1883bf028a76525aaa34be897fe918d5f6da9764a3735fa9ebd24a +8c7d246985469ff252c3f4df6c7c9196fc79f05c1c66a609d84725c78001d0837c7a7049394ba5cf7e863e2d58af8417 +ae050271e01b528925302e71903f785b782f7bf4e4e7a7f537140219bc352dc7540c657ed03d3a297ad36798ecdb98cd +8d2ae9179fcf2b0c69850554580b52c1f4a5bd865af5f3028f222f4acad9c1ad69a8ef6c7dc7b03715ee5c506b74325e +b8ef8de6ce6369a8851cd36db0ccf00a85077e816c14c4e601f533330af9e3acf0743a95d28962ed8bfcfc2520ef3cfe +a6ecad6fdfb851b40356a8b1060f38235407a0f2706e7b8bb4a13465ca3f81d4f5b99466ac2565c60af15f022d26732e +819ff14cdea3ab89d98e133cd2d0379361e2e2c67ad94eeddcdb9232efd509f51d12f4f03ebd4dd953bd262a886281f7 +8561cd0f7a6dbcddd83fcd7f472d7dbcba95b2d4fb98276f48fccf69f76d284e626d7e41314b633352df8e6333fd52a1 +b42557ccce32d9a894d538c48712cb3e212d06ac05cd5e0527ccd2db1078ee6ae399bf6a601ffdab1f5913d35fc0b20c +89b4008d767aad3c6f93c349d3b956e28307311a5b1cec237e8d74bb0dee7e972c24f347fd56afd915a2342bd7bc32f0 +877487384b207e53f5492f4e36c832c2227f92d1bb60542cfeb35e025a4a7afc2b885fae2528b33b40ab09510398f83e +8c411050b63c9053dd0cd81dacb48753c3d7f162028098e024d17cd6348482703a69df31ad6256e3d25a8bbf7783de39 +a8506b54a88d17ac10fb1b0d1fe4aa40eae7553a064863d7f6b52ccc4236dd4b82d01dca6ba87da9a239e3069ba879fb +b1a24caef9df64750c1350789bb8d8a0db0f39474a1c74ea9ba064b1516db6923f00af8d57c632d58844fb8786c3d47a +959d6e255f212b0708c58a2f75cb1fe932248c9d93424612c1b8d1e640149656059737e4db2139afd5556bcdacf3eda2 +84525af21a8d78748680b6535bbc9dc2f0cf9a1d1740d12f382f6ecb2e73811d6c1da2ad9956070b1a617c61fcff9fe5 +b74417d84597a485d0a8e1be07bf78f17ebb2e7b3521b748f73935b9afbbd82f34b710fb7749e7d4ab55b0c7f9de127d +a4a9aecb19a6bab167af96d8b9d9aa5308eab19e6bfb78f5a580f9bf89bdf250a7b52a09b75f715d651cb73febd08e84 +9777b30be2c5ffe7d29cc2803a562a32fb43b59d8c3f05a707ab60ec05b28293716230a7d264d7cd9dd358fc031cc13e +95dce7a3d4f23ac0050c510999f5fbf8042f771e8f8f94192e17bcbfa213470802ebdbe33a876cb621cf42e275cbfc8b +b0b963ebcbbee847ab8ae740478544350b3ac7e86887e4dfb2299ee5096247cd2b03c1de74c774d9bde94ae2ee2dcd59 +a4ab20bafa316030264e13f7ef5891a2c3b29ab62e1668fcb5881f50a9acac6adbe3d706c07e62f2539715db768f6c43 +901478a297669d608e406fe4989be75264b6c8be12169aa9e0ad5234f459ca377f78484ffd2099a2fe2db5e457826427 +88c76e5c250810c057004a03408b85cd918e0c8903dc55a0dd8bb9b4fc2b25c87f9b8cf5943eb19fbbe99d36490050c5 +91607322bbad4a4f03fc0012d0821eff5f8c516fda45d1ec1133bface6f858bf04b25547be24159cab931a7aa08344d4 +843203e07fce3c6c81f84bc6dc5fb5e9d1c50c8811ace522dc66e8658433a0ef9784c947e6a62c11bf705307ef05212e +91dd8813a5d6dddcda7b0f87f672b83198cd0959d8311b2b26fb1fae745185c01f796fbd03aad9db9b58482483fdadd8 +8d15911aacf76c8bcd7136e958febd6963104addcd751ce5c06b6c37213f9c4fb0ffd4e0d12c8e40c36d658999724bfd +8a36c5732d3f1b497ebe9250610605ee62a78eaa9e1a45f329d09aaa1061131cf1d9df00f3a7d0fe8ad614a1ff9caaae +a407d06affae03660881ce20dab5e2d2d6cddc23cd09b95502a9181c465e57597841144cb34d22889902aff23a76d049 +b5fd856d0578620a7e25674d9503be7d97a2222900e1b4738c1d81ff6483b144e19e46802e91161e246271f90270e6cf +91b7708869cdb5a7317f88c0312d103f8ce90be14fb4f219c2e074045a2a83636fdc3e69e862049fc7c1ef000e832541 +b64719cc5480709d1dae958f1d3082b32a43376da446c8f9f64cb02a301effc9c34d9102051733315a8179aed94d53cc +94347a9542ff9d18f7d9eaa2f4d9b832d0e535fe49d52aa2de08aa8192400eddabdb6444a2a78883e27c779eed7fdf5a +840ef44a733ff1376466698cd26f82cf56bb44811e196340467f932efa3ae1ef9958a0701b3b032f50fd9c1d2aed9ab5 +90ab3f6f67688888a31ffc2a882bb37adab32d1a4b278951a21646f90d03385fc976715fc639a785d015751171016f10 +b56f35d164c24b557dbcbc8a4bfa681ec916f8741ffcb27fb389c164f4e3ed2be325210ef5bdaeae7a172ca9599ab442 +a7921a5a80d7cf6ae81ba9ee05e0579b18c20cd2852762c89d6496aa4c8ca9d1ca2434a67b2c16d333ea8e382cdab1e3 +a506bcfbd7e7e5a92f68a1bd87d07ad5fe3b97aeee40af2bf2cae4efcd77fff03f872732c5b7883aa6584bee65d6f8cb +a8c46cff58931a1ce9cbe1501e1da90b174cddd6d50f3dfdfb759d1d4ad4673c0a8feed6c1f24c7af32865a7d6c984e5 +b45686265a83bff69e312c5149db7bb70ac3ec790dc92e392b54d9c85a656e2bf58596ce269f014a906eafc97461aa5f +8d4009a75ccb2f29f54a5f16684b93202c570d7a56ec1a8b20173269c5f7115894f210c26b41e8d54d4072de2d1c75d0 +aef8810af4fc676bf84a0d57b189760ddc3375c64e982539107422e3de2580b89bd27aa6da44e827b56db1b5555e4ee8 +888f0e1e4a34f48eb9a18ef4de334c27564d72f2cf8073e3d46d881853ac1424d79e88d8ddb251914890588937c8f711 +b64b0aa7b3a8f6e0d4b3499fe54e751b8c3e946377c0d5a6dbb677be23736b86a7e8a6be022411601dd75012012c3555 +8d57776f519f0dd912ea14f79fbab53a30624e102f9575c0bad08d2dc754e6be54f39b11278c290977d9b9c7c0e1e0ad +a018fc00d532ceb2e4de908a15606db9b6e0665dd77190e2338da7c87a1713e6b9b61554e7c1462f0f6d4934b960b15c +8c932be83ace46f65c78e145b384f58e41546dc0395270c1397874d88626fdeda395c8a289d602b4c312fe98c1311856 +89174838e21639d6bdd91a0621f04dc056907b88e305dd66e46a08f6d65f731dea72ae87ca5e3042d609e8de8de9aa26 +b7b7f508bb74f7a827ac8189daa855598ff1d96fa3a02394891fd105d8f0816224cd50ac4bf2ed1cf469ace516c48184 +b31877ad682583283baadd68dc1bebd83f5748b165aadd7fe9ef61a343773b88bcd3a022f36d6c92f339b7bfd72820a9 +b79d77260b25daf9126dab7a193df2d7d30542786fa1733ffaf6261734770275d3ca8bae1d9915d1181a78510b3439db +91894fb94cd4c1dd2ceaf9c53a7020c5799ba1217cf2d251ea5bc91ed26e1159dd758e98282ebe35a0395ef9f1ed15a0 +ab59895cdafd33934ceedfc3f0d5d89880482cba6c99a6db93245f9e41987efd76e0640e80aef31782c9a8c7a83fccec +aa22ea63654315e033e09d4d4432331904a6fc5fb1732557987846e3c564668ca67c60a324b4af01663a23af11a9ce4b +b53ba3ef342601467e1f71aa280e100fbabbd38518fa0193e0099505036ee517c1ac78e96e9baeb549bb6879bb698fb0 +943fd69fd656f37487cca3605dc7e5a215fddd811caf228595ec428751fc1de484a0cb84c667fe4d7c35599bfa0e5e34 +9353128b5ebe0dddc555093cf3e5942754f938173541033e8788d7331fafc56f68d9f97b4131e37963ab7f1c8946f5f1 +a76cd3c566691f65cfb86453b5b31dbaf3cab8f84fe1f795dd1e570784b9b01bdd5f0b3c1e233942b1b5838290e00598 +983d84b2e53ffa4ae7f3ba29ef2345247ea2377686b74a10479a0ef105ecf90427bf53b74c96dfa346d0f842b6ffb25b +92e0fe9063306894a2c6970c001781cff416c87e87cb5fbac927a3192655c3da4063e6fa93539f6ff58efac6adcc5514 +b00a81f03c2b8703acd4e2e4c21e06973aba696415d0ea1a648ace2b0ea19b242fede10e4f9d7dcd61c546ab878bc8f9 +b0d08d880f3b456a10bf65cff983f754f545c840c413aea90ce7101a66eb0a0b9b1549d6c4d57725315828607963f15a +90cb64d03534f913b411375cce88a9e8b1329ce67a9f89ca5df8a22b8c1c97707fec727dbcbb9737f20c4cf751359277 +8327c2d42590dfcdb78477fc18dcf71608686ad66c49bce64d7ee874668be7e1c17cc1042a754bbc77c9daf50b2dae07 +8532171ea13aa7e37178e51a6c775da469d2e26ec854eb16e60f3307db4acec110d2155832c202e9ba525fc99174e3b0 +83ca44b15393d021de2a511fa5511c5bd4e0ac7d67259dce5a5328f38a3cce9c3a269405959a2486016bc27bb140f9ff +b1d36e8ca812be545505c8214943b36cabee48112cf0de369957afa796d37f86bf7249d9f36e8e990f26f1076f292b13 +9803abf45be5271e2f3164c328d449efc4b8fc92dfc1225d38e09630909fe92e90a5c77618daa5f592d23fc3ad667094 +b268ad68c7bf432a01039cd889afae815c3e120f57930d463aece10af4fd330b5bd7d8869ef1bcf6b2e78e4229922edc +a4c91a0d6f16b1553264592b4cbbbf3ca5da32ab053ffbdd3dbb1aed1afb650fb6e0dc5274f71a51d7160856477228db +ad89d043c2f0f17806277ffdf3ecf007448e93968663f8a0b674254f36170447b7527d5906035e5e56f4146b89b5af56 +8b6964f757a72a22a642e4d69102951897e20c21449184e44717bd0681d75f7c5bfa5ee5397f6e53febf85a1810d6ed1 +b08f5cdaabec910856920cd6e836c830b863eb578423edf0b32529488f71fe8257d90aed4a127448204df498b6815d79 +af26bb3358be9d280d39b21d831bb53145c4527a642446073fee5a86215c4c89ff49a3877a7a549486262f6f57a0f476 +b4010b37ec4d7c2af20800e272539200a6b623ae4636ecbd0e619484f4ab9240d02bc5541ace3a3fb955dc0a3d774212 +82752ab52bdcc3cc2fc405cb05a2e694d3df4a3a68f2179ec0652536d067b43660b96f85f573f26fbd664a9ef899f650 +96d392dde067473a81faf2d1fea55b6429126b88b160e39b4210d31d0a82833ffd3a80e07d24d495aea2d96be7251547 +a76d8236d6671204d440c33ac5b8deb71fa389f6563d80e73be8b043ec77d4c9b06f9a586117c7f957f4af0331cbc871 +b6c90961f68b5e385d85c9830ec765d22a425f506904c4d506b87d8944c2b2c09615e740ed351df0f9321a7b93979cae +a6ec5ea80c7558403485b3b1869cdc63bde239bafdf936d9b62a37031628402a36a2cfa5cfbb8e26ac922cb0a209b3ba +8c3195bbdbf9bc0fc95fa7e3d7f739353c947f7767d1e3cb24d8c8602d8ea0a1790ac30b815be2a2ba26caa5227891e2 +a7f8a63d809f1155722c57f375ea00412b00147776ae4444f342550279ef4415450d6f400000a326bf11fea6c77bf941 +97fa404df48433a00c85793440e89bb1af44c7267588ae937a1f5d53e01e1c4d4fc8e4a6d517f3978bfdd6c2dfde012f +a984a0a3836de3d8d909c4629a2636aacb85393f6f214a2ef68860081e9db05ad608024762db0dc35e895dc00e2d4cdd +9526cf088ab90335add1db4d3a4ac631b58cbfbe88fa0845a877d33247d1cfeb85994522e1eb8f8874651bfb1df03e2a +ac83443fd0afe99ad49de9bf8230158c118e2814c9c89db5ac951c240d6c2ce45e7677221279d9e97848ec466b99aafe +aeeefdbaba612e971697798ceaf63b247949dc823a0ad771ae5b988a5e882b338a98d3d0796230f49d533ec5ba411b39 +ae3f248b5a7b0f92b7820a6c5ae21e5bd8f4265d4f6e21a22512079b8ee9be06393fd3133ce8ebac0faf23f4f8517e36 +a64a831b908eee784b8388b45447d2885ec0551b26b0c2b15e5f417d0a12c79e867fb7bd3d008d0af98b44336f8ec1ad +b242238cd8362b6e440ba21806905714dd55172db25ec7195f3fc4937b2aba146d5cbf3cf691a1384b4752dc3b54d627 +819f97f337eea1ffb2a678cc25f556f1aab751c6b048993a1d430fe1a3ddd8bb411c152e12ca60ec6e057c190cd1db9a +b9d7d187407380df54ee9fef224c54eec1bfabf17dc8abf60765b7951f538f59aa26fffd5846cfe05546c35f59b573f4 +aa6e3c14efa6a5962812e3f94f8ce673a433f4a82d07a67577285ea0eaa07f8be7115853122d12d6d4e1fdf64c504be1 +82268bee9c1662d3ddb5fb785abfae6fb8b774190f30267f1d47091d2cd4b3874db4372625aa36c32f27b0eee986269b +b236459565b7b966166c4a35b2fa71030b40321821b8e96879d95f0e83a0baf33fa25721f30af4a631df209e25b96061 +8708d752632d2435d2d5b1db4ad1fa2558d776a013655f88e9a3556d86b71976e7dfe5b8834fdec97682cd94560d0d0d +ae1424a68ae2dbfb0f01211f11773732a50510b5585c1fb005cb892b2c6a58f4a55490b5c5b4483c6fce40e9d3236a52 +b3f5f722af9dddb07293c871ce97abbccba0093ca98c8d74b1318fa21396fc1b45b69c15084f63d728f9908442024506 +9606f3ce5e63886853ca476dc0949e7f1051889d529365c0cb0296fdc02abd088f0f0318ecd2cf36740a3634132d36f6 +b11a833a49fa138db46b25ff8cdda665295226595bc212c0931b4931d0a55c99da972c12b4ef753f7e37c6332356e350 +afede34e7dab0a9e074bc19a7daddb27df65735581ca24ad70c891c98b1349fcebbcf3ba6b32c2617fe06a5818dabc2d +97993d456e459e66322d01f8eb13918979761c3e8590910453944bdff90b24091bb018ac6499792515c9923be289f99f +977e3e967eff19290a192cd11df3667d511b398fb3ac9a5114a0f3707e25a0edcb56105648b1b85a8b7519fc529fc6f6 +b873a7c88bf58731fe1bf61ff6828bf114cf5228f254083304a4570e854e83748fc98683ddba62d978fff7909f2c5c47 +ad4b2691f6f19da1d123aaa23cca3e876247ed9a4ab23c599afdbc0d3aa49776442a7ceaa996ac550d0313d9b9a36cee +b9210713c78e19685608c6475bfa974b57ac276808a443f8b280945c5d5f9c39da43effa294bfb1a6c6f7b6b9f85bf6c +a65152f376113e61a0e468759de38d742caa260291b4753391ee408dea55927af08a4d4a9918600a3bdf1df462dffe76 +8bf8c27ad5140dde7f3d2280fd4cc6b29ab76537e8d7aa7011a9d2796ee3e56e9a60c27b5c2da6c5e14fc866301dc195 +92fde8effc9f61393a2771155812b863cff2a0c5423d7d40aa04d621d396b44af94ddd376c28e7d2f53c930aea947484 +97a01d1dd9ee30553ce676011aea97fa93d55038ada95f0057d2362ae9437f3ed13de8290e2ff21e3167dd7ba10b9c3f +89affffaa63cb2df3490f76f0d1e1d6ca35c221dd34057176ba739fa18d492355e6d2a5a5ad93a136d3b1fed0bb8aa19 +928b8e255a77e1f0495c86d3c63b83677b4561a5fcbbe5d3210f1e0fc947496e426d6bf3b49394a5df796c9f25673fc4 +842a0af91799c9b533e79ee081efe2a634cac6c584c2f054fb7d1db67dde90ae36de36cbf712ec9cd1a0c7ee79e151ea +a65b946cf637e090baf2107c9a42f354b390e7316beb8913638130dbc67c918926eb87bec3b1fe92ef72bc77a170fa3b +aafc0f19bfd71ab5ae4a8510c7861458b70ad062a44107b1b1dbacbfa44ba3217028c2824bd7058e2fa32455f624040b +95269dc787653814e0be899c95dba8cfa384f575a25e671c0806fd80816ad6797dc819d30ae06e1d0ed9cb01c3950d47 +a1e760f7fa5775a1b2964b719ff961a92083c5c617f637fc46e0c9c20ab233f8686f7f38c3cb27d825c54dd95e93a59b +ac3b8a7c2317ea967f229eddc3e23e279427f665c4705c7532ed33443f1243d33453c1088f57088d2ab1e3df690a9cc9 +b787beeddfbfe36dd51ec4efd9cf83e59e84d354c3353cc9c447be53ae53d366ed1c59b686e52a92f002142c8652bfe0 +b7a64198300cb6716aa7ac6b25621f8bdec46ad5c07a27e165b3f774cdf65bcfdbf31e9bae0c16b44de4b00ada7a4244 +b8ae9f1452909e0c412c7a7fe075027691ea8df1347f65a5507bc8848f1d2c833d69748076db1129e5b4fb912f65c86c +9682e41872456b9fa67def89e71f06d362d6c8ca85c9c48536615bc401442711e1c9803f10ab7f8ab5feaec0f9df20a6 +88889ff4e271dc1c7e21989cc39f73cde2f0475acd98078281591ff6c944fadeb9954e72334319050205d745d4df73df +8f79b5b8159e7fd0d93b0645f3c416464f39aec353b57d99ecf24f96272df8a068ad67a6c90c78d82c63b40bb73989bb +838c01a009a3d8558a3f0bdd5e22de21af71ca1aefc8423c91dc577d50920e9516880e87dce3e6d086e11cd45c9052d9 +b97f1c6eee8a78f137c840667cc288256e39294268a3009419298a04a1d0087c9c9077b33c917c65caf76637702dda8a +972284ce72f96a61c899260203dfa06fc3268981732bef74060641c1a5068ead723e3399431c247ca034b0dae861e8df +945a8d52d6d3db6663dbd3110c6587f9e9c44132045eeffba15621576d178315cb52870fa5861669f84f0bee646183fe +a0a547b5f0967b1c3e5ec6c6a9a99f0578521489180dfdfbb5561f4d166baac43a2f06f950f645ce991664e167537eed +a0592cda5cdddf1340033a745fd13a6eff2021f2e26587116c61c60edead067e0f217bc2bef4172a3c9839b0b978ab35 +b9c223b65a3281587fa44ec829e609154b32f801fd1de6950e01eafb07a8324243b960d5735288d0f89f0078b2c42b5b +99ebfc3b8f9f98249f4d37a0023149ed85edd7a5abe062c8fb30c8c84555258b998bdcdd1d400bc0fa2a4aaa8b224466 +955b68526e6cb3937b26843270f4e60f9c6c8ece2fa9308fe3e23afa433309c068c66a4bc16ee2cf04220f095e9afce4 +b766caeafcc00378135ae53397f8a67ed586f5e30795462c4a35853de6681b1f17401a1c40958de32b197c083b7279c1 +921bf87cad947c2c33fa596d819423c10337a76fe5a63813c0a9dc78a728207ae7b339407a402fc4d0f7cba3af6da6fc +a74ba1f3bc3e6c025db411308f49b347ec91da1c916bda9da61e510ec8d71d25e0ac0f124811b7860e5204f93099af27 +a29b4d144e0bf17a7e8353f2824cef0ce85621396babe8a0b873ca1e8a5f8d508b87866cf86da348470649fceefd735c +a8040e12ffc3480dd83a349d06741d1572ef91932c46f5cf03aee8454254156ee95786fd013d5654725e674c920cec32 +8c4cf34ca60afd33923f219ffed054f90cd3f253ffeb2204a3b61b0183417e366c16c07fae860e362b0f2bfe3e1a1d35 +8195eede4ddb1c950459df6c396b2e99d83059f282b420acc34220cadeed16ab65c856f2c52568d86d3c682818ed7b37 +91fff19e54c15932260aa990c7fcb3c3c3da94845cc5aa8740ef56cf9f58d19b4c3c55596f8d6c877f9f4d22921d93aa +a3e0bf7e5d02a80b75cf75f2db7e66cb625250c45436e3c136d86297d652590ec97c2311bafe407ad357c79ab29d107b +81917ff87e5ed2ae4656b481a63ced9e6e5ff653b8aa6b7986911b8bc1ee5b8ef4f4d7882c3f250f2238e141b227e510 +915fdbe5e7de09c66c0416ae14a8750db9412e11dc576cf6158755fdcaf67abdbf0fa79b554cac4fe91c4ec245be073f +8df27eafb5c3996ba4dc5773c1a45ca77e626b52e454dc1c4058aa94c2067c18332280630cc3d364821ee53bf2b8c130 +934f8a17c5cbb827d7868f5c8ca00cb027728a841000a16a3428ab16aa28733f16b52f58c9c4fbf75ccc45df72d9c4df +b83f4da811f9183c25de8958bc73b504cf790e0f357cbe74ef696efa7aca97ad3b7ead1faf76e9f982c65b6a4d888fc2 +87188213c8b5c268dc2b6da413f0501c95749e953791b727450af3e43714149c115b596b33b63a2f006a1a271b87efd0 +83e9e888ab9c3e30761de635d9aabd31248cdd92f7675fc43e4b21fd96a03ec1dc4ad2ec94fec857ffb52683ac98e360 +b4b9a1823fe2d983dc4ec4e3aaea297e581c3fc5ab4b4af5fa1370caa37af2d1cc7fc6bfc5e7da60ad8fdce27dfe4b24 +856388bc78aef465dbcdd1f559252e028c9e9a2225c37d645c138e78f008f764124522705822a61326a6d1c79781e189 +a6431b36db93c3b47353ba22e7c9592c9cdfb9cbdd052ecf2cc3793f5b60c1e89bc96e6bae117bfd047f2308da00dd2f +b619972d48e7e4291542dcde08f7a9cdc883c892986ded2f23ccb216e245cd8d9ad1d285347b0f9d7611d63bf4cee2bc +8845cca6ff8595955f37440232f8e61d5351500bd016dfadd182b9d39544db77a62f4e0102ff74dd4173ae2c181d24ef +b2f5f7fa26dcd3b6550879520172db2d64ee6aaa213cbef1a12befbce03f0973a22eb4e5d7b977f466ac2bf8323dcedd +858b7f7e2d44bdf5235841164aa8b4f3d33934e8cb122794d90e0c1cac726417b220529e4f896d7b77902ab0ccd35b3a +80b0408a092dae2b287a5e32ea1ad52b78b10e9c12f49282976cd738f5d834e03d1ad59b09c5ccaccc39818b87d06092 +b996b0a9c6a2d14d984edcd6ab56bc941674102980d65b3ad9733455f49473d3f587c8cbf661228a7e125ddbe07e3198 +90224fcebb36865293bd63af786e0c5ade6b67c4938d77eb0cbae730d514fdd0fe2d6632788e858afd29d46310cf86df +b71351fdfff7168b0a5ec48397ecc27ac36657a8033d9981e97002dcca0303e3715ce6dd3f39423bc8ef286fa2e9e669 +ae2a3f078b89fb753ce4ed87e0c1a58bb19b4f0cfb6586dedb9fcab99d097d659a489fb40e14651741e1375cfc4b6c5f +8ef476b118e0b868caed297c161f4231bbeb863cdfa5e2eaa0fc6b6669425ce7af50dc374abceac154c287de50c22307 +92e46ab472c56cfc6458955270d3c72b7bde563bb32f7d4ab4d959db6f885764a3d864e1aa19802fefaa5e16b0cb0b54 +96a3f68323d1c94e73d5938a18a377af31b782f56212de3f489d22bc289cf24793a95b37f1d6776edf88114b5c1fa695 +962cc068cfce6faaa27213c4e43e44eeff0dfbb6d25b814e82c7da981fb81d7d91868fa2344f05fb552362f98cfd4a72 +895d4e4c4ad670abf66d43d59675b1add7afad7438ada8f42a0360c704cee2060f9ac15b4d27e9b9d0996bb801276fe3 +b3ad18d7ece71f89f2ef749b853c45dc56bf1c796250024b39a1e91ed11ca32713864049c9aaaea60cde309b47486bbf +8f05404e0c0258fdbae50e97ccb9b72ee17e0bd2400d9102c0dad981dac8c4c71585f03e9b5d50086d0a2d3334cb55d1 +8bd877e9d4591d02c63c6f9fc9976c109de2d0d2df2bfa5f6a3232bab5b0b8b46e255679520480c2d7a318545efa1245 +8d4c16b5d98957c9da13d3f36c46f176e64e5be879f22be3179a2c0e624fe4758a82bf8c8027410002f973a3b84cd55a +86e2a8dea86427b424fa8eada881bdff896907084a495546e66556cbdf070b78ba312bf441eb1be6a80006d25d5097a3 +8608b0c117fd8652fdab0495b08fadbeba95d9c37068e570de6fddfef1ba4a1773b42ac2be212836141d1bdcdef11a17 +a13d6febf5fb993ae76cae08423ca28da8b818d6ef0fde32976a4db57839cd45b085026b28ee5795f10a9a8e3098c683 +8e261967fa6de96f00bc94a199d7f72896a6ad8a7bbb1d6187cca8fad824e522880e20f766620f4f7e191c53321d70f9 +8b8e8972ac0218d7e3d922c734302803878ad508ca19f5f012bc047babd8a5c5a53deb5fe7c15a4c00fd6d1cb9b1dbd0 +b5616b233fb3574a2717d125a434a2682ff68546dccf116dd8a3b750a096982f185614b9fb6c7678107ff40a451f56fa +aa6adf9b0c3334b0d0663f583a4914523b2ac2e7adffdb026ab9109295ff6af003ef8357026dbcf789896d2afded8d73 +acb72df56a0b65496cd534448ed4f62950bb1e11e50873b6ed349c088ee364441821294ce0f7c61bd7d38105bea3b442 +abae12df83e01ec947249fedd0115dc501d2b03ff7232092979eda531dbbca29ace1d46923427c7dde4c17bdf3fd7708 +820b4fc2b63a9fda7964acf5caf19a2fc4965007cb6d6b511fcafcb1f71c3f673a1c0791d3f86e3a9a1eb6955b191cc0 +af277259d78c6b0f4f030a10c53577555df5e83319ddbad91afbd7c30bc58e7671c56d00d66ec3ab5ef56470cd910cee +ad4a861c59f1f5ca1beedd488fb3d131dea924fffd8e038741a1a7371fad7370ca5cf80dc01f177fbb9576713bb9a5b3 +b67a5162982ce6a55ccfb2f177b1ec26b110043cf18abd6a6c451cf140b5af2d634591eb4f28ad92177d8c7e5cd0a5e8 +96176d0a83816330187798072d449cbfccff682561e668faf6b1220c9a6535b32a6e4f852e8abb00f79abb87493df16b +b0afe6e7cb672e18f0206e4423f51f8bd0017bf464c4b186d46332c5a5847647f89ff7fa4801a41c1b0b42f6135bcc92 +8fc5e7a95ef20c1278c645892811f6fe3f15c431ebc998a32ec0da44e7213ea934ed2be65239f3f49b8ec471e9914160 +b7793e41adda6c82ba1f2a31f656f6205f65bf8a3d50d836ee631bc7ce77c153345a2d0fc5c60edf8b37457c3729c4ec +a504dd7e4d6b2f4379f22cc867c65535079c75ccc575955f961677fa63ecb9f74026fa2f60c9fb6323c1699259e5e9c8 +ab899d00ae693649cc1afdf30fb80d728973d2177c006e428bf61c7be01e183866614e05410041bc82cb14a33330e69c +8a3bd8b0b1be570b65c4432a0f6dc42f48a2000e30ab089cf781d38f4090467b54f79c0d472fcbf18ef6a00df69cc6f3 +b4d7028f7f76a96a3d7803fca7f507ae11a77c5346e9cdfccb120a833a59bda1f4264e425aa588e7a16f8e7638061d84 +b9c7511a76ea5fb105de905d44b02edb17008335766ee357ed386b7b3cf19640a98b38785cb14603c1192bee5886c9b6 +8563afb12e53aed71ac7103ab8602bfa8371ae095207cb0d59e8fd389b6ad1aff0641147e53cb6a7ca16c7f37c9c5e6b +8e108be614604e09974a9ed90960c28c4ea330a3d9a0cb4af6dd6f193f84ab282b243ecdf549b3131036bebc8905690c +b794d127fbedb9c5b58e31822361706ffac55ce023fbfe55716c3c48c2fd2f2c7660a67346864dfe588812d369cb50b6 +b797a3442fc3b44f41baefd30346f9ac7f96e770d010d53c146ce74ce424c10fb62758b7e108b8abfdc5fafd89d745cb +993bb71e031e8096442e6205625e1bfddfe6dd6a83a81f3e2f84fafa9e5082ab4cad80a099f21eff2e81c83457c725c3 +8711ab833fc03e37acf2e1e74cfd9133b101ff4144fe30260654398ae48912ab46549d552eb9d15d2ea57760d35ac62e +b21321fd2a12083863a1576c5930e1aecb330391ef83326d9d92e1f6f0d066d1394519284ddab55b2cb77417d4b0292f +877d98f731ffe3ee94b0b5b72d127630fa8a96f6ca4f913d2aa581f67732df6709493693053b3e22b0181632ac6c1e3b +ae391c12e0eb8c145103c62ea64f41345973311c3bf7281fa6bf9b7faafac87bcf0998e5649b9ef81e288c369c827e07 +b83a2842f36998890492ab1cd5a088d9423d192681b9a3a90ec518d4c541bce63e6c5f4df0f734f31fbfdd87785a2463 +a21b6a790011396e1569ec5b2a423857b9bec16f543e63af28024e116c1ea24a3b96e8e4c75c6537c3e4611fd265e896 +b4251a9c4aab3a495da7a42e684ba4860dbcf940ad1da4b6d5ec46050cbe8dab0ab9ae6b63b5879de97b905723a41576 +8222f70aebfe6ac037f8543a08498f4cadb3edaac00336fc00437eb09f2cba758f6c38e887cc634b4d5b7112b6334836 +86f05038e060594c46b5d94621a1d9620aa8ba59a6995baf448734e21f58e23c1ea2993d3002ad5250d6edd5ba59b34f +a7c0c749baef811ab31b973c39ceb1d94750e2bc559c90dc5eeb20d8bb6b78586a2b363c599ba2107d6be65cd435f24e +861d46a5d70b38d6c1cd72817a2813803d9f34c00320c8b62f8b9deb67f5b5687bc0b37c16d28fd017367b92e05da9ca +b3365d3dab639bffbe38e35383686a435c8c88b397b717cd4aeced2772ea1053ceb670f811f883f4e02975e5f1c4ac58 +a5750285f61ab8f64cd771f6466e2c0395e01b692fd878f2ef2d5c78bdd8212a73a3b1dfa5e4c8d9e1afda7c84857d3b +835a10809ccf939bc46cf950a33b36d71be418774f51861f1cd98a016ade30f289114a88225a2c11e771b8b346cbe6ef +a4f59473a037077181a0a62f1856ec271028546ca9452b45cedfcb229d0f4d1aabfc13062b07e536cc8a0d4b113156a2 +95cd14802180b224d44a73cc1ed599d6c4ca62ddcaa503513ccdc80aaa8be050cc98bd4b4f3b639549beb4587ac6caf9 +973b731992a3e69996253d7f36dd7a0af1982b5ed21624b77a7965d69e9a377b010d6dabf88a8a97eec2a476259859cc +af8a1655d6f9c78c8eb9a95051aa3baaf9c811adf0ae8c944a8d3fcba87b15f61021f3baf6996fa0aa51c81b3cb69de1 +835aad5c56872d2a2d6c252507b85dd742bf9b8c211ccb6b25b52d15c07245b6d89b2a40f722aeb5083a47cca159c947 +abf4e970b02bef8a102df983e22e97e2541dd3650b46e26be9ee394a3ea8b577019331857241d3d12b41d4eacd29a3ac +a13c32449dbedf158721c13db9539ae076a6ce5aeaf68491e90e6ad4e20e20d1cdcc4a89ed9fd49cb8c0dd50c17633c1 +8c8f78f88b7e22dd7e9150ab1c000f10c28e696e21d85d6469a6fe315254740f32e73d81ab1f3c1cf8f544c86df506e8 +b4b77f2acfe945abf81f2605f906c10b88fb4d28628487fb4feb3a09f17f28e9780445dfcee4878349d4c6387a9d17d4 +8d255c235f3812c6ecc646f855fa3832be5cb4dbb9c9e544989fafdf3f69f05bfd370732eaf954012f0044aa013fc9c6 +b982efd3f34b47df37c910148ac56a84e8116647bea24145a49e34e0a6c0176e3284d838dae6230cb40d0be91c078b85 +983f365aa09bd85df2a6a2ad8e4318996b1e27d02090755391d4486144e40d80b1fbfe1c798d626db92f52e33aa634da +95fd1981271f3ea3a41d654cf497e6696730d9ff7369f26bc4d7d15c7adb4823dd0c42e4a005a810af12d234065e5390 +a9f5219bd4b913c186ef30c02f995a08f0f6f1462614ea5f236964e02bdaa33db9d9b816c4aee5829947840a9a07ba60 +9210e6ceb05c09b46fd09d036287ca33c45124ab86315e5d6911ff89054f1101faaa3e83d123b7805056d388bcec6664 +8ed9cbf69c6ff3a5c62dd9fe0d7264578c0f826a29e614bc2fb4d621d90c8c9992438accdd7a614b1dca5d1bb73dc315 +85cf2a8cca93e00da459e3cecd22c342d697eee13c74d5851634844fc215f60053cf84b0e03c327cb395f48d1c71a8a4 +8818a18e9a2ec90a271b784400c1903089ffb0e0b40bc5abbbe12fbebe0f731f91959d98c5519ef1694543e31e2016d4 +8dabc130f296fa7a82870bf9a8405aaf542b222ed9276bba9bd3c3555a0f473acb97d655ee7280baff766a827a8993f0 +ac7952b84b0dc60c4d858f034093b4d322c35959605a3dad2b806af9813a4680cb038c6d7f4485b4d6b2ff502aaeca25 +ad65cb6d57b48a2602568d2ec8010baed0eb440eec7638c5ec8f02687d764e9de5b5d42ad5582934e592b48471c22d26 +a02ab8bd4c3d114ea23aebdd880952f9495912817da8c0c08eabc4e6755439899d635034413d51134c72a6320f807f1c +8319567764b8295402ec1ebef4c2930a138480b37e6d7d01c8b4c9cd1f2fc3f6e9a44ae6e380a0c469b25b06db23305f +afec53b2301dc0caa8034cd9daef78c48905e6068d692ca23d589b84a6fa9ddc2ed24a39480597e19cb3e83eec213b3f +ac0b4ffdb5ae08e586a9cdb98f9fe56f4712af3a97065e89e274feacfb52b53c839565aee93c4cfaaccfe51432c4fab0 +8972cbf07a738549205b1094c5987818124144bf187bc0a85287c94fdb22ce038c0f11df1aa16ec5992e91b44d1af793 +b7267aa6f9e3de864179b7da30319f1d4cb2a3560f2ea980254775963f1523b44c680f917095879bebfa3dc2b603efcf +80f68f4bfc337952e29504ee5149f15093824ea7ab02507efd1317a670f6cbc3611201848560312e3e52e9d9af72eccf +8897fee93ce8fc1e1122e46b6d640bba309384dbd92e46e185e6364aa8210ebf5f9ee7e5e604b6ffba99aa80a10dd7d0 +b58ea6c02f2360be60595223d692e82ee64874fda41a9f75930f7d28586f89be34b1083e03bbc1575bbfdda2d30db1ea +85a523a33d903280d70ac5938770453a58293480170c84926457ac2df45c10d5ff34322ab130ef4a38c916e70d81af53 +a2cbf045e1bed38937492c1f2f93a5ba41875f1f262291914bc1fc40c60bd0740fb3fea428faf6da38b7c180fe8ac109 +8c09328770ed8eb17afc6ac7ddd87bb476de18ed63cab80027234a605806895959990c47bd10d259d7f3e2ecb50074c9 +b4b9e19edb4a33bde8b7289956568a5b6b6557404e0a34584b5721fe6f564821091013fbb158e2858c6d398293bb4b59 +8a47377df61733a2aa5a0e945fce00267f8e950f37e109d4487d92d878fb8b573317bb382d902de515b544e9e233458d +b5804c9d97efeff5ca94f3689b8088c62422d92a1506fd1d8d3b1b30e8a866ad0d6dad4abfa051dfc4471250cac4c5d9 +9084a6ee8ec22d4881e9dcc8a9eb3c2513523d8bc141942370fd191ad2601bf9537a0b1e84316f3209b3d8a54368051e +85447eea2fa26656a649f8519fa67279183044791d61cf8563d0783d46d747d96af31d0a93507bbb2242666aa87d3720 +97566a84481027b60116c751aec552adfff2d9038e68d48c4db9811fb0cbfdb3f1d91fc176a0b0d988a765f8a020bce1 +ae87e5c1b9e86c49a23dceda4ecfd1dcf08567f1db8e5b6ec752ebd45433c11e7da4988573cdaebbb6f4135814fc059e +abee05cf9abdbc52897ac1ce9ed157f5466ed6c383d6497de28616238d60409e5e92619e528af8b62cc552bf09970dc2 +ae6d31cd7bf9599e5ee0828bab00ceb4856d829bba967278a73706b5f388465367aa8a6c7da24b5e5f1fdd3256ef8e63 +ac33e7b1ee47e1ee4af472e37ab9e9175260e506a4e5ce449788075da1b53c44cb035f3792d1eea2aa24b1f688cc6ed3 +80f65b205666b0e089bb62152251c48c380a831e5f277f11f3ef4f0d52533f0851c1b612267042802f019ec900dc0e8f +858520ad7aa1c9fed738e3b583c84168f2927837ad0e1d326afe9935c26e9b473d7f8c382e82ef1fe37d2b39bb40a1ee +b842dd4af8befe00a97c2d0f0c33c93974761e2cb9e5ab8331b25170318ddd5e4bdbc02d8f90cbfdd5f348f4f371c1f7 +8bf2cb79bc783cb57088aae7363320cbeaabd078ffdec9d41bc74ff49e0043d0dad0086a30e5112b689fd2f5a606365d +982eb03bbe563e8850847cd37e6a3306d298ab08c4d63ab6334e6b8c1fa13fce80cf2693b09714c7621d74261a0ff306 +b143edb113dec9f1e5105d4a93fbe502b859e587640d3db2f628c09a17060e6aec9e900e2c8c411cda99bc301ff96625 +af472d9befa750dcebc5428fe1a024f18ec1c07bca0f95643ce6b5f4189892a910285afb03fd7ed7068fbe614e80d33c +a97e3bc57ede73ecd1bbf02de8f51b4e7c1a067da68a3cd719f4ba26a0156cbf1cef2169fd35a18c5a4cced50d475998 +a862253c937cf3d75d7183e5f5be6a4385d526aeda5171c1c60a8381fea79f88f5f52a4fab244ecc70765d5765e6dfd5 +90cb776f8e5a108f1719df4a355bebb04bf023349356382cae55991b31720f0fd03206b895fa10c56c98f52453be8778 +a7614e8d0769dccd520ea4b46f7646e12489951efaef5176bc889e9eb65f6e31758df136b5bf1e9107e68472fa9b46ec +ac3a9b80a3254c42e5ed3a090a0dd7aee2352f480de96ad187027a3bb6c791eddfc3074b6ffd74eea825188f107cda4d +82a01d0168238ef04180d4b6e0a0e39024c02c2d75b065017c2928039e154d093e1af4503f4d1f3d8a948917abb5d09f +8fab000a2b0eef851a483aec8d2dd85fe60504794411a2f73ed82e116960547ac58766cb73df71aea71079302630258d +872451a35c6db61c63e9b8bb9f16b217f985c20be4451c14282c814adb29d7fb13f201367c664435c7f1d4d9375d7a58 +887d9ff54cc96b35d562df4a537ff972d7c4b3fd91ab06354969a4cfede0b9fc68bbffb61d0dbf1a58948dc701e54f5a +8cb5c2a6bd956875d88f41ae24574434f1308514d44057b55c9c70f13a3366ed054150eed0955a38fda3f757be73d55f +89ad0163cad93e24129d63f8e38422b7674632a8d0a9016ee8636184cab177659a676c4ee7efba3abe1a68807c656d60 +b9ec01c7cab6d00359b5a0b4a1573467d09476e05ca51a9227cd16b589a9943d161eef62dcc73f0de2ec504d81f4d252 +8031d17635d39dfe9705c485d2c94830b6fc9bc67b91300d9d2591b51e36a782e77ab5904662effa9382d9cca201f525 +8be5a5f6bc8d680e5092d6f9a6585acbaaaa2ddc671da560dcf5cfa4472f4f184b9597b5b539438accd40dda885687cc +b1fc0f052fae038a2e3de3b3a96b0a1024b009de8457b8b3adb2d315ae68a89af905720108a30038e5ab8d0d97087785 +8b8bdc77bd3a6bc7ca5492b6f8c614852c39a70d6c8a74916eaca0aeb4533b11898b8820a4c2620a97bf35e275480029 +af35f4dc538d4ad5cdf710caa38fd1eb496c3fa890a047b6a659619c5ad3054158371d1e88e0894428282eed9f47f76b +8166454a7089cc07758ad78724654f4e7a1a13e305bbf88ddb86f1a4b2904c4fc8ab872d7da364cdd6a6c0365239e2ad +ab287c7d3addce74ce40491871c768abe01daaa0833481276ff2e56926b38a7c6d2681ffe837d2cc323045ad1a4414f9 +b90317f4505793094d89365beb35537f55a6b5618904236258dd04ca61f21476837624a2f45fef8168acf732cab65579 +98ae5ea27448e236b6657ab5ef7b1cccb5372f92ab25f5fa651fbac97d08353a1dae1b280b1cd42b17d2c6a70a63ab9d +adcf54e752d32cbaa6cb98fbca48d8cd087b1db1d131d465705a0d8042c8393c8f4d26b59006eb50129b21e6240f0c06 +b591a3e4db18a7345fa935a8dd7994bbac5cc270b8ebd84c8304c44484c7a74afb45471fdbe4ab22156a30fae1149b40 +806b53ac049a42f1dcc1d6335505371da0bf27c614f441b03bbf2e356be7b2fb4eed7117eabcce9e427a542eaa2bf7d8 +800482e7a772d49210b81c4a907f5ce97f270b959e745621ee293cf8c71e8989363d61f66a98f2d16914439544ca84c7 +99de9eafdad3617445312341644f2bb888680ff01ce95ca9276b1d2e5ef83fa02dab5e948ebf66c17df0752f1bd37b70 +961ee30810aa4c93ae157fbe9009b8e443c082192bd36a73a6764ff9b2ad8b0948fe9a73344556e01399dd77badb4257 +ae0a361067c52efbe56c8adf982c00432cd478929459fc7f74052c8ee9531cd031fe1335418fde53f7c2ef34254eb7ac +a3503d16b6b27eb20c1b177bcf90d13706169220523a6271b85b2ce35a9a2b9c5bed088540031c0a4ebfdae3a4c6ab04 +909420122c3e723289ca4e7b81c2df5aff312972a2203f4c45821b176e7c862bf9cac7f7df3adf1d59278f02694d06e7 +989f42380ae904b982f85d0c6186c1aef5d6bcba29bcfbb658e811b587eb2749c65c6e4a8cc6409c229a107499a4f5d7 +8037a6337195c8e26a27ea4ef218c6e7d79a9720aaab43932d343192abc2320fe72955f5e431c109093bda074103330a +b312e168663842099b88445e940249cc508f080ab0c94331f672e7760258dbd86be5267e4cf25ea25facb80bff82a7e9 +aaa3ff8639496864fcdbfdda1ac97edc4f08e3c9288b768f6c8073038c9fbbf7e1c4bea169b4d45c31935cdf0680d45e +97dbd3df37f0b481a311dfc5f40e59227720f367912200d71908ef6650f32cc985cb05b981e3eea38958f7e48d10a15d +a89d49d1e267bb452d6cb621b9a90826fe55e9b489c0427b94442d02a16f390eed758e209991687f73f6b5a032321f42 +9530dea4e0e19d6496f536f2e75cf7d814d65fde567055eb20db48fd8d20d501cd2a22fb506db566b94c9ee10f413d43 +81a7009b9e67f1965fa7da6a57591c307de91bf0cd35ab4348dc4a98a4961e096d004d7e7ad318000011dc4342c1b809 +83440a9402b766045d7aca61a58bba2aa29cac1cf718199e472ba086f5d48093d9dda4d135292ba51d049a23964eceae +a06c9ce5e802df14f6b064a3d1a0735d429b452f0e2e276042800b0a4f16df988fd94cf3945921d5dd3802ab2636f867 +b1359e358b89936dee9e678a187aad3e9ab14ac40e96a0a68f70ee2583cdcf467ae03bef4215e92893f4e12f902adec8 +835304f8619188b4d14674d803103d5a3fa594d48e96d9699e653115dd05fdc2dda6ba3641cf7ad53994d448da155f02 +8327cba5a9ff0d3f5cd0ae55e77167448926d5fcf76550c0ad978092a14122723090c51c415e88e42a2b62eb07cc3981 +b373dcdaea85f85ce9978b1426a7ef4945f65f2d3467a9f1cc551a99766aac95df4a09e2251d3f89ca8c9d1a7cfd7b0e +ab1422dc41af2a227b973a6fd124dfcb2367e2a11a21faa1d381d404f51b7257e5bc82e9cf20cd7fe37d7ae761a2ab37 +a93774a03519d2f20fdf2ef46547b0a5b77c137d6a3434b48d56a2cbef9e77120d1b85d0092cf8842909213826699477 +8eb967a495a38130ea28711580b7e61bcd1d051cd9e4f2dbf62f1380bd86e0d60e978d72f6f31e909eb97b3b9a2b867c +ae8213378da1287ba1fe4242e1acaec19b877b6fe872400013c6eac1084b8d03156792fa3020201725b08228a1e80f49 +b143daf6893d674d607772b3b02d8ac48f294237e2f2c87963c0d4e26d9227d94a2a13512457c3d5883544bbc259f0ef +b343bd2aca8973888e42542218924e2dda2e938fd1150d06878af76f777546213912b7c7a34a0f94186817d80ffa185c +b188ebc6a8c3007001aa347ae72cc0b15d09bc6c19a80e386ee4b334734ec0cc2fe8b493c2422f38d1e6d133cc3db6fe +b795f6a8b9b826aaeee18ccd6baf6c5adeeec85f95eb5b6d19450085ec7217e95a2d9e221d77f583b297d0872073ba0e +b1c7dbd998ad32ae57bfa95deafa147024afd57389e98992c36b6e52df915d3d5a39db585141ec2423173e85d212fed8 +812bcdeb9fe5f12d0e1df9964798056e1f1c3de3b17b6bd2919b6356c4b86d8e763c01933efbe0224c86a96d5198a4be +b19ebeda61c23d255cbf472ef0b8a441f4c55b70f0d8ed47078c248b1d3c7c62e076b43b95c00a958ec8b16d5a7cb0d7 +b02adc9aaa20e0368a989c2af14ff48b67233d28ebee44ff3418bb0473592e6b681af1cc45450bd4b175df9051df63d9 +8d87f0714acee522eb58cec00360e762adc411901dba46adc9227124fa70ee679f9a47e91a6306d6030dd4eb8de2f3c1 +8be54cec21e74bcc71de29dc621444263737db15f16d0bb13670f64e42f818154e04b484593d19ef95f2ee17e4b3fe21 +ab8e20546c1db38d31493b5d5f535758afb17e459645c1b70813b1cf7d242fd5d1f4354a7c929e8f7259f6a25302e351 +89f035a1ed8a1e302ac893349ba8ddf967580fcb6e73d44af09e3929cde445e97ff60c87dafe489e2c0ab9c9986cfa00 +8b2b0851a795c19191a692af55f7e72ad2474efdc5401bc3733cfdd910e34c918aaebe69d5ea951bdddf3c01cabbfc67 +a4edb52c2b51495ccd1ee6450fc14b7b3ede8b3d106808929d02fb31475bacb403e112ba9c818d2857651e508b3a7dd1 +9569341fded45d19f00bcf3cbf3f20eb2b4d82ef92aba3c8abd95866398438a2387437e580d8b646f17cf6fde8c5af23 +aa4b671c6d20f72f2f18a939a6ff21cc37e0084b44b4a717f1be859a80b39fb1be026b3205adec2a66a608ec2bcd578f +94902e980de23c4de394ad8aec91b46f888d18f045753541492bfbb92c59d3daa8de37ae755a6853744af8472ba7b72b +af651ef1b2a0d30a7884557edfad95b6b5d445a7561caebdc46a485aedd25932c62c0798465c340a76f6feaa196dd712 +b7b669b8e5a763452128846dd46b530dca4893ace5cc5881c7ddcd3d45969d7e73fbebdb0e78aa81686e5f7b22ec5759 +82507fd4ebe9fa656a7f2e084d64a1fa6777a2b0bc106d686e2d9d2edafc58997e58cb6bfd0453b2bf415704aa82ae62 +b40bce2b42b88678400ecd52955bbdadd15f8b9e1b3751a1a3375dc0efb5ca3ee258cf201e1140b3c09ad41217d1d49e +b0210d0cbb3fbf3b8cdb39e862f036b0ff941cd838e7aaf3a8354e24246e64778d22f3de34572e6b2a580614fb6425be +876693cba4301b251523c7d034108831df3ce133d8be5a514e7a2ca494c268ca0556fa2ad8310a1d92a16b55bcd99ea9 +8660281406d22a4950f5ef050bf71dd3090edb16eff27fa29ef600cdea628315e2054211ed2cc6eaf8f2a1771ef689fd +a610e7e41e41ab66955b809ba4ade0330b8e9057d8efc9144753caed81995edeb1a42a53f93ce93540feca1fae708dac +a49e2c176a350251daef1218efaccc07a1e06203386ede59c136699d25ca5cb2ac1b800c25b28dd05678f14e78e51891 +83e0915aa2b09359604566080d411874af8c993beba97d4547782fdbe1a68e59324b800ff1f07b8db30c71adcbd102a8 +a19e84e3541fb6498e9bb8a099c495cbfcad113330e0262a7e4c6544495bb8a754b2208d0c2d895c93463558013a5a32 +87f2bd49859a364912023aca7b19a592c60214b8d6239e2be887ae80b69ebdeb59742bdebcfa73a586ab23b2c945586c +b8e8fdddae934a14b57bc274b8dcd0d45ebb95ddbaabef4454e0f6ce7d3a5a61c86181929546b3d60c447a15134d08e1 +87e0c31dcb736ea4604727e92dc1d9a3cf00adcff79df3546e02108355260f3dd171531c3c0f57be78d8b28058fcc8c0 +9617d74e8f808a4165a8ac2e30878c349e1c3d40972006f0787b31ea62d248c2d9f3fc3da83181c6e57e95feedfd0e8c +8949e2cee582a2f8db86e89785a6e46bc1565c2d8627d5b6bf43ba71ffadfab7e3c5710f88dcb5fb2fc6edf6f4fae216 +ad3fa7b0edceb83118972a2935a09f409d09a8db3869f30be3a76f67aa9fb379cabb3a3aff805ba023a331cad7d7eb64 +8c95718a4112512c4efbd496be38bf3ca6cdcaad8a0d128f32a3f9aae57f3a57bdf295a3b372a8c549fda8f4707cffed +88f3261d1e28a58b2dee3fcc799777ad1c0eb68b3560f9b4410d134672d9533532a91ea7be28a041784872632d3c9d80 +b47472a41d72dd2e8b72f5c4f8ad626737dde3717f63d6bc776639ab299e564cbad0a2ad5452a07f02ff49a359c437e5 +9896d21dc2e8aad87b76d6df1654f10cd7bceed4884159d50a818bea391f8e473e01e14684814c7780235f28e69dca6e +82d47c332bbd31bbe83b5eb44a23da76d4a7a06c45d7f80f395035822bc27f62f59281d5174e6f8e77cc9b5c3193d6f0 +95c74cd46206e7f70c9766117c34c0ec45c2b0f927a15ea167901a160e1530d8522943c29b61e03568aa0f9c55926c53 +a89d7757825ae73a6e81829ff788ea7b3d7409857b378ebccd7df73fdbe62c8d9073741cf038314971b39af6c29c9030 +8c1cd212d0b010905d560688cfc036ae6535bc334fa8b812519d810b7e7dcf1bb7c5f43deaa40f097158358987324a7f +b86993c383c015ed8d847c6b795164114dd3e9efd25143f509da318bfba89389ea72a420699e339423afd68b6512fafb +8d06bd379c6d87c6ed841d8c6e9d2d0de21653a073725ff74be1934301cc3a79b81ef6dd0aad4e7a9dc6eac9b73019bc +81af4d2d87219985b9b1202d724fe39ef988f14fef07dfe3c3b11714e90ffba2a97250838e8535eb63f107abfe645e96 +8c5e0af6330a8becb787e4b502f34f528ef5756e298a77dc0c7467433454347f3a2e0bd2641fbc2a45b95e231c6e1c02 +8e2a8f0f04562820dc8e7da681d5cad9fe2e85dd11c785fb6fba6786c57a857e0b3bd838fb849b0376c34ce1665e4837 +a39be8269449bfdfc61b1f62077033649f18dae9bef7c6163b9314ca8923691fb832f42776f0160b9e8abd4d143aa4e1 +8c154e665706355e1cc98e0a4cabf294ab019545ba9c4c399d666e6ec5c869ca9e1faf8fb06cd9c0a5c2f51a7d51b70a +a046a7d4de879d3ebd4284f08f24398e9e3bf006cd4e25b5c67273ade248689c69affff92ae810c07941e4904296a563 +afd94c1cb48758e5917804df03fb38a6da0e48cd9b6262413ea13b26973f9e266690a1b7d9d24bbaf7e82718e0e594b0 +859e21080310c8d6a38e12e2ac9f90a156578cdeb4bb2e324700e97d9a5511cd6045dc39d1d0de3f94aeed043a24119d +a219fb0303c379d0ab50893264919f598e753aac9065e1f23ef2949abc992577ab43c636a1d2c089203ec9ddb941e27d +b0fdb639d449588a2ca730afcba59334e7c387342d56defdfb7ef79c493f7fd0e5277eff18e7203e756c7bdda5803047 +87f9c3b7ed01f54368aca6dbcf2f6e06bff96e183c4b2c65f8baa23b377988863a0a125d5cdd41a072da8462ced4c070 +99ef7a5d5ac2f1c567160e1f8c95f2f38d41881850f30c461a205f7b1b9fb181277311333839b13fb3ae203447e17727 +aeaca9b1c2afd24e443326cc68de67b4d9cedb22ad7b501a799d30d39c85bb2ea910d4672673e39e154d699e12d9b3dc +a11675a1721a4ba24dd3d0e4c3c33a6edf4cd1b9f6b471070b4386c61f77452266eae6e3f566a40cfc885eada9a29f23 +b228334445e37b9b49cb4f2cc56b454575e92173ddb01370a553bba665adadd52df353ad74470d512561c2c3473c7bb9 +a18177087c996572d76f81178d18ed1ceebc8362a396348ce289f1d8bd708b9e99539be6fccd4acb1112381cfc5749b4 +8e7b8bf460f0d3c99abb19803b9e43422e91507a1c0c22b29ee8b2c52d1a384da4b87c292e28eff040db5be7b1f8641f +b03d038d813e29688b6e6f444eb56fec3abba64c3d6f890a6bcf2e916507091cdb2b9d2c7484617be6b26552ed1c56cb +a1c88ccd30e934adfc5494b72655f8afe1865a84196abfb376968f22ddc07761210b6a9fb7638f1413d1b4073d430290 +961b714faebf172ad2dbc11902461e286e4f24a99a939152a53406117767682a571057044decbeb3d3feef81f4488497 +a03dc4059b46effdd786a0a03cc17cfee8585683faa35bb07936ded3fa3f3a097f518c0b8e2db92fd700149db1937789 +adf60180c99ca574191cbcc23e8d025b2f931f98ca7dfcebfc380226239b6329347100fcb8b0fcb12db108c6ad101c07 +805d4f5ef24d46911cbf942f62cb84b0346e5e712284f82b0db223db26d51aabf43204755eb19519b00e665c7719fcaa +8dea7243e9c139662a7fe3526c6c601eee72fd8847c54c8e1f2ad93ef7f9e1826b170afe58817dac212427164a88e87f +a2ba42356606d651b077983de1ad643650997bb2babb188c9a3b27245bb65d2036e46667c37d4ce02cb1be5ae8547abe +af2ae50b392bdc013db2d12ce2544883472d72424fc767d3f5cb0ca2d973fc7d1f425880101e61970e1a988d0670c81b +98e6bec0568d3939b31d00eb1040e9b8b2a35db46ddf4369bdaee41bbb63cc84423d29ee510a170fb5b0e2df434ba589 +822ff3cd12fbef4f508f3ca813c04a2e0b9b799c99848e5ad3563265979e753ee61a48f6adc2984a850f1b46c1a43d35 +891e8b8b92a394f36653d55725ef514bd2e2a46840a0a2975c76c2a935577f85289026aaa74384da0afe26775cbddfb9 +b2a3131a5d2fe7c8967047aa66e4524babae941d90552171cc109527f345f42aa0df06dcbb2fa01b33d0043917bbed69 +80c869469900431f3eeefafdbe07b8afd8cee7739e659e6d0109b397cacff85a88247698f87dc4e2fe39a592f250ac64 +9091594f488b38f9d2bb5df49fd8b4f8829d9c2f11a197dd1431ed5abbc5c954bbde3387088f9ee3a5a834beb7619bce +b472e241e6956146cca57b97a8a204668d050423b4e76f857bad5b47f43b203a04c8391ba9d9c3e95093c071f9d376a1 +b7dd2de0284844392f7dfb56fe7ca3ede41e27519753ffc579a0a8d2d65ceb8108d06b6b0d4c3c1a2588951297bd1a1e +902116ce70d0a079ac190321c1f48701318c05f8e69ee09694754885d33a835a849cafe56f499a2f49f6cda413ddf9a7 +b18105cc736787fafaf7c3c11c448bce9466e683159dff52723b7951dff429565e466e4841d982e3aaa9ee2066838666 +97ab9911f3f659691762d568ae0b7faa1047b0aed1009c319fa79d15d0db8db9f808fc385dc9a68fa388c10224985379 +b2a2cba65f5b927e64d2904ba412e2bac1cf18c9c3eda9c72fb70262497ecf505b640827e2afebecf10eebbcf48ccd3e +b36a3fd677baa0d3ef0dac4f1548ff50a1730286b8c99d276a0a45d576e17b39b3cbadd2fe55e003796d370d4be43ce3 +a5dfec96ca3c272566e89dc453a458909247e3895d3e44831528130bc47cc9d0a0dac78dd3cad680a4351d399d241967 +8029382113909af6340959c3e61db27392531d62d90f92370a432aec3eb1e4c36ae1d4ef2ba8ec6edb4d7320c7a453f6 +971d85121ea108e6769d54f9c51299b0381ece8b51d46d49c89f65bedc123bab4d5a8bc14d6f67f4f680077529cbae4c +98ff6afc01d0bec80a278f25912e1b1ebff80117adae72e31d5b9fa4d9624db4ba2065b444df49b489b0607c45e26c4c +8fa29be10fb3ab30ce25920fec0187e6e91e458947009dabb869aade7136c8ba23602682b71e390c251f3743164cbdaa +b3345c89eb1653418fe3940cf3e56a9a9c66526389b98f45ca02dd62bfb37baa69a4baaa7132d7320695f8ea6ad1fd94 +b72c7f5541c9ac6b60a7ec9f5415e7fb14da03f7164ea529952a29399f3a071576608dbbcc0d45994f21f92ddbeb1e19 +aa3450bb155a5f9043d0ef95f546a2e6ade167280bfb75c9f09c6f9cdb1fffb7ce8181436161a538433afa3681c7a141 +92a18fecaded7854b349f441e7102b638ababa75b1b0281dd0bded6541abe7aa37d96693595be0b01fe0a2e2133d50f9 +980756ddf9d2253cfe6c94960b516c94889d09e612810935150892627d2ecee9a2517e04968eea295d0106850c04ca44 +ae68c6ccc454318cdd92f32b11d89116a3b8350207a36d22a0f626718cad671d960090e054c0c77ac3162ae180ecfd4b +99f31f66eaaa551749ad91d48a0d4e3ff4d82ef0e8b28f3184c54e852422ba1bdafd53b1e753f3a070f3b55f3c23b6a2 +a44eaeaa6589206069e9c0a45ff9fc51c68da38d4edff1d15529b7932e6f403d12b9387019c44a1488a5d5f27782a51f +b80b5d54d4b344840e45b79e621bd77a3f83fb4ce6d8796b7d6915107b3f3c34d2e7d95bdafd120f285669e5acf2437a +b36c069ec085a612b5908314d6b84c00a83031780261d1c77a0384c406867c9847d5b0845deddfa512cc04a8df2046fb +b09dbe501583220f640d201acea7ee3e39bf9eda8b91aa07b5c50b7641d86d71acb619b38d27835ce97c3759787f08e9 +87403d46a2bf63170fff0b857acacf42ee801afe9ccba8e5b4aea967b68eac73a499a65ca46906c2eb4c8f27bc739faa +82b93669f42a0a2aa5e250ffe6097269da06a9c02fcd1801abbad415a7729a64f830754bafc702e64600ba47671c2208 +8e3a3029be7edb8dd3ab1f8216664c8dc50d395f603736061d802cef77627db7b859ef287ed850382c13b4d22d6a2d80 +968e9ec7194ff424409d182ce0259acd950c384c163c04463bc8700a40b79beba6146d22b7fa7016875a249b7b31c602 +8b42c984bbe4996e0c20862059167c6bdc5164b1ffcd928f29512664459212d263e89f0f0e30eed4e672ffa5ed0b01b5 +96bac54062110dada905363211133f1f15dc7e4fd80a4c6e4a83bc9a0bcbbaba11cd2c7a13debcf0985e1a954c1da66b +a16dc8a653d67a7cd7ae90b2fffac0bf1ca587005430fe5ba9403edd70ca33e38ba5661d2ed6e9d2864400d997626a62 +a68ab11a570a27853c8d67e491591dcba746bfbee08a2e75ae0790399130d027ed387f41ef1d7de8df38b472df309161 +92532b74886874447c0300d07eda9bbe4b41ed25349a3da2e072a93fe32c89d280f740d8ff70d5816793d7f2b97373cc +88e35711b471e89218fd5f4d0eadea8a29405af1cd81974427bc4a5fb26ed60798daaf94f726c96e779b403a2cd82820 +b5c72aa4147c19f8c4f3a0a62d32315b0f4606e0a7025edc5445571eaf4daff64f4b7a585464821574dd50dbe1b49d08 +9305d9b4095258e79744338683fd93f9e657367b3ab32d78080e51d54eec331edbc224fad5093ebf8ee4bd4286757eb8 +b2a17abb3f6a05bcb14dc7b98321fa8b46d299626c73d7c6eb12140bf4c3f8e1795250870947af817834f033c88a59d6 +b3477004837dbd8ba594e4296f960fc91ab3f13551458445e6c232eb04b326da803c4d93e2e8dcd268b4413305ff84da +924b4b2ebaafdcfdfedb2829a8bf46cd32e1407d8d725a5bd28bdc821f1bafb3614f030ea4352c671076a63494275a3f +8b81b9ef6125c82a9bece6fdcb9888a767ac16e70527753428cc87c56a1236e437da8be4f7ecfe57b9296dc3ae7ba807 +906e19ec8b8edd58bdf9ae05610a86e4ea2282b1bbc1e8b00b7021d093194e0837d74cf27ac9916bdb8ec308b00da3da +b41c5185869071760ac786078a57a2ab4e2af60a890037ac0c0c28d6826f15c2cf028fddd42a9b6de632c3d550bfbc14 +a646e5dec1b713ae9dfdf7bdc6cd474d5731a320403c7dfcfd666ffc9ae0cff4b5a79530e8df3f4aa9cb80568cb138e9 +b0efad22827e562bd3c3e925acbd0d9425d19057868608d78c2209a531cccd0f2c43dc5673acf9822247428ffa2bb821 +a94c19468d14b6f99002fc52ac06bbe59e5c472e4a0cdb225144a62f8870b3f10593749df7a2de0bd3c9476ce682e148 +803864a91162f0273d49271dafaab632d93d494d1af935aefa522768af058fce52165018512e8d6774976d52bd797e22 +a08711c2f7d45c68fb340ac23597332e1bcaec9198f72967b9921204b9d48a7843561ff318f87908c05a44fc35e3cc9d +91c3cad94a11a3197ae4f9461faab91a669e0dddb0371d3cab3ed9aeb1267badc797d8375181130e461eadd05099b2a2 +81bdaaf48aae4f7b480fc13f1e7f4dd3023a41439ba231760409ce9292c11128ab2b0bdbbf28b98af4f97b3551f363af +8d60f9df9fd303f625af90e8272c4ecb95bb94e6efc5da17b8ab663ee3b3f673e9f6420d890ccc94acf4d2cae7a860d8 +a7b75901520c06e9495ab983f70b61483504c7ff2a0980c51115d11e0744683ce022d76e3e09f4e99e698cbd21432a0d +82956072df0586562fda7e7738226f694e1c73518dd86e0799d2e820d7f79233667192c9236dcb27637e4c65ef19d493 +a586beb9b6ffd06ad200957490803a7cd8c9bf76e782734e0f55e04a3dc38949de75dc607822ec405736c576cf83bca3 +a179a30d00def9b34a7e85607a447eea0401e32ab5abeee1a281f2acd1cf6ec81a178020666f641d9492b1bdf66f05a3 +83e129705c538787ed8e0fdc1275e6466a3f4ee21a1e6abedd239393b1df72244723b92f9d9d9339a0cab6ebf28f5a16 +811bd8d1e3722b64cd2f5b431167e7f91456e8bba2cc669d3fbbce7d553e29c3c19f629fcedd2498bc26d33a24891d17 +a243c030c858f1f60cccd26b45b024698cc6d9d9e6198c1ed4964a235d9f8d0baf9cde10c8e63dfaa47f8e74e51a6e85 +ab839eb82e23ca52663281f863b55b0a3d6d4425c33ffb4eeb1d7979488ab068bf99e2a60e82cea4dc42c56c26cbfebe +8b896f9bb21d49343e67aec6ad175b58c0c81a3ca73d44d113ae4354a0065d98eb1a5cafedaf232a2bb9cdc62152f309 +af6230340cc0b66f5bf845540ed4fc3e7d6077f361d60762e488d57834c3e7eb7eacc1b0ed73a7d134f174a01410e50c +88975e1b1af678d1b5179f72300a30900736af580dd748fd9461ef7afccc91ccd9bed33f9da55c8711a7635b800e831f +a97486bb9047391661718a54b8dd5a5e363964e495eae6c692730264478c927cf3e66dd3602413189a3699fbeae26e15 +a5973c161ab38732885d1d2785fd74bf156ba34881980cba27fe239caef06b24a533ffe6dbbbeca5e6566682cc00300a +a24776e9a840afda0003fa73b415d5bd6ecd9b5c2cc842b643ee51b8c6087f4eead4d0bfbd987eb174c489a7b952ff2a +a8a6ee06e3af053b705a12b59777267c546f33ba8a0f49493af8e6df4e15cf8dd2d4fb4daf7e84c6b5d3a7363118ff03 +a28e59ce6ad02c2ce725067c0123117e12ac5a52c8f5af13eec75f4a9efc4f696777db18a374fa33bcae82e0734ebd16 +86dfc3b78e841c708aff677baa8ee654c808e5d257158715097c1025d46ece94993efe12c9d188252ad98a1e0e331fec +a88d0275510f242eab11fdb0410ff6e1b9d7a3cbd3658333539815f1b450a84816e6613d15aa8a8eb15d87cdad4b27a2 +8440acea2931118a5b481268ff9f180ee4ede85d14a52c026adc882410825b8275caa44aff0b50c2b88d39f21b1a0696 +a7c3182eab25bd6785bacf12079d0afb0a9b165d6ed327814e2177148539f249eb9b5b2554538f54f3c882d37c0a8abe +85291fbe10538d7da38efdd55a7acebf03b1848428a2f664c3ce55367aece60039f4f320b1771c9c89a35941797f717c +a2c6414eeb1234728ab0de94aa98fc06433a58efa646ca3fcbd97dbfb8d98ae59f7ce6d528f669c8149e1e13266f69c9 +840c8462785591ee93aee2538d9f1ec44ba2ca61a569ab51d335ac873f5d48099ae8d7a7efa0725d9ff8f9475bfa4f56 +a7065a9d02fb3673acf7702a488fbc01aa69580964932f6f40b6c2d1c386b19e50b0e104fcac24ea26c4e723611d0238 +b72db6d141267438279e032c95e6106c2ccb3164b842ba857a2018f3a35f4b040da92680881eb17cd61d0920d5b8f006 +a8005d6c5960e090374747307ef0be2871a7a43fa4e76a16c35d2baab808e9777b496e9f57a4218b23390887c33a0b55 +8e152cea1e00a451ca47c20a1e8875873419700af15a5f38ee2268d3fbc974d4bd5f4be38008fa6f404dbdedd6e6e710 +a3391aed1fcd68761f06a7d1008ec62a09b1cb3d0203cd04e300a0c91adfed1812d8bc1e4a3fd7976dc0aae0e99f52f1 +967eb57bf2aa503ee0c6e67438098149eac305089c155f1762cf5e84e31f0fbf27c34a9af05621e34645c1ec96afaec8 +88af97ddc4937a95ec0dcd25e4173127260f91c8db2f6eac84afb789b363705fb3196235af631c70cafd09411d233589 +a32df75b3f2c921b8767638fd289bcfc61e08597170186637a7128ffedd52c798c434485ac2c7de07014f9e895c2c3d8 +b0a783832153650aa0d766a3a73ec208b6ce5caeb40b87177ffc035ab03c7705ecdd1090b6456a29f5fb7e90e2fa8930 +b59c8e803b4c3486777d15fc2311b97f9ded1602fa570c7b0200bada36a49ee9ef4d4c1474265af8e1c38a93eb66b18b +982f2c85f83e852022998ff91bafbb6ff093ef22cf9d5063e083a48b29175ccbd51b9c6557151409e439096300981a6c +939e3b5989fefebb9d272a954659a4eb125b98c9da6953f5e628d26266bd0525ec38304b8d56f08d65abc4d6da4a8dbb +8898212fe05bc8de7d18503cb84a1c1337cc2c09d1eeef2b475aa79185b7322bf1f8e065f1bf871c0c927dd19faf1f6d +94b0393a41cd00f724aee2d4bc72103d626a5aecb4b5486dd1ef8ac27528398edf56df9db5c3d238d8579af368afeb09 +96ac564450d998e7445dd2ea8e3fc7974d575508fa19e1c60c308d83b645864c029f2f6b7396d4ff4c1b24e92e3bac37 +8adf6638e18aff3eb3b47617da696eb6c4bdfbecbbc3c45d3d0ab0b12cbad00e462fdfbe0c35780d21aa973fc150285e +b53f94612f818571b5565bbb295e74bada9b5f9794b3b91125915e44d6ddcc4da25510eab718e251a09c99534d6042d9 +8b96462508d77ee083c376cd90807aebad8de96bca43983c84a4a6f196d5faf6619a2351f43bfeec101864c3bf255519 +aeadf34657083fc71df33bd44af73bf5281c9ca6d906b9c745536e1819ea90b56107c55e2178ebad08f3ba75b3f81c86 +9784ba29b2f0057b5af1d3ab2796d439b8753f1f749c73e791037461bdfc3f7097394283105b8ab01788ea5255a96710 +8756241bda159d4a33bf74faba0d4594d963c370fb6a18431f279b4a865b070b0547a6d1613cf45b8cfb5f9236bbf831 +b03ebfd6b71421dfd49a30460f9f57063eebfe31b9ceaa2a05c37c61522b35bdc09d7db3ad75c76c253c00ba282d3cd2 +b34e7e6341fa9d854b2d3153bdda0c4ae2b2f442ab7af6f99a0975d45725aa48e36ae5f7011edd249862e91f499687d4 +b462ee09dc3963a14354244313e3444de5cc37ea5ccfbf14cd9aca8027b59c4cb2a949bc30474497cab8123e768460e6 +aea753290e51e2f6a21a9a0ee67d3a2713f95c2a5c17fe41116c87d3aa77b1683761264d704df1ac34f8b873bc88ef7b +98430592afd414394f98ddfff9f280fcb1c322dbe3510f45e1e9c4bb8ee306b3e0cf0282c0ee73ebb8ba087d4d9e0858 +b95d3b5aaf54ffca11f4be8d57f76e14afdb20afc859dc7c7471e0b42031e8f3d461b726ecb979bdb2f353498dfe95ea +984d17f9b11a683132e0b5a9ee5945e3ff7054c2d5c716be73b29078db1d36f54c6e652fd2f52a19da313112e97ade07 +ab232f756b3fff3262be418a1af61a7e0c95ceebbc775389622a8e10610508cd6784ab7960441917a83cc191c58829ea +a28f41678d6e60de76b0e36ab10e4516e53e02e9c77d2b5af3cfeee3ce94cfa30c5797bd1daab20c98e1cad83ad0f633 +b55395fca84dd3ccc05dd480cb9b430bf8631ff06e24cb51d54519703d667268c2f8afcde4ba4ed16bece8cc7bc8c6e0 +8a8a5392a0e2ea3c7a8c51328fab11156004e84a9c63483b64e8f8ebf18a58b6ffa8fe8b9d95af0a2f655f601d096396 +ab480000fe194d23f08a7a9ec1c392334e9c687e06851f083845121ce502c06b54dda8c43092bcc1035df45cc752fe9b +b265644c29f628d1c7e8e25a5e845cabb21799371814730a41a363e1bda8a7be50fee7c3996a365b7fcba4642add10db +b8a915a3c685c2d4728f6931c4d29487cad764c5ce23c25e64b1a3259ac27235e41b23bfe7ae982921b4cb84463097df +8efa7338442a4b6318145a5440fc213b97869647eeae41b9aa3c0a27ee51285b73e3ae3b4a9423df255e6add58864aa9 +9106d65444f74d217f4187dfc8fcf3810b916d1e4275f94f6a86d1c4f3565b131fd6cde1fa708bc05fe183c49f14941a +948252dac8026bbbdb0a06b3c9d66ec4cf9532163bab68076fda1bd2357b69e4b514729c15aaa83b5618b1977bbc60c4 +ae6596ccfdf5cbbc5782efe3bb0b101bb132dbe1d568854ca24cacc0b2e0e9fabcb2ca7ab42aecec412efd15cf8cb7a2 +84a0b6c198ff64fd7958dfd1b40eac9638e8e0b2c4cd8cf5d8cdf80419baee76a05184bce6c5b635f6bf2d30055476a7 +8893118be4a055c2b3da593dbca51b1ae2ea2469911acfb27ee42faf3e6c3ad0693d3914c508c0b05b36a88c8b312b76 +b097479e967504deb6734785db7e60d1d8034d6ca5ba9552887e937f5e17bb413fccac2c1d1082154ed76609127860ad +a0294e6b9958f244d29943debf24b00b538b3da1116269b6e452bb12dc742226712fd1a15b9c88195afeb5d2415f505c +b3cc15f635080bc038f61b615f62b5b5c6f2870586191f59476e8368a73641d6ac2f7d0c1f54621982defdb318020230 +99856f49b9fe1604d917c94d09cc0ed753d13d015d30587a94e6631ffd964b214e607deb8a69a8b5e349a7edf4309206 +a8571e113ea22b4b4fce41a094da8c70de37830ae32e62c65c2fa5ad06a9bc29e884b945e73d448c72b176d6ecebfb58 +a9e9c6e52beb0013273c29844956b3ce291023678107cdc785f7b44eff5003462841ad8780761b86aefc6b734adde7cf +80a784b0b27edb51ef2bad3aee80e51778dcaa0f3f5d3dcb5dc5d4f4b2cf7ae35b08de6680ea9dac53f8438b92eb09ef +827b543e609ea328e97e373f70ad72d4915a2d1daae0c60d44ac637231070e164c43a2a58db80a64df1c624a042b38f9 +b449c65e8195202efdcb9bdb4e869a437313b118fef8b510cbbf8b79a4e99376adb749b37e9c20b51b31ed3310169e27 +8ea3028f4548a79a94c717e1ed28ad4d8725b8d6ab18b021063ce46f665c79da3c49440c6577319dab2d036b7e08f387 +897798431cfb17fe39f08f5f854005dc37b1c1ec1edba6c24bc8acb3b88838d0534a75475325a5ea98b326ad47dbad75 +89cf232e6303b0751561960fd4dea5754a28c594daf930326b4541274ffb03c7dd75938e411eb9a375006a70ce38097f +9727c6ae7f0840f0b6c8bfb3a1a5582ceee705e0b5c59b97def7a7a2283edd4d3f47b7971e902a3a2079e40b53ff69b8 +b76ed72b122c48679d221072efc0eeea063cb205cbf5f9ef0101fd10cb1075b8628166c83577cced654e1c001c7882f7 +ae908c42d208759da5ee9b405df85a6532ea35c6f0f6a1288d22870f59d98edc896841b8ac890a538e6c8d1e8b02d359 +809d12fe4039a0ec80dc9be6a89acaab7797e5f7f9b163378f52f9a75a1d73b2e9ae6e3dd49e32ced439783c1cabbef5 +a4149530b7f85d1098ba534d69548c6c612c416e8d35992fc1f64f4deeb41e09e49c6cf7aadbed7e846b91299358fe2d +a49342eacd1ec1148b8df1e253b1c015f603c39de11fa0a364ccb86ea32d69c34fd7aa6980a1fadcd8e785a57fa46f60 +87d43eff5a006dc4dddcf76cc96c656a1f3a68f19f124181feab86c6cc9a52cb9189cdbb423414defdd9bb0ca8ff1ddc +861367e87a9aa2f0f68296ba50aa5dbc5713008d260cc2c7e62d407c2063064749324c4e8156dc21b749656cfebce26b +b5303c2f72e84e170e66ae1b0fbd51b8c7a6f27476eaf5694b64e8737d5c84b51fe90100b256465a4c4156dd873cddb0 +b62849a4f891415d74f434cdc1d23c4a69074487659ca96e1762466b2b7a5d8525b056b891d0feea6fe6845cba8bc7fb +923dd9e0d6590a9307e8c4c23f13bae3306b580e297a937711a8b13e8de85e41a61462f25b7d352b682e8437bf2b4ab3 +9147379860cd713cd46c94b8cdf75125d36c37517fbecf81ace9680b98ce6291cd1c3e472f84249cc3b2b445e314b1b6 +a808a4f17ac21e3fb5cfef404e61fae3693ca3e688d375f99b6116779696059a146c27b06de3ac36da349b0649befd56 +87787e9322e1b75e66c1f0d9ea0915722a232770930c2d2a95e9478c4b950d15ab767e30cea128f9ed65893bfc2d0743 +9036a6ee2577223be105defe1081c48ea7319e112fff9110eb9f61110c319da25a6cea0464ce65e858635b079691ef1f +af5548c7c24e1088c23b57ee14d26c12a83484c9fd9296edf1012d8dcf88243f20039b43c8c548c265ef9a1ffe9c1c88 +a0fff520045e14065965fb8accd17e878d3fcaf9e0af2962c8954e50be6683d31fa0bf4816ab68f08630dbac6bfce52a +b4c1b249e079f6ae1781af1d97a60b15855f49864c50496c09c91fe1946266915b799f0406084d7783f5b1039116dd8b +8b0ffa5e7c498cb3879dddca34743b41eee8e2dea3d4317a6e961b58adb699ef0c92400c068d5228881a2b08121226bf +852ae8b19a1d80aa8ae5382e7ee5c8e7670ceb16640871c56b20b96b66b3b60e00015a3dde039446972e57b49a999ddd +a49942f04234a7d8492169da232cfff8051df86e8e1ba3db46aede02422c689c87dc1d99699c25f96cb763f5ca0983e5 +b04b597b7760cf5dcf411ef896d1661e6d5b0db3257ac2cf64b20b60c6cc18fa10523bb958a48d010b55bac7b02ab3b1 +a494591b51ea8285daecc194b5e5bd45ae35767d0246ac94fae204d674ee180c8e97ff15f71f28b7aeb175b8aea59710 +97d2624919e78406e7460730680dea8e71c8571cf988e11441aeea54512b95bd820e78562c99372d535d96f7e200d20d +ac693ddb00e48f76e667243b9b6a7008424043fb779e4f2252330285232c3fccac4da25cbd6d95fe9ad959ff305a91f6 +8d20ca0a71a64a3f702a0825bb46bd810d03bebfb227683680d474a52f965716ff99e19a165ebaf6567987f4f9ee3c94 +a5c516a438f916d1d68ca76996404792e0a66e97b7f18fc54c917bf10cf3211b62387932756e39e67e47b0bd6e88385a +b089614d830abc0afa435034cec7f851f2f095d479cacf1a3fb57272da826c499a52e7dcbc0eb85f4166fb94778e18e9 +a8dacc943765d930848288192f4c69e2461c4b9bc6e79e30eeef9a543318cf9ae9569d6986c65c5668a89d49993f8e07 +ab5a9361fa339eec8c621bdad0a58078983abd8942d4282b22835d7a3a47e132d42414b7c359694986f7db39386c2e19 +94230517fb57bd8eb26c6f64129b8b2abd0282323bf7b94b8bac7fab27b4ecc2c4290c294275e1a759de19f2216134f3 +b8f158ea5006bc3b90b285246625faaa6ac9b5f5030dc69701b12f3b79a53ec7e92eeb5a63bbd1f9509a0a3469ff3ffc +8b6944fd8cb8540957a91a142fdcda827762aa777a31e8810ca6d026e50370ee1636fc351724767e817ca38804ebe005 +82d1ee40fe1569c29644f79fa6c4033b7ed45cd2c3b343881f6eb0de2e79548fded4787fae19bed6ee76ed76ff9f2f11 +a8924c7035e99eaed244ca165607e7e568b6c8085510dcdbaf6ebdbed405af2e6c14ee27d94ffef10d30aa52a60bf66d +956f82a6c2ae044635e85812581e4866c5fa2f427b01942047d81f6d79a14192f66fbbe77c9ffeaef4e6147097fdd2b5 +b1100255a1bcf5e05b6aff1dfeb6e1d55b5d68d43a7457ba10cc76b61885f67f4d0d5179abda786e037ae95deb8eea45 +99510799025e3e5e8fbf06dedb14c060c6548ba2bda824f687d3999dc395e794b1fb6514b9013f3892b6cf65cb0d65aa +8f9091cebf5e9c809aab415942172258f894e66e625d7388a05289183f01b8d994d52e05a8e69f784fba41db9ea357f0 +a13d2eeb0776bdee9820ecb6693536720232848c51936bb4ef4fe65588d3f920d08a21907e1fdb881c1ad70b3725e726 +a68b8f18922d550284c5e5dc2dda771f24c21965a6a4d5e7a71678178f46df4d8a421497aad8fcb4c7e241aba26378a0 +8b7601f0a3c6ad27f03f2d23e785c81c1460d60100f91ea9d1cab978aa03b523150206c6d52ce7c7769c71d2c8228e9e +a8e02926430813caa851bb2b46de7f0420f0a64eb5f6b805401c11c9091d3b6d67d841b5674fa2b1dce0867714124cd8 +b7968ecba568b8193b3058400af02c183f0a6df995a744450b3f7e0af7a772454677c3857f99c140bbdb2a09e832e8e0 +8f20b1e9ba87d0a3f35309b985f3c18d2e8800f1ca7f0c52cadef773f1496b6070c936eea48c4a1cae83fd2524e9d233 +88aef260042db0d641a51f40639dbeeefa9e9811df30bee695f3791f88a2f84d318f04e8926b7f47bf25956cb9e3754f +9725345893b647e9ba4e6a29e12f96751f1ae25fcaec2173e9a259921a1a7edb7a47159b3c8767e44d9e2689f5aa0f72 +8c281e6f72752cb11e239e4df9341c45106eb7993c160e54423c2bffe10bc39d42624b45a1f673936ef2e1a02fc92f1a +90aba2f68bddb2fcce6c51430dacdfeec43ea8dc379660c99095df11017691ccf5faa27665cf4b9f0eea7728ae53c327 +b7022695c16521c5704f49b7ddbdbec9b5f57ce0ceebe537bc0ebb0906d8196cc855a9afeb8950a1710f6a654464d93f +8fe1b9dd3c6a258116415d36e08374e094b22f0afb104385a5da48be17123e86fb8327baacc4f0d9ebae923d55d99bb5 +817e85d8e3d19a4cbc1dec31597142c2daa4871bda89c2177fa719c00eda3344eb08b82eb92d4aa91a9eaacb3fc09783 +b59053e1081d2603f1ca0ba553804d6fa696e1fd996631db8f62087b26a40dfef02098b0326bb75f99ec83b9267ca738 +990a173d857d3ba81ff3789b931bfc9f5609cde0169b7f055fa3cb56451748d593d62d46ba33f80f9cafffe02b68dd14 +b0c538dbba4954b809ab26f9f94a3cf1dcb77ce289eaec1d19f556c0ae4be1fa03af4a9b7057837541c3cc0a80538736 +ac3ba42f5f44f9e1fc453ce49c4ab79d0e1d5c42d3b30b1e098f3ab3f414c4c262fa12fb2be249f52d4aaf3c5224beb9 +af47467eb152e59870e21f0d4da2f43e093daf40180ab01438030684b114d025326928eaab12c41b81a066d94fce8436 +98d1b58ba22e7289b1c45c79a24624f19b1d89e00f778eef327ec4856a9a897278e6f1a9a7e673844b31dde949153000 +97ccb15dfadc7c59dca08cfe0d22df2e52c684cf97de1d94bc00d7ba24e020025130b0a39c0f4d46e4fc872771ee7875 +b699e4ed9a000ff96ca296b2f09dce278832bc8ac96851ff3cff99ed3f6f752cfc0fea8571be28cd9b5a7ec36f1a08ee +b9f49f0edb7941cc296435ff0a912e3ad16848ee8765ab5f60a050b280d6ea585e5b34051b15f6b8934ef01ceb85f648 +ac3893df7b4ceab23c6b9054e48e8ba40d6e5beda8fbe90b814f992f52494186969b35d8c4cdc3c99890a222c9c09008 +a41293ad22fae81dea94467bc1488c3707f3d4765059173980be93995fa4fcc3c9340796e3eed0beeb0ba0d9bb4fa3aa +a0543e77acd2aeecde13d18d258aeb2c7397b77f17c35a1992e8666ea7abcd8a38ec6c2741bd929abba2f766138618cc +92e79b22bc40e69f6527c969500ca543899105837b6b1075fa1796755c723462059b3d1b028e0b3df2559fa440e09175 +a1fa1eac8f41a5197a6fb4aa1eae1a031c89f9c13ff9448338b222780cf9022e0b0925d930c37501a0ef7b2b00fdaf83 +b3cb29ff73229f0637335f28a08ad8c5f166066f27c6c175164d0f26766a927f843b987ee9b309ed71cbf0a65d483831 +84d4ab787f0ac00f104f4a734dc693d62d48c2aeb03913153da62c2ae2c27d11b1110dcef8980368dd84682ea2c1a308 +ab6a8e4bbc78d4a7b291ad3e9a8fe2d65f640524ba3181123b09d2d18a9e300e2509ccf7000fe47e75b65f3e992a2e7e +b7805ebe4f1a4df414003dc10bca805f2ab86ca75820012653e8f9b79c405196b0e2cab099f2ab953d67f0d60d31a0f9 +b12c582454148338ea605d22bd00a754109063e22617f1f8ac8ddf5502c22a181c50c216c3617b9852aa5f26af56b323 +86333ad9f898947e31ce747728dc8c887479e18d36ff3013f69ebef807d82c6981543b5c3788af93c4d912ba084d3cba +b514efa310dc4ad1258add138891e540d8c87142a881b5f46563cc58ecd1488e6d3a2fca54c0b72a929f3364ca8c333e +aa0a30f92843cf2f484066a783a1d75a7aa6f41f00b421d4baf20a6ac7886c468d0eea7ca8b17dd22f4f74631b62b640 +b3b7dc63baec9a752e8433c0cdee4d0f9bc41f66f2b8d132faf925eef9cf89aae756fc132c45910f057122462605dc10 +b9b8190dac5bfdeb59fd44f4da41a57e7f1e7d2c21faba9da91fa45cbeca06dcf299c9ae22f0c89ece11ac46352d619f +89f8cf36501ad8bdfeab863752a9090e3bfda57cf8fdeca2944864dc05925f501e252c048221bcc57136ab09a64b64b2 +b0cbfaf317f05f97be47fc9d69eda2dd82500e00d42612f271a1fe24626408c28881f171e855bd5bd67409f9847502b4 +a7c21a8fcede581bfd9847b6835eda62ba250bea81f1bb17372c800a19c732abe03064e64a2f865d974fb636cab4b859 +95f9df524ba7a4667351696c4176b505d8ea3659f5ff2701173064acc624af69a0fad4970963736383b979830cb32260 +856a74fe8b37a2e3afeac858c8632200485d438422a16ae3b29f359e470e8244995c63ad79c7e007ed063f178d0306fd +b37faa4d78fdc0bb9d403674dbea0176c2014a171c7be8527b54f7d1a32a76883d3422a3e7a5f5fcc5e9b31b57822eeb +8d37234d8594ec3fe75670b5c9cc1ec3537564d4739b2682a75b18b08401869a4264c0f264354219d8d896cded715db4 +b5289ee5737f0e0bde485d32096d23387d68dab8f01f47821ab4f06cc79a967afe7355e72dc0c751d96b2747b26f6255 +9085e1fdf9f813e9c3b8232d3c8863cd84ab30d45e8e0d3d6a0abd9ebc6fd70cdf749ff4d04390000e14c7d8c6655fc7 +93a388c83630331eca4da37ea4a97b3b453238af474817cc0a0727fd3138dcb4a22de38c04783ec829c22cb459cb4e8e +a5377116027c5d061dbe24c240b891c08cdd8cd3f0899e848d682c873aff5b8132c1e7cfe76d2e5ed97ee0eb1d42cb68 +a274c84b04338ed28d74683e2a7519c2591a3ce37c294d6f6e678f7d628be2db8eff253ede21823e2df7183e6552f622 +8bc201147a842453a50bec3ac97671397bc086d6dfc9377fa38c2124cdc286abda69b7324f47d64da094ae011d98d9d9 +9842d0c066c524592b76fbec5132bc628e5e1d21c424bec4555efca8619cc1fd8ea3161febcb8b9e8ab54702f4e815e2 +a19191b713a07efe85c266f839d14e25660ee74452e6c691cd9997d85ae4f732052d802d3deb018bdd847caa298a894b +a24f71fc0db504da4e287dd118a4a74301cbcd16033937ba2abc8417956fcb4ae19b8e63b931795544a978137eff51cb +a90eec4a6a3a4b8f9a5b93d978b5026fcf812fe65585b008d7e08c4aaf21195a1d0699f12fc16f79b6a18a369af45771 +8b551cf89737d7d06d9b3b9c4c1c73b41f2ea0af4540999c70b82dabff8580797cf0a3caf34c86c59a7069eb2e38f087 +b8d312e6c635e7a216a1cda075ae77ba3e1d2fd501dc31e83496e6e81ed5d9c7799f8e578869c2e0e256fb29f5de10a7 +8d144bdb8cae0b2cdb5b33d44bbc96984a5925202506a8cc65eb67ac904b466f5a7fe3e1cbf04aa785bbb7348c4bb73c +a101b3d58b7a98659244b88de0b478b3fb87dc5fc6031f6e689b99edf498abd43e151fd32bd4bbd240e0b3e59c440359 +907453abca7d8e7151a05cc3d506c988007692fe7401395dc93177d0d07d114ab6cca0cc658eb94c0223fe8658295cad +825329ffbe2147ddb68f63a0a67f32d7f309657b8e5d9ab5bb34b3730bfa2c77a23eaaadb05def7d9f94a9e08fdc1e96 +88ee923c95c1dac99ae7ed6067906d734d793c5dc5d26339c1bb3314abe201c5dccb33b9007351885eb2754e9a8ea06c +98bc9798543f5f1adc9f2cfcfa72331989420e9c3f6598c45269f0dc9b7c8607bbeaf03faa0aea2ddde2b8f17fdceff5 +8ee87877702a79aef923ab970db6fa81561b3c07d5bf1a072af0a7bad765b4cbaec910afe1a91703feacc7822fa38a94 +8060b9584aa294fe8adc2b22f67e988bc6da768eae91e429dcc43ddc53cfcc5d6753fdc1b420b268c7eb2fb50736a970 +b344a5524d80a2f051870c7001f74fcf348a70fcf78dbd20c6ff9ca85d81567d2318c8b8089f2c4f195d6aec9fc15fa6 +8f5a5d893e1936ed062149d20eb73d98b62b7f50ab5d93a6429c03656b36688d1c80cb5010e4977491e51fa0d7dd35d5 +86fa32ebbf97328c5f5f15564e1238297e289ec3219b9a741724e9f3ae8d5c15277008f555863a478b247ba5dc601d44 +9557e55377e279f4b6b5e0ffe01eca037cc13aac242d67dfcd0374a1e775c5ed5cb30c25fe21143fee54e3302d34a3ea +8cb6bcbc39372d23464a416ea7039f57ba8413cf3f00d9a7a5b356ab20dcb8ed11b3561f7bce372b8534d2870c7ee270 +b5d59075cb5abde5391f64b6c3b8b50adc6e1f654e2a580b6d6d6eff3f4fbdd8fffc92e06809c393f5c8eab37f774c4b +afcfb6903ef13e493a1f7308675582f15af0403b6553e8c37afb8b2808ad21b88b347dc139464367dc260df075fea1ad +810fbbe808375735dd22d5bc7fc3828dc49fdd22cc2d7661604e7ac9c4535c1df578780affb3b895a0831640a945bcad +8056b0c678803b416f924e09a6299a33cf9ad7da6fe1ad7accefe95c179e0077da36815fde3716711c394e2c5ea7127f +8b67403702d06979be19f1d6dc3ec73cc2e81254d6b7d0cc49cd4fdda8cd51ab0835c1d2d26fc0ecab5df90585c2f351 +87f97f9e6d4be07e8db250e5dd2bffdf1390665bc5709f2b631a6fa69a7fca958f19bd7cc617183da1f50ee63e9352b5 +ae151310985940471e6803fcf37600d7fa98830613e381e00dab943aec32c14162d51c4598e8847148148000d6e5af5c +81eb537b35b7602c45441cfc61b27fa9a30d3998fad35a064e05bc9479e9f10b62eba2b234b348219eea3cadcaac64bb +8a441434934180ab6f5bc541f86ebd06eadbee01f438836d797e930fa803a51510e005c9248cecc231a775b74d12b5e9 +81f3c250a27ba14d8496a5092b145629eb2c2e6a5298438670375363f57e2798207832c8027c3e9238ad94ecdadfc4df +a6217c311f2f3db02ceaa5b6096849fe92b6f4b6f1491535ef8525f6ccee6130bed2809e625073ecbaddd4a3eb3df186 +82d1c396f0388b942cf22b119d7ef1ad03d3dad49a74d9d01649ee284f377c8daddd095d596871669e16160299a210db +a40ddf7043c5d72a7246bd727b07f7fff1549f0e443d611de6f9976c37448b21664c5089c57f20105102d935ab82f27b +b6c03c1c97adf0c4bf4447ec71366c6c1bff401ba46236cd4a33d39291e7a1f0bb34bd078ba3a18d15c98993b153a279 +8a94f5f632068399c359c4b3a3653cb6df2b207379b3d0cdace51afdf70d6d5cce6b89a2b0fee66744eba86c98fb21c2 +b2f19e78ee85073f680c3bba1f07fd31b057c00b97040357d97855b54a0b5accb0d3b05b2a294568fcd6a4be6f266950 +a74632d13bbe2d64b51d7a9c3ae0a5a971c19f51cf7596a807cea053e6a0f3719700976d4e394b356c0329a2dced9aa2 +afef616d341a9bc94393b8dfba68ff0581436aa3a3adb7c26a1bbf2cf19fa877066191681f71f17f3cd6f9cf6bf70b5a +8ce96d93ae217408acf7eb0f9cbb9563363e5c7002e19bbe1e80760bc9d449daee2118f3878b955163ed664516b97294 +8414f79b496176bc8b8e25f8e4cfee28f4f1c2ddab099d63d2aca1b6403d26a571152fc3edb97794767a7c4686ad557c +b6c61d01fd8ce087ef9f079bf25bf10090db483dd4f88c4a786d31c1bdf52065651c1f5523f20c21e75cea17df69ab73 +a5790fd629be70545093631efadddc136661f63b65ec682609c38ef7d3d7fa4e56bdf94f06e263bc055b90cb1c6bcefe +b515a767e95704fb7597bca9e46f1753abacdc0e56e867ee3c6f4cd382643c2a28e65312c05ad040eaa3a8cbe7217a65 +8135806a02ead6aa92e9adb6fefb91349837ab73105aaa7be488ef966aa8dfaafdfa64bbae30fcbfa55dd135a036a863 +8f22435702716d76b1369750694540742d909d5e72b54d0878245fab7c269953b1c6f2b29c66f08d5e0263ca3a731771 +8e0f8a8e8753e077dac95848212aeffd51c23d9b6d611df8b102f654089401954413ecbedc6367561ca599512ae5dda7 +815a9084e3e2345f24c5fa559deec21ee1352fb60f4025c0779be65057f2d528a3d91593bd30d3a185f5ec53a9950676 +967e6555ccba395b2cc1605f8484c5112c7b263f41ce8439a99fd1c71c5ed14ad02684d6f636364199ca48afbbde13be +8cd0ccf17682950b34c796a41e2ea7dd5367aba5e80a907e01f4cdc611e4a411918215e5aebf4292f8b24765d73314a6 +a58bf1bbb377e4b3915df6f058a0f53b8fb8130fdec8c391f6bc82065694d0be59bb67ffb540e6c42cc8b380c6e36359 +92af3151d9e6bfb3383d85433e953c0160859f759b0988431ec5893542ba40288f65db43c78a904325ef8d324988f09d +8011bbb05705167afb47d4425065630f54cb86cd462095e83b81dfebf348f846e4d8fbcf1c13208f5de1931f81da40b9 +81c743c104fc3cb047885c9fa0fb9705c3a83ee24f690f539f4985509c3dafd507af3f6a2128276f45d5939ef70c167f +a2c9679b151c041aaf5efeac5a737a8f70d1631d931609fca16be1905682f35e291292874cb3b03f14994f98573c6f44 +a4949b86c4e5b1d5c82a337e5ce6b2718b1f7c215148c8bfb7e7c44ec86c5c9476048fc5c01f57cb0920876478c41ad6 +86c2495088bd1772152e527a1da0ef473f924ea9ab0e5b8077df859c28078f73c4e22e3a906b507fdf217c3c80808b5c +892e0a910dcf162bcea379763c3e2349349e4cda9402949255ac4a78dd5a47e0bf42f5bd0913951576b1d206dc1e536a +a7009b2c6b396138afe4754b7cc10dee557c51c7f1a357a11486b3253818531f781ea8107360c8d4c3b1cd96282353c0 +911763ef439c086065cc7b4e57484ed6d693ea44acee4b18c9fd998116da55fbe7dcb8d2a0f0f9b32132fca82d73dff6 +a722000b95a4a2d40bed81870793f15ba2af633f9892df507f2842e52452e02b5ea8dea6a043c2b2611d82376e33742a +9387ac49477bd719c2f92240d0bdfcf9767aad247ca93dc51e56106463206bc343a8ec855eb803471629a66fffb565d6 +92819a1fa48ab4902939bb72a0a4e6143c058ea42b42f9bc6cea5df45f49724e2530daf3fc4f097cceefa2a8b9db0076 +98eac7b04537653bc0f4941aae732e4b1f84bd276c992c64a219b8715eb1fb829b5cbd997d57feb15c7694c468f95f70 +b275e7ba848ce21bf7996e12dbeb8dadb5d0e4f1cb5a0248a4f8f9c9fe6c74e3c93f4b61edbcb0a51af5a141e1c14bc7 +97243189285aba4d49c53770c242f2faf5fd3914451da4931472e3290164f7663c726cf86020f8f181e568c72fd172d1 +839b0b3c25dd412bee3dc24653b873cc65454f8f16186bb707bcd58259c0b6765fa4c195403209179192a4455c95f3b8 +8689d1a870514568a074a38232e2ceb4d7df30fabeb76cff0aed5b42bf7f02baea12c5fadf69f4713464dbd52aafa55f +8958ae7b290f0b00d17c3e9fdb4dbf168432b457c7676829299dd428984aba892de1966fc106cfc58a772862ecce3976 +a422bc6bd68b8870cfa5bc4ce71781fd7f4368b564d7f1e0917f6013c8bbb5b240a257f89ecfdbecb40fe0f3aa31d310 +aa61f78130cebe09bc9a2c0a37f0dd57ed2d702962e37d38b1df7f17dc554b1d4b7a39a44182a452ce4c5eb31fa4cfcc +b7918bd114f37869bf1a459023386825821bfadce545201929d13ac3256d92a431e34f690a55d944f77d0b652cefeffc +819bba35fb6ace1510920d4dcff30aa682a3c9af9022e287751a6a6649b00c5402f14b6309f0aeef8fce312a0402915e +8b7c9ad446c6f63c11e1c24e24014bd570862b65d53684e107ba9ad381e81a2eaa96731b4b33536efd55e0f055071274 +8fe79b53f06d33386c0ec7d6d521183c13199498594a46d44a8a716932c3ec480c60be398650bbfa044fa791c4e99b65 +9558e10fb81250b9844c99648cf38fa05ec1e65d0ccbb18aa17f2d1f503144baf59d802c25be8cc0879fff82ed5034ad +b538a7b97fbd702ba84645ca0a63725be1e2891c784b1d599e54e3480e4670d0025526674ef5cf2f87dddf2290ba09f0 +92eafe2e869a3dd8519bbbceb630585c6eb21712b2f31e1b63067c0acb5f9bdbbcbdb612db4ea7f9cc4e7be83d31973f +b40d21390bb813ab7b70a010dff64c57178418c62685761784e37d327ba3cb9ef62df87ecb84277c325a637fe3709732 +b349e6fbf778c4af35fbed33130bd8a7216ed3ba0a79163ebb556e8eb8e1a7dad3456ddd700dad9d08d202491c51b939 +a8fdaedecb251f892b66c669e34137f2650509ade5d38fbe8a05d9b9184bb3b2d416186a3640429bd1f3e4b903c159dd +ac6167ebfee1dbab338eff7642f5e785fc21ef0b4ddd6660333fe398068cbd6c42585f62e81e4edbb72161ce852a1a4f +874b1fbf2ebe140c683bd7e4e0ab017afa5d4ad38055aaa83ee6bbef77dbc88a6ce8eb0dcc48f0155244af6f86f34c2d +903c58e57ddd9c446afab8256a6bb6c911121e6ccfb4f9b4ed3e2ed922a0e500a5cb7fa379d5285bc16e11dac90d1fda +8dae7a0cffa2fd166859cd1bf10ff82dd1932e488af377366b7efc0d5dec85f85fe5e8150ff86a79a39cefc29631733a +aa047857a47cc4dfc08585f28640420fcf105b881fd59a6cf7890a36516af0644d143b73f3515ab48faaa621168f8c31 +864508f7077c266cc0cb3f7f001cb6e27125ebfe79ab57a123a8195f2e27d3799ff98413e8483c533b46a816a3557f1f +8bcd45ab1f9cbab36937a27e724af819838f66dfeb15923f8113654ff877bd8667c54f6307aaf0c35027ca11b6229bfd +b21aa34da9ab0a48fcfdd291df224697ce0c1ebc0e9b022fdee8750a1a4b5ba421c419541ed5c98b461eecf363047471 +a9a18a2ab2fae14542dc336269fe612e9c1af6cf0c9ac933679a2f2cb77d3c304114f4d219ca66fe288adde30716775b +b5205989b92c58bdda71817f9a897e84100b5c4e708de1fced5c286f7a6f01ae96b1c8d845f3a320d77c8e2703c0e8b1 +a364059412bbcc17b8907d43ac8e5df90bc87fd1724b5f99832d0d24559fae6fa76a74cff1d1eac8cbac6ec80b44af20 +ae709f2c339886b31450834cf29a38b26eb3b0779bd77c9ac269a8a925d1d78ea3837876c654b61a8fe834b3b6940808 +8802581bba66e1952ac4dab36af371f66778958f4612901d95e5cac17f59165e6064371d02de8fb6fccf89c6dc8bd118 +a313252df653e29c672cbcfd2d4f775089cb77be1077381cf4dc9533790e88af6cedc8a119158e7da5bf6806ad9b91a1 +992a065b4152c7ef11515cd54ba9d191fda44032a01aed954acff3443377ee16680c7248d530b746b8c6dee2d634e68c +b627b683ee2b32c1ab4ccd27b9f6cce2fe097d96386fa0e5c182ad997c4c422ab8dfc03870cd830b8c774feb66537282 +b823cf8a9aee03dadd013eb9efe40a201b4b57ef67efaae9f99683005f5d1bf55e950bf4af0774f50859d743642d3fea +b8a7449ffac0a3f206677097baf7ce00ca07a4d2bd9b5356fbcb83f3649b0fda07cfebad220c1066afba89e5a52abf4b +b2dd1a2f986395bb4e3e960fbbe823dbb154f823284ebc9068502c19a7609790ec0073d08bfa63f71e30c7161b6ef966 +98e5236de4281245234f5d40a25b503505af140b503a035fc25a26159a9074ec81512b28f324c56ea2c9a5aa7ce90805 +89070847dc8bbf5bc4ed073aa2e2a1f699cf0c2ca226f185a0671cecc54e7d3e14cd475c7752314a7a8e7476829da4bc +a9402dc9117fdb39c4734c0688254f23aed3dce94f5f53f5b7ef2b4bf1b71a67f85ab1a38ec224a59691f3bee050aeb3 +957288f9866a4bf56a4204218ccc583f717d7ce45c01ea27142a7e245ad04a07f289cc044f8cf1f21d35e67e39299e9c +b2fb31ccb4e69113763d7247d0fc8edaae69b550c5c56aecacfd780c7217dc672f9fb7496edf4aba65dacf3361268e5b +b44a4526b2f1d6eb2aa8dba23bfa385ff7634572ab2afddd0546c3beb630fbfe85a32f42dd287a7fec069041411537f7 +8db5a6660c3ac7fd7a093573940f068ee79a82bc17312af900b51c8c439336bc86ca646c6b7ab13aaaa008a24ca508ab +8f9899a6d7e8eb4367beb5c060a1f8e94d8a21099033ae582118477265155ba9e72176a67f7f25d7bad75a152b56e21a +a67de0e91ade8d69a0e00c9ff33ee2909b8a609357095fa12319e6158570c232e5b6f4647522efb7345ce0052aa9d489 +82eb2414898e9c3023d57907a2b17de8e7eea5269029d05a94bfd7bf5685ac4a799110fbb375eb5e0e2bd16acf6458ae +94451fc7fea3c5a89ba701004a9693bab555cb622caf0896b678faba040409fdfd14a978979038b2a81e8f0abc4994d2 +ac879a5bb433998e289809a4a966bd02b4bf6a9c1cc276454e39c886efcf4fc68baebed575826bde577ab5aa71d735a9 +880c0f8f49c875dfd62b4ddedde0f5c8b19f5687e693717f7e5c031bc580e58e13ab497d48b4874130a18743c59fdce3 +b582af8d8ff0bf76f0a3934775e0b54c0e8fed893245d7d89cae65b03c8125b7237edc29dc45b4fe1a3fe6db45d280ee +89f337882ed3ae060aaee98efa20d79b6822bde9708c1c5fcee365d0ec9297f694cae37d38fd8e3d49717c1e86f078e7 +826d2c1faea54061848b484e288a5f4de0d221258178cf87f72e14baaa4acc21322f8c9eab5dde612ef497f2d2e1d60b +a5333d4f227543e9cd741ccf3b81db79f2f03ca9e649e40d6a6e8ff9073e06da83683566d3b3c8d7b258c62970fb24d1 +a28f08c473db06aaf4c043a2fae82b3c8cfaa160bce793a4c208e4e168fb1c65115ff8139dea06453c5963d95e922b94 +8162546135cc5e124e9683bdfaa45833c18553ff06a0861c887dc84a5b12ae8cd4697f6794c7ef6230492c32faba7014 +b23f0d05b74c08d6a7df1760792be83a761b36e3f8ae360f3c363fb196e2a9dd2de2e492e49d36561366e14daa77155c +b6f70d6c546722d3907c708d630dbe289771d2c8bf059c2e32b77f224696d750b4dda9b3a014debda38e7d02c9a77585 +83bf4c4a9f3ca022c631017e7a30ea205ba97f7f5927cba8fc8489a4646eac6712cb821c5668c9ffe94d69d524374a27 +b0371475425a8076d0dd5f733f55aabbe42d20a7c8ea7da352e736d4d35a327b2beb370dfcb05284e22cfd69c5f6c4cc +a0031ba7522c79211416c2cca3aa5450f96f8fee711552a30889910970ba13608646538781a2c08b834b140aadd7166f +99d273c80c7f2dc6045d4ed355d9fc6f74e93549d961f4a3b73cd38683f905934d359058cd1fc4da8083c7d75070487f +b0e4b0efa3237793e9dcce86d75aafe9879c5fa23f0d628649aef2130454dcf72578f9bf227b9d2b9e05617468e82588 +a5ab076fa2e1c5c51f3ae101afdd596ad9d106bba7882b359c43d8548b64f528af19afa76cd6f40da1e6c5fca4def3fa +8ce2299e570331d60f6a6eff1b271097cd5f1c0e1113fc69b89c6a0f685dabea3e5bc2ac6bd789aa492ab189f89be494 +91b829068874d911a310a5f9dee001021f97471307b5a3de9ec336870ec597413e1d92010ce320b619f38bed7c4f7910 +b14fe91f4b07bf33b046e9285b66cb07927f3a8da0af548ac2569b4c4fb1309d3ced76d733051a20814e90dd5b75ffd1 +abaab92ea6152d40f82940277c725aa768a631ee0b37f5961667f82fb990fc11e6d3a6a2752b0c6f94563ed9bb28265c +b7fe28543eca2a716859a76ab9092f135337e28109544f6bd2727728d0a7650428af5713171ea60bfc273d1c821d992c +8a4917b2ab749fc7343fc64bdf51b6c0698ff15d740cc7baf248c030475c097097d5a473bcc00d8c25817563fe0447b4 +aa96156d1379553256350a0a3250166add75948fb9cde62aa555a0a9dc0a9cb7f2f7b8428aff66097bf6bfedaf14bbe2 +ae4ffeb9bdc76830d3eca2b705f30c1bdede6412fa064260a21562c8850c7fb611ec62bc68479fe48f692833e6f66d8d +b96543caaba9d051600a14997765d49e4ab10b07c7a92cccf0c90b309e6da334fdd6d18c96806cbb67a7801024fbd3c7 +97b2b9ad76f19f500fcc94ca8e434176249f542ac66e5881a3dccd07354bdab6a2157018b19f8459437a68d8b86ba8e0 +a8d206f6c5a14c80005849474fde44b1e7bcf0b2d52068f5f97504c3c035b09e65e56d1cf4b5322791ae2c2fdbd61859 +936bad397ad577a70cf99bf9056584a61bd7f02d2d5a6cf219c05d770ae30a5cd902ba38366ce636067fc1dd10108d31 +a77e30195ee402b84f3882e2286bf5380c0ed374a112dbd11e16cef6b6b61ab209d4635e6f35cdaaa72c1a1981d5dabe +a46ba4d3947188590a43c180757886a453a0503f79cc435322d92490446f37419c7b999fdf868a023601078070e03346 +80d8d4c5542f223d48240b445d4d8cf6a75d120b060bc08c45e99a13028b809d910b534d2ac47fb7068930c54efd8da9 +803be9c68c91b42b68e1f55e58917a477a9a6265e679ca44ee30d3eb92453f8c89c64eafc04c970d6831edd33d066902 +b14b2b3d0dfe2bb57cee4cd72765b60ac33c1056580950be005790176543826c1d4fbd737f6cfeada6c735543244ab57 +a9e480188bba1b8fb7105ff12215706665fd35bf1117bacfb6ab6985f4dbc181229873b82e5e18323c2b8f5de03258e0 +a66a0f0779436a9a3999996d1e6d3000f22c2cac8e0b29cddef9636393c7f1457fb188a293b6c875b05d68d138a7cc4a +848397366300ab40c52d0dbbdafbafef6cd3dadf1503bb14b430f52bb9724188928ac26f6292a2412bc7d7aa620763c8 +95466cc1a78c9f33a9aaa3829a4c8a690af074916b56f43ae46a67a12bb537a5ac6dbe61590344a25b44e8512355a4a7 +8b5f7a959f818e3baf0887f140f4575cac093d0aece27e23b823cf421f34d6e4ff4bb8384426e33e8ec7b5eed51f6b5c +8d5e1368ec7e3c65640d216bcc5d076f3d9845924c734a34f3558ac0f16e40597c1a775a25bf38b187213fbdba17c93b +b4647c1b823516880f60d20c5cc38c7f80b363c19d191e8992226799718ee26b522a12ecb66556ed3d483aa4824f3326 +ac3abaea9cd283eb347efda4ed9086ea3acf495043e08d0d19945876329e8675224b685612a6badf8fd72fb6274902b1 +8eae1ce292d317aaa71bcf6e77e654914edd5090e2e1ebab78b18bb41b9b1bc2e697439f54a44c0c8aa0d436ebe6e1a9 +94dc7d1aec2c28eb43d93b111fa59aaa0d77d5a09501220bd411768c3e52208806abf973c6a452fd8292ff6490e0c9e2 +8fd8967f8e506fef27d17b435d6b86b232ec71c1036351f12e6fb8a2e12daf01d0ee04451fb944d0f1bf7fd20e714d02 +824e6865be55d43032f0fec65b3480ea89b0a2bf860872237a19a54bc186a85d2f8f9989cc837fbb325b7c72d9babe2c +8bd361f5adb27fd6f4e3f5de866e2befda6a8454efeb704aacc606f528c03f0faae888f60310e49440496abd84083ce2 +b098a3c49f2aaa28b6b3e85bc40ce6a9cdd02134ee522ae73771e667ad7629c8d82c393fba9f27f5416986af4c261438 +b385f5ca285ff2cfe64dcaa32dcde869c28996ed091542600a0b46f65f3f5a38428cca46029ede72b6cf43e12279e3d3 +8196b03d011e5be5288196ef7d47137d6f9237a635ab913acdf9c595fa521d9e2df722090ec7eb0203544ee88178fc5f +8ed1270211ef928db18e502271b7edf24d0bbd11d97f2786aee772d70c2029e28095cf8f650b0328cc8a4c38d045316d +a52ab60e28d69b333d597a445884d44fd2a7e1923dd60f763951e1e45f83e27a4dac745f3b9eff75977b3280e132c15d +91e9fe78cdac578f4a4687f71b800b35da54b824b1886dafec073a3c977ce7a25038a2f3a5b1e35c2c8c9d1a7312417c +a42832173f9d9491c7bd93b21497fbfa4121687cd4d2ab572e80753d7edcbb42cfa49f460026fbde52f420786751a138 +97b947126d84dcc70c97be3c04b3de3f239b1c4914342fa643b1a4bb8c4fe45c0fcb585700d13a7ed50784790c54bef9 +860e407d353eac070e2418ef6cb80b96fc5f6661d6333e634f6f306779651588037be4c2419562c89c61f9aa2c4947f5 +b2c9d93c3ba4e511b0560b55d3501bf28a510745fd666b3cb532db051e6a8617841ea2f071dda6c9f15619c7bfd2737f +8596f4d239aeeac78311207904d1bd863ef68e769629cc379db60e019aaf05a9d5cd31dc8e630b31e106a3a93e47cbc5 +8b26e14e2e136b65c5e9e5c2022cee8c255834ea427552f780a6ca130a6446102f2a6f334c3f9a0308c53df09e3dba7e +b54724354eb515a3c8bed0d0677ff1db94ac0a07043459b4358cb90e3e1aa38ac23f2caa3072cf9647275d7cd61d0e80 +b7ce9fe0e515e7a6b2d7ddcb92bc0196416ff04199326aea57996eef8c5b1548bd8569012210da317f7c0074691d01b7 +a1a13549c82c877253ddefa36a29ea6a23695ee401fdd48e65f6f61e5ebd956d5e0edeff99484e9075cb35071fec41e2 +838ba0c1e5bd1a6da05611ff1822b8622457ebd019cb065ece36a2d176bd2d889511328120b8a357e44569e7f640c1e6 +b916eccff2a95519400bbf76b5f576cbe53cf200410370a19d77734dc04c05b585cfe382e8864e67142d548cd3c4c2f4 +a610447cb7ca6eea53a6ff1f5fe562377dcb7f4aaa7300f755a4f5e8eba61e863c51dc2aa9a29b35525b550fbc32a0fe +9620e8f0f0ee9a4719aa9685eeb1049c5c77659ba6149ec4c158f999cfd09514794b23388879931fe26fea03fa471fd3 +a9dcf8b679e276583cf5b9360702a185470d09aea463dc474ee9c8aee91ef089dacb073e334e47fbc78ec5417c90465c +8c9adee8410bdd99e5b285744cee61e2593b6300ff31a8a83b0ec28da59475a5c6fb9346fe43aadea2e6c3dad2a8e30a +97d5afe9b3897d7b8bb628b7220cf02d8ee4e9d0b78f5000d500aaf4c1df9251aaaabfd1601626519f9d66f00a821d4e +8a382418157b601ce4c3501d3b8409ca98136a4ef6abcbf62885e16e215b76b035c94d149cc41ff92e42ccd7c43b9b3d +b64b8d11fb3b01abb2646ac99fdb9c02b804ce15d98f9fe0fbf1c9df8440c71417487feb6cdf51e3e81d37104b19e012 +849d7d044f9d8f0aab346a9374f0b3a5d14a9d1faa83dbacccbdc629ad1ef903a990940255564770537f8567521d17f0 +829dbb0c76b996c2a91b4cbbe93ba455ca0d5729755e5f0c92aaee37dff7f36fcdc06f33aca41f1b609c784127b67d88 +85a7c0069047b978422d264d831ab816435f63938015d2e977222b6b5746066c0071b7f89267027f8a975206ed25c1b0 +84b9fbc1cfb302df1acdcf3dc5d66fd1edfe7839f7a3b2fb3a0d5548656249dd556104d7c32b73967bccf0f5bdcf9e3b +972220ac5b807f53eac37dccfc2ad355d8b21ea6a9c9b011c09fe440ddcdf7513e0b43d7692c09ded80d7040e26aa28f +855885ed0b21350baeca890811f344c553cf9c21024649c722453138ba29193c6b02c4b4994cd414035486f923472e28 +841874783ae6d9d0e59daea03e96a01cbbe4ecaced91ae4f2c8386e0d87b3128e6d893c98d17c59e4de1098e1ad519dd +827e50fc9ce56f97a4c3f2f4cbaf0b22f1c3ce6f844ff0ef93a9c57a09b8bf91ebfbd2ba9c7f83c442920bffdaf288cc +a441f9136c7aa4c08d5b3534921b730e41ee91ab506313e1ba5f7c6f19fd2d2e1594e88c219834e92e6fb95356385aa7 +97d75b144471bf580099dd6842b823ec0e6c1fb86dd0da0db195e65524129ea8b6fd4a7a9bbf37146269e938a6956596 +a4b6fa87f09d5a29252efb2b3aaab6b3b6ea9fab343132a651630206254a25378e3e9d6c96c3d14c150d01817d375a8e +a31a671876d5d1e95fe2b8858dc69967231190880529d57d3cab7f9f4a2b9b458ac9ee5bdaa3289158141bf18f559efb +90bee6fff4338ba825974021b3b2a84e36d617e53857321f13d2b3d4a28954e6de3b3c0e629d61823d18a9763313b3bf +96b622a63153f393bb419bfcf88272ea8b3560dbd46b0aa07ada3a6223990d0abdd6c2adb356ef4be5641688c8d83941 +84c202adeaff9293698022bc0381adba2cd959f9a35a4e8472288fd68f96f6de8be9da314c526d88e291c96b1f3d6db9 +8ca01a143b8d13809e5a8024d03e6bc9492e22226073ef6e327edf1328ef4aff82d0bcccee92cb8e212831fa35fe1204 +b2f970dbad15bfbefb38903c9bcc043d1367055c55dc1100a850f5eb816a4252c8c194b3132c929105511e14ea10a67d +a5e36556472a95ad57eb90c3b6623671b03eafd842238f01a081997ffc6e2401f76e781d049bb4aa94d899313577a9cf +8d1057071051772f7c8bedce53a862af6fd530dd56ae6321eaf2b9fc6a68beff5ed745e1c429ad09d5a118650bfd420a +8aadc4f70ace4fcb8d93a78610779748dcffc36182d45b932c226dc90e48238ea5daa91f137c65ed532352c4c4d57416 +a2ea05ae37e673b4343232ae685ee14e6b88b867aef6dfac35db3589cbcd76f99540fed5c2641d5bb5a4a9f808e9bf0d +947f1abad982d65648ae4978e094332b4ecb90f482c9be5741d5d1cf5a28acf4680f1977bf6e49dd2174c37f11e01296 +a27b144f1565e4047ba0e3f4840ef19b5095d1e281eaa463c5358f932114cbd018aa6dcf97546465cf2946d014d8e6d6 +8574e1fc3acade47cd4539df578ce9205e745e161b91e59e4d088711a7ab5aa3b410d517d7304b92109924d9e2af8895 +a48ee6b86b88015d6f0d282c1ae01d2a5b9e8c7aa3d0c18b35943dceb1af580d08a65f54dc6903cde82fd0d73ce94722 +8875650cec543a7bf02ea4f2848a61d167a66c91ffaefe31a9e38dc8511c6a25bde431007eefe27a62af3655aca208dc +999b0a6e040372e61937bf0d68374e230346b654b5a0f591a59d33a4f95bdb2f3581db7c7ccb420cd7699ed709c50713 +878c9e56c7100c5e47bbe77dc8da5c5fe706cec94d37fa729633bca63cace7c40102eee780fcdabb655f5fa47a99600e +865006fb5b475ada5e935f27b96f9425fc2d5449a3c106aa366e55ebed3b4ee42adc3c3f0ac19fd129b40bc7d6bc4f63 +b7a7da847f1202e7bc1672553e68904715e84fd897d529243e3ecda59faa4e17ba99c649a802d53f6b8dfdd51f01fb74 +8b2fb4432c05653303d8c8436473682933a5cb604da10c118ecfcd2c8a0e3132e125afef562bdbcc3df936164e5ce4f2 +808d95762d33ddfa5d0ee3d7d9f327de21a994d681a5f372e2e3632963ea974da7f1f9e5bac8ccce24293509d1f54d27 +932946532e3c397990a1df0e94c90e1e45133e347a39b6714c695be21aeb2d309504cb6b1dde7228ff6f6353f73e1ca2 +9705e7c93f0cdfaa3fa96821f830fe53402ad0806036cd1b48adc2f022d8e781c1fbdab60215ce85c653203d98426da3 +aa180819531c3ec1feb829d789cb2092964c069974ae4faad60e04a6afcce5c3a59aec9f11291e6d110a788d22532bc6 +88f755097f7e25cb7dd3c449520c89b83ae9e119778efabb54fbd5c5714b6f37c5f9e0346c58c6ab09c1aef2483f895d +99fc03ab7810e94104c494f7e40b900f475fde65bdec853e60807ffd3f531d74de43335c3b2646b5b8c26804a7448898 +af2dea9683086bed1a179110efb227c9c00e76cd00a2015b089ccbcee46d1134aa18bda5d6cab6f82ae4c5cd2461ac21 +a500f87ba9744787fdbb8e750702a3fd229de6b8817594348dec9a723b3c4240ddfa066262d002844b9e38240ce55658 +924d0e45c780f5bc1c1f35d15dfc3da28036bdb59e4c5440606750ecc991b85be18bc9a240b6c983bc5430baa4c68287 +865b11e0157b8bf4c5f336024b016a0162fc093069d44ac494723f56648bc4ded13dfb3896e924959ea11c96321afefc +93672d8607d4143a8f7894f1dcca83fb84906dc8d6dd7dd063bb0049cfc20c1efd933e06ca7bd03ea4cb5a5037990bfe +826891efbdff0360446825a61cd1fa04326dd90dae8c33dfb1ed97b045e165766dd070bd7105560994d0b2044bdea418 +93c4a4a8bcbc8b190485cc3bc04175b7c0ed002c28c98a540919effd6ed908e540e6594f6db95cd65823017258fb3b1c +aeb2a0af2d2239fda9aa6b8234b019708e8f792834ff0dd9c487fa09d29800ddceddd6d7929faa9a3edcb9e1b3aa0d6b +87f11de7236d387863ec660d2b04db9ac08143a9a2c4dfff87727c95b4b1477e3bc473a91e5797313c58754905079643 +80dc1db20067a844fe8baceca77f80db171a5ca967acb24e2d480eae9ceb91a3343c31ad1c95b721f390829084f0eae6 +9825c31f1c18da0de3fa84399c8b40f8002c3cae211fb6a0623c76b097b4d39f5c50058f57a16362f7a575909d0a44a2 +a99fc8de0c38dbf7b9e946de83943a6b46a762167bafe2a603fb9b86f094da30d6de7ed55d639aafc91936923ee414b3 +ad594678b407db5d6ea2e90528121f84f2b96a4113a252a30d359a721429857c204c1c1c4ff71d8bb5768c833f82e80e +b33d985e847b54510b9b007e31053732c8a495e43be158bd2ffcea25c6765bcbc7ca815f7c60b36ad088b955dd6e9350 +815f8dfc6f90b3342ca3fbd968c67f324dae8f74245cbf8bc3bef10e9440c65d3a2151f951e8d18959ba01c1b50b0ec1 +94c608a362dd732a1abc56e338637c900d59013db8668e49398b3c7a0cae3f7e2f1d1bf94c0299eeafe6af7f76c88618 +8ebd8446b23e5adfcc393adc5c52fe172f030a73e63cd2d515245ca0dd02782ceed5bcdd9ccd9c1b4c5953dfac9c340c +820437f3f6f9ad0f5d7502815b221b83755eb8dc56cd92c29e9535eb0b48fb8d08c9e4fcc26945f9c8cca60d89c44710 +8910e4e8a56bf4be9cc3bbf0bf6b1182a2f48837a2ed3c2aaec7099bfd7f0c83e14e608876b17893a98021ff4ab2f20d +9633918fde348573eec15ce0ad53ac7e1823aac86429710a376ad661002ae6d049ded879383faaa139435122f64047c6 +a1f5e3fa558a9e89318ca87978492f0fb4f6e54a9735c1b8d2ecfb1d1c57194ded6e0dd82d077b2d54251f3bee1279e1 +b208e22d04896abfd515a95c429ff318e87ff81a5d534c8ac2c33c052d6ffb73ef1dccd39c0bbe0734b596c384014766 +986d5d7d2b5bde6d16336f378bd13d0e671ad23a8ec8a10b3fc09036faeeb069f60662138d7a6df3dfb8e0d36180f770 +a2d4e6c5f5569e9cef1cddb569515d4b6ace38c8aed594f06da7434ba6b24477392cc67ba867c2b079545ca0c625c457 +b5ac32b1d231957d91c8b7fc43115ce3c5c0d8c13ca633374402fa8000b6d9fb19499f9181844f0c10b47357f3f757ce +96b8bf2504b4d28fa34a4ec378e0e0b684890c5f44b7a6bb6e19d7b3db2ab27b1e2686389d1de9fbd981962833a313ea +953bfd7f6c3a0469ad432072b9679a25486f5f4828092401eff494cfb46656c958641a4e6d0d97d400bc59d92dba0030 +876ab3cea7484bbfd0db621ec085b9ac885d94ab55c4bb671168d82b92e609754b86aaf472c55df3d81421d768fd108a +885ff4e67d9ece646d02dd425aa5a087e485c3f280c3471b77532b0db6145b69b0fbefb18aa2e3fa5b64928b43a94e57 +b91931d93f806d0b0e6cc62a53c718c099526140f50f45d94b8bbb57d71e78647e06ee7b42aa5714aed9a5c05ac8533f +a0313eeadd39c720c9c27b3d671215331ab8d0a794e71e7e690f06bcd87722b531d6525060c358f35f5705dbb7109ccb +874c0944b7fedc6701e53344100612ddcb495351e29305c00ec40a7276ea5455465ffb7bded898886c1853139dfb1fc7 +8dc31701a01ee8137059ca1874a015130d3024823c0576aa9243e6942ec99d377e7715ed1444cd9b750a64b85dcaa3e5 +836d2a757405e922ec9a2dfdcf489a58bd48b5f9683dd46bf6047688f778c8dee9bc456de806f70464df0b25f3f3d238 +b30b0a1e454a503ea3e2efdec7483eaf20b0a5c3cefc42069e891952b35d4b2c955cf615f3066285ed8fafd9fcfbb8f6 +8e6d4044b55ab747e83ec8762ea86845f1785cc7be0279c075dadf08aca3ccc5a096c015bb3c3f738f647a4eadea3ba5 +ad7735d16ab03cbe09c029610aa625133a6daecfc990b297205b6da98eda8c136a7c50db90f426d35069708510d5ae9c +8d62d858bbb59ec3c8cc9acda002e08addab4d3ad143b3812098f3d9087a1b4a1bb255dcb1635da2402487d8d0249161 +805beec33238b832e8530645a3254aeef957e8f7ea24bcfc1054f8b9c69421145ebb8f9d893237e8a001c857fedfc77e +b1005644be4b085e3f5775aa9bd3e09a283e87ddada3082c04e7a62d303dcef3b8cf8f92944c200c7ae6bb6bdf63f832 +b4ba0e0790dc29063e577474ffe3b61f5ea2508169f5adc1e394934ebb473e356239413a17962bc3e5d3762d72cce8c2 +a157ba9169c9e3e6748d9f1dd67fbe08b9114ade4c5d8fc475f87a764fb7e6f1d21f66d7905cd730f28a1c2d8378682a +913e52b5c93989b5d15e0d91aa0f19f78d592bc28bcfdfddc885a9980c732b1f4debb8166a7c4083c42aeda93a702898 +90fbfc1567e7cd4e096a38433704d3f96a2de2f6ed3371515ccc30bc4dd0721a704487d25a97f3c3d7e4344472702d8d +89646043028ffee4b69d346907586fd12c2c0730f024acb1481abea478e61031966e72072ff1d5e65cb8c64a69ad4eb1 +b125a45e86117ee11d2fb42f680ab4a7894edd67ff927ae2c808920c66c3e55f6a9d4588eee906f33a05d592e5ec3c04 +aad47f5b41eae9be55fb4f67674ff1e4ae2482897676f964a4d2dcb6982252ee4ff56aac49578b23f72d1fced707525e +b9ddff8986145e33851b4de54d3e81faa3352e8385895f357734085a1616ef61c692d925fe62a5ed3be8ca49f5d66306 +b3cb0963387ed28c0c0adf7fe645f02606e6e1780a24d6cecef5b7c642499109974c81a7c2a198b19862eedcea2c2d8c +ac9c53c885457aaf5cb36c717a6f4077af701e0098eebd7aa600f5e4b14e6c1067255b3a0bc40e4a552025231be7de60 +8e1a8d823c4603f6648ec21d064101094f2a762a4ed37dd2f0a2d9aa97b2d850ce1e76f4a4b8cae58819b058180f7031 +b268b73bf7a179b6d22bd37e5e8cb514e9f5f8968c78e14e4f6d5700ca0d0ca5081d0344bb73b028970eebde3cb4124e +a7f57d71940f0edbd29ed8473d0149cae71d921dd15d1ff589774003e816b54b24de2620871108cec1ab9fa956ad6ce6 +8053e6416c8b120e2b999cc2fc420a6a55094c61ac7f2a6c6f0a2c108a320890e389af96cbe378936132363c0d551277 +b3823f4511125e5aa0f4269e991b435a0d6ceb523ebd91c04d7add5534e3df5fc951c504b4fd412a309fd3726b7f940b +ae6eb04674d04e982ca9a6add30370ab90e303c71486f43ed3efbe431af1b0e43e9d06c11c3412651f304c473e7dbf39 +96ab55e641ed2e677591f7379a3cd126449614181fce403e93e89b1645d82c4af524381ff986cae7f9cebe676878646d +b52423b4a8c37d3c3e2eca8f0ddbf7abe0938855f33a0af50f117fab26415fb0a3da5405908ec5fdc22a2c1f2ca64892 +82a69ce1ee92a09cc709d0e3cd22116c9f69d28ea507fe5901f5676000b5179b9abe4c1875d052b0dd42d39925e186bb +a84c8cb84b9d5cfb69a5414f0a5283a5f2e90739e9362a1e8c784b96381b59ac6c18723a4aa45988ee8ef5c1f45cc97d +afd7efce6b36813082eb98257aae22a4c1ae97d51cac7ea9c852d4a66d05ef2732116137d8432e3f117119725a817d24 +a0f5fe25af3ce021b706fcff05f3d825384a272284d04735574ce5fb256bf27100fad0b1f1ba0e54ae9dcbb9570ecad3 +8751786cb80e2e1ff819fc7fa31c2833d25086534eb12b373d31f826382430acfd87023d2a688c65b5e983927e146336 +8cf5c4b17fa4f3d35c78ce41e1dc86988fd1135cd5e6b2bb0c108ee13538d0d09ae7102609c6070f39f937b439b31e33 +a9108967a2fedd7c322711eca8159c533dd561bedcb181b646de98bf5c3079449478eab579731bee8d215ae8852c7e21 +b54c5171704f42a6f0f4e70767cdb3d96ffc4888c842eece343a01557da405961d53ffdc34d2f902ea25d3e1ed867cad +ae8d4b764a7a25330ba205bf77e9f46182cd60f94a336bbd96773cf8064e3d39caf04c310680943dc89ed1fbad2c6e0d +aa5150e911a8e1346868e1b71c5a01e2a4bb8632c195861fb6c3038a0e9b85f0e09b3822e9283654a4d7bb17db2fc5f4 +9685d3756ce9069bf8bb716cf7d5063ebfafe37e15b137fc8c3159633c4e006ff4887ddd0ae90360767a25c3f90cba7f +82155fd70f107ab3c8e414eadf226c797e07b65911508c76c554445422325e71af8c9a8e77fd52d94412a6fc29417cd3 +abfae52f53a4b6e00760468d973a267f29321997c3dbb5aee36dc1f20619551229c0c45b9d9749f410e7f531b73378e8 +81a76d921f8ef88e774fd985e786a4a330d779b93fad7def718c014685ca0247379e2e2a007ad63ee7f729cd9ed6ce1b +81947c84bc5e28e26e2e533af5ae8fe10407a7b77436dbf8f1d5b0bbe86fc659eae10f974659dc7c826c6dabd03e3a4b +92b8c07050d635b8dd4fd09df9054efe4edae6b86a63c292e73cc819a12a21dd7d104ce51fa56af6539dedf6dbe6f7b6 +b44c579e3881f32b32d20c82c207307eca08e44995dd2aac3b2692d2c8eb2a325626c80ac81c26eeb38c4137ff95add5 +97efab8941c90c30860926dea69a841f2dcd02980bf5413b9fd78d85904588bf0c1021798dbc16c8bbb32cce66c82621 +913363012528b50698e904de0588bf55c8ec5cf6f0367cfd42095c4468fcc64954fbf784508073e542fee242d0743867 +8ed203cf215148296454012bd10fddaf119203db1919a7b3d2cdc9f80e66729464fdfae42f1f2fc5af1ed53a42b40024 +ab84312db7b87d711e9a60824f4fe50e7a6190bf92e1628688dfcb38930fe87b2d53f9e14dd4de509b2216856d8d9188 +880726def069c160278b12d2258eac8fa63f729cd351a710d28b7e601c6712903c3ac1e7bbd0d21e4a15f13ca49db5aa +980699cd51bac6283959765f5174e543ed1e5f5584b5127980cbc2ef18d984ecabba45042c6773b447b8e694db066028 +aeb019cb80dc4cb4207430d0f2cd24c9888998b6f21d9bf286cc638449668d2eec0018a4cf3fe6448673cd6729335e2b +b29852f6aa6c60effdffe96ae88590c88abae732561d35cc19e82d3a51e26cb35ea00986193e07f90060756240f5346e +a0fa855adc5ba469f35800c48414b8921455950a5c0a49945d1ef6e8f2a1881f2e2dfae47de6417270a6bf49deeb091d +b6c7332e3b14813641e7272d4f69ecc7e09081df0037d6dab97ce13a9e58510f5c930d300633f208181d9205c5534001 +85a6c050f42fce560b5a8d54a11c3bbb8407abbadd859647a7b0c21c4b579ec65671098b74f10a16245dc779dff7838e +8f3eb34bb68759d53c6677de4de78a6c24dd32c8962a7fb355ed362572ef8253733e6b52bc21c9f92ecd875020a9b8de +a17dd44181e5dab4dbc128e1af93ec22624b57a448ca65d2d9e246797e4af7d079e09c6e0dfb62db3a9957ce92f098d5 +a56a1b854c3183082543a8685bb34cae1289f86cfa8123a579049dbd059e77982886bfeb61bf6e05b4b1fe4e620932e7 +aedae3033cb2fb7628cb4803435bdd7757370a86f808ae4cecb9a268ad0e875f308c048c80cbcac523de16b609683887 +9344905376aa3982b1179497fac5a1d74b14b7038fd15e3b002db4c11c8bfc7c39430db492cdaf58b9c47996c9901f28 +a3bfafdae011a19f030c749c3b071f83580dee97dd6f949e790366f95618ca9f828f1daaeabad6dcd664fcef81b6556d +81c03d8429129e7e04434dee2c529194ddb01b414feda3adee2271eb680f6c85ec872a55c9fa9d2096f517e13ed5abcc +98205ef3a72dff54c5a9c82d293c3e45d908946fa74bb749c3aabe1ab994ea93c269bcce1a266d2fe67a8f02133c5985 +85a70aeed09fda24412fadbafbbbf5ba1e00ac92885df329e147bfafa97b57629a3582115b780d8549d07d19b7867715 +b0fbe81c719f89a57d9ea3397705f898175808c5f75f8eb81c2193a0b555869ba7bd2e6bc54ee8a60cea11735e21c68c +b03a0bd160495ee626ff3a5c7d95bc79d7da7e5a96f6d10116600c8fa20bedd1132f5170f25a22371a34a2d763f2d6d0 +a90ab04091fbca9f433b885e6c1d60ab45f6f1daf4b35ec22b09909d493a6aab65ce41a6f30c98239cbca27022f61a8b +b66f92aa3bf2549f9b60b86f99a0bd19cbdd97036d4ae71ca4b83d669607f275260a497208f6476cde1931d9712c2402 +b08e1fdf20e6a9b0b4942f14fa339551c3175c1ffc5d0ab5b226b6e6a322e9eb0ba96adc5c8d59ca4259e2bdd04a7eb0 +a2812231e92c1ce74d4f5ac3ab6698520288db6a38398bb38a914ac9326519580af17ae3e27cde26607e698294022c81 +abfcbbcf1d3b9e84c02499003e490a1d5d9a2841a9e50c7babbef0b2dd20d7483371d4dc629ba07faf46db659459d296 +b0fe9f98c3da70927c23f2975a9dc4789194d81932d2ad0f3b00843dd9cbd7fb60747a1da8fe5a79f136a601becf279d +b130a6dba7645165348cb90f023713bed0eefbd90a976b313521c60a36d34f02032e69a2bdcf5361e343ed46911297ec +862f0cffe3020cea7a5fd4703353aa1eb1be335e3b712b29d079ff9f7090d1d8b12013011e1bdcbaa80c44641fd37c9f +8c6f11123b26633e1abb9ed857e0bce845b2b3df91cc7b013b2fc77b477eee445da0285fc6fc793e29d5912977f40916 +91381846126ea819d40f84d3005e9fb233dc80071d1f9bb07f102bf015f813f61e5884ffffb4f5cd333c1b1e38a05a58 +8add7d908de6e1775adbd39c29a391f06692b936518db1f8fde74eb4f533fc510673a59afb86e3a9b52ade96e3004c57 +8780e086a244a092206edcde625cafb87c9ab1f89cc3e0d378bc9ee776313836160960a82ec397bc3800c0a0ec3da283 +a6cb4cd9481e22870fdd757fae0785edf4635e7aacb18072fe8dc5876d0bab53fb99ce40964a7d3e8bcfff6f0ab1332f +af30ff47ecc5b543efba1ba4706921066ca8bb625f40e530fb668aea0551c7647a9d126e8aba282fbcce168c3e7e0130 +91b0bcf408ce3c11555dcb80c4410b5bc2386d3c05caec0b653352377efdcb6bab4827f2018671fc8e4a0e90d772acc1 +a9430b975ef138b6b2944c7baded8fe102d31da4cfe3bd3d8778bda79189c99d38176a19c848a19e2d1ee0bddd9a13c1 +aa5a4eef849d7c9d2f4b018bd01271c1dd83f771de860c4261f385d3bdcc130218495860a1de298f14b703ec32fa235f +b0ce79e7f9ae57abe4ff366146c3b9bfb38b0dee09c28c28f5981a5d234c6810ad4d582751948affb480d6ae1c8c31c4 +b75122748560f73d15c01a8907d36d06dc068e82ce22b84b322ac1f727034493572f7907dec34ebc3ddcc976f2f89ed7 +b0fc7836369a3e4411d34792d6bd5617c14f61d9bba023dda64e89dc5fb0f423244e9b48ee64869258931daa9753a56f +8956d7455ae9009d70c6e4a0bcd7610e55f37494cf9897a8f9e1b904cc8febc3fd2d642ebd09025cfff4609ad7e3bc52 +ad741efe9e472026aa49ae3d9914cb9c1a6f37a54f1a6fe6419bebd8c7d68dca105a751c7859f4389505ede40a0de786 +b52f418797d719f0d0d0ffb0846788b5cba5d0454a69a2925de4b0b80fa4dd7e8c445e5eac40afd92897ed28ca650566 +a0ab65fb9d42dd966cd93b1de01d7c822694669dd2b7a0c04d99cd0f3c3de795f387b9c92da11353412f33af5c950e9a +a0052f44a31e5741a331f7cac515a08b3325666d388880162d9a7b97598fde8b61f9ff35ff220df224eb5c4e40ef0567 +a0101cfdc94e42b2b976c0d89612a720e55d145a5ef6ef6f1f78cf6de084a49973d9b5d45915349c34ce712512191e3c +a0dd99fcf3f5cead5aaf08e82212df3a8bb543c407a4d6fab88dc5130c1769df3f147e934a46f291d6c1a55d92b86917 +a5939153f0d1931bbda5cf6bdf20562519ea55fbfa978d6dbc6828d298260c0da7a50c37c34f386e59431301a96c2232 +9568269f3f5257200f9ca44afe1174a5d3cf92950a7f553e50e279c239e156a9faaa2a67f288e3d5100b4142efe64856 +b746b0832866c23288e07f24991bbf687cad794e7b794d3d3b79367566ca617d38af586cdc8d6f4a85a34835be41d54f +a871ce28e39ab467706e32fec1669fda5a4abba2f8c209c6745df9f7a0fa36bbf1919cf14cb89ea26fa214c4c907ae03 +a08dacdd758e523cb8484f6bd070642c0c20e184abdf8e2a601f61507e93952d5b8b0c723c34fcbdd70a8485eec29db2 +85bdb78d501382bb95f1166b8d032941005661aefd17a5ac32df9a3a18e9df2fc5dc2c1f07075f9641af10353cecc0c9 +98d730c28f6fa692a389e97e368b58f4d95382fad8f0baa58e71a3d7baaea1988ead47b13742ce587456f083636fa98e +a557198c6f3d5382be9fb363feb02e2e243b0c3c61337b3f1801c4a0943f18e38ce1a1c36b5c289c8fa2aa9d58742bab +89174f79201742220ac689c403fc7b243eed4f8e3f2f8aba0bf183e6f5d4907cb55ade3e238e3623d9885f03155c4d2b +b891d600132a86709e06f3381158db300975f73ea4c1f7c100358e14e98c5fbe792a9af666b85c4e402707c3f2db321e +b9e5b2529ef1043278c939373fc0dbafe446def52ddd0a8edecd3e4b736de87e63e187df853c54c28d865de18a358bb6 +8589b2e9770340c64679062c5badb7bbef68f55476289b19511a158a9a721f197da03ece3309e059fc4468b15ac33aa3 +aad8c6cd01d785a881b446f06f1e9cd71bca74ba98674c2dcddc8af01c40aa7a6d469037498b5602e76e9c91a58d3dbd +abaccb1bd918a8465f1bf8dbe2c9ad4775c620b055550b949a399f30cf0d9eb909f3851f5b55e38f9e461e762f88f499 +ae62339d26db46e85f157c0151bd29916d5cc619bd4b832814b3fd2f00af8f38e7f0f09932ffe5bba692005dab2d9a74 +93a6ff30a5c0edf8058c89aba8c3259e0f1b1be1b80e67682de651e5346f7e1b4b4ac3d87cbaebf198cf779524aff6bf +8980a2b1d8f574af45b459193c952400b10a86122b71fca2acb75ee0dbd492e7e1ef5b959baf609a5172115e371f3177 +8c2f49f3666faee6940c75e8c7f6f8edc3f704cca7a858bbb7ee5e96bba3b0cf0993996f781ba6be3b0821ef4cb75039 +b14b9e348215b278696018330f63c38db100b0542cfc5be11dc33046e3bca6a13034c4ae40d9cef9ea8b34fef0910c4e +b59bc3d0a30d66c16e6a411cb641f348cb1135186d5f69fda8b0a0934a5a2e7f6199095ba319ec87d3fe8f1ec4a06368 +8874aca2a3767aa198e4c3fec2d9c62d496bc41ff71ce242e9e082b7f38cdf356089295f80a301a3cf1182bde5308c97 +b1820ebd61376d91232423fc20bf008b2ba37e761199f4ef0648ea2bd70282766799b4de814846d2f4d516d525c8daa7 +a6b202e5dedc16a4073e04a11af3a8509b23dfe5a1952f899adeb240e75c3f5bde0c424f811a81ea48d343591faffe46 +a69becee9c93734805523b92150a59a62eed4934f66056b645728740d42223f2925a1ad38359ba644da24d9414f4cdda +ad72f0f1305e37c7e6b48c272323ee883320994cb2e0d850905d6655fafc9f361389bcb9c66b3ff8d2051dbb58c8aa96 +b563600bd56fad7c8853af21c6a02a16ed9d8a8bbeea2c31731d63b976d83cb05b9779372d898233e8fd597a75424797 +b0abb78ce465bf7051f563c62e8be9c57a2cc997f47c82819300f36e301fefd908894bb2053a9d27ce2d0f8c46d88b5b +a071a85fb8274bac2202e0cb8e0e2028a5e138a82d6e0374d39ca1884a549c7c401312f00071b91f455c3a2afcfe0cda +b931c271513a0f267b9f41444a5650b1918100b8f1a64959c552aff4e2193cc1b9927906c6fa7b8a8c68ef13d79aaa52 +a6a1bb9c7d32cb0ca44d8b75af7e40479fbce67d216b48a2bb680d3f3a772003a49d3cd675fc64e9e0f8fabeb86d6d61 +b98d609858671543e1c3b8564162ad828808bb50ded261a9f8690ded5b665ed8368c58f947365ed6e84e5a12e27b423d +b3dca58cd69ec855e2701a1d66cad86717ff103ef862c490399c771ad28f675680f9500cb97be48de34bcdc1e4503ffd +b34867c6735d3c49865e246ddf6c3b33baf8e6f164db3406a64ebce4768cb46b0309635e11be985fee09ab7a31d81402 +acb966c554188c5b266624208f31fab250b3aa197adbdd14aee5ab27d7fb886eb4350985c553b20fdf66d5d332bfd3fe +943c36a18223d6c870d54c3b051ef08d802b85e9dd6de37a51c932f90191890656c06adfa883c87b906557ae32d09da0 +81bca7954d0b9b6c3d4528aadf83e4bc2ef9ea143d6209bc45ae9e7ae9787dbcd8333c41f12c0b6deee8dcb6805e826a +aba176b92256efb68f574e543479e5cf0376889fb48e3db4ebfb7cba91e4d9bcf19dcfec444c6622d9398f06de29e2b9 +b9f743691448053216f6ece7cd699871fff4217a1409ceb8ab7bdf3312d11696d62c74b0664ba0a631b1e0237a8a0361 +a383c2b6276fa9af346b21609326b53fb14fdf6f61676683076e80f375b603645f2051985706d0401e6fbed7eb0666b6 +a9ef2f63ec6d9beb8f3d04e36807d84bda87bdd6b351a3e4a9bf7edcb5618c46c1f58cfbf89e64b40f550915c6988447 +a141b2d7a82f5005eaea7ae7d112c6788b9b95121e5b70b7168d971812f3381de8b0082ac1f0a82c7d365922ebd2d26a +b1b76ef8120e66e1535c17038b75255a07849935d3128e3e99e56567b842fb1e8d56ef932d508d2fb18b82f7868fe1a9 +8e2e234684c81f21099f5c54f6bbe2dd01e3b172623836c77668a0c49ce1fe218786c3827e4d9ae2ea25c50a8924fb3c +a5caf5ff948bfd3c4ca3ffbdfcd91eec83214a6c6017235f309a0bbf7061d3b0b466307c00b44a1009cf575163898b43 +986415a82ca16ebb107b4c50b0c023c28714281db0bcdab589f6cb13d80e473a3034b7081b3c358e725833f6d845cb14 +b94836bf406ac2cbacb10e6df5bcdfcc9d9124ae1062767ca4e322d287fd5e353fdcebd0e52407cb3cd68571258a8900 +83c6d70a640b33087454a4788dfd9ef3ed00272da084a8d36be817296f71c086b23b576f98178ab8ca6a74f04524b46b +ad4115182ad784cfe11bcfc5ce21fd56229cc2ce77ac82746e91a2f0aa53ca6593a22efd2dc4ed8d00f84542643d9c58 +ab1434c5e5065da826d10c2a2dba0facccab0e52b506ce0ce42fbe47ced5a741797151d9ecc99dc7d6373cfa1779bbf6 +8a8b591d82358d55e6938f67ea87a89097ab5f5496f7260adb9f649abb289da12b498c5b2539c2f9614fb4e21b1f66b0 +964f355d603264bc1f44c64d6d64debca66f37dff39c971d9fc924f2bc68e6c187b48564a6dc82660a98b035f8addb5d +b66235eaaf47456bc1dc4bde454a028e2ce494ece6b713a94cd6bf27cf18c717fd0c57a5681caaa2ad73a473593cdd7a +9103e3bb74304186fa4e3e355a02da77da4aca9b7e702982fc2082af67127ebb23a455098313c88465bc9b7d26820dd5 +b6a42ff407c9dd132670cdb83cbad4b20871716e44133b59a932cd1c3f97c7ac8ff7f61acfaf8628372508d8dc8cad7c +883a9c21c16a167a4171b0f084565c13b6f28ba7c4977a0de69f0a25911f64099e7bbb4da8858f2e93068f4155d04e18 +8dbb3220abc6a43220adf0331e3903d3bfd1d5213aadfbd8dfcdf4b2864ce2e96a71f35ecfb7a07c3bbabf0372b50271 +b4ad08aee48e176bda390b7d9acf2f8d5eb008f30d20994707b757dc6a3974b2902d29cd9b4d85e032810ad25ac49e97 +865bb0f33f7636ec501bb634e5b65751c8a230ae1fa807a961a8289bbf9c7fe8c59e01fbc4c04f8d59b7f539cf79ddd5 +86a54d4c12ad1e3605b9f93d4a37082fd26e888d2329847d89afa7802e815f33f38185c5b7292293d788ad7d7da1df97 +b26c8615c5e47691c9ff3deca3021714662d236c4d8401c5d27b50152ce7e566266b9d512d14eb63e65bc1d38a16f914 +827639d5ce7db43ba40152c8a0eaad443af21dc92636cc8cc2b35f10647da7d475a1e408901cd220552fddad79db74df +a2b79a582191a85dbe22dc384c9ca3de345e69f6aa370aa6d3ff1e1c3de513e30b72df9555b15a46586bd27ea2854d9d +ae0d74644aba9a49521d3e9553813bcb9e18f0b43515e4c74366e503c52f47236be92dfbd99c7285b3248c267b1de5a0 +80fb0c116e0fd6822a04b9c25f456bdca704e2be7bdc5d141dbf5d1c5eeb0a2c4f5d80db583b03ef3e47517e4f9a1b10 +ac3a1fa3b4a2f30ea7e0a114cdc479eb51773573804c2a158d603ad9902ae8e39ffe95df09c0d871725a5d7f9ba71a57 +b56b2b0d601cba7f817fa76102c68c2e518c6f20ff693aad3ff2e07d6c4c76203753f7f91686b1801e8c4659e4d45c48 +89d50c1fc56e656fb9d3915964ebce703cb723fe411ab3c9eaa88ccc5d2b155a9b2e515363d9c600d3c0cee782c43f41 +b24207e61462f6230f3cd8ccf6828357d03e725769f7d1de35099ef9ee4dca57dbce699bb49ed994462bee17059d25ce +b886f17fcbcbfcd08ac07f04bb9543ef58510189decaccea4b4158c9174a067cb67d14b6be3c934e6e2a18c77efa9c9c +b9c050ad9cafd41c6e2e192b70d080076eed59ed38ea19a12bd92fa17b5d8947d58d5546aaf5e8e27e1d3b5481a6ce51 +aaf7a34d3267e3b1ddbc54c641e3922e89303f7c86ebebc7347ebca4cffad5b76117dac0cbae1a133053492799cd936f +a9ee604ada50adef82e29e893070649d2d4b7136cc24fa20e281ce1a07bd736bf0de7c420369676bcbcecff26fb6e900 +9855315a12a4b4cf80ab90b8bd13003223ba25206e52fd4fe6a409232fbed938f30120a3db23eab9c53f308bd8b9db81 +8cd488dd7a24f548a3cf03c54dec7ff61d0685cb0f6e5c46c2d728e3500d8c7bd6bba0156f4bf600466fda53e5b20444 +890ad4942ebac8f5b16c777701ab80c68f56fa542002b0786f8fea0fb073154369920ac3dbfc07ea598b82f4985b8ced +8de0cf9ddc84c9b92c59b9b044387597799246b30b9f4d7626fc12c51f6e423e08ee4cbfe9289984983c1f9521c3e19d +b474dfb5b5f4231d7775b3c3a8744956b3f0c7a871d835d7e4fd9cc895222c7b868d6c6ce250de568a65851151fac860 +86433b6135d9ed9b5ee8cb7a6c40e5c9d30a68774cec04988117302b8a02a11a71a1e03fd8e0264ef6611d219f103007 +80b9ed4adbe9538fb1ef69dd44ec0ec5b57cbfea820054d8d445b4261962624b4c70ac330480594bc5168184378379c3 +8b2e83562ccd23b7ad2d17f55b1ab7ef5fbef64b3a284e6725b800f3222b8bdf49937f4a873917ada9c4ddfb090938c2 +abe78cebc0f5a45d754140d1f685e387489acbfa46d297a8592aaa0d676a470654f417a4f7d666fc0b2508fab37d908e +a9c5f8ff1f8568e252b06d10e1558326db9901840e6b3c26bbd0cd5e850cb5fb3af3f117dbb0f282740276f6fd84126f +975f8dc4fb55032a5df3b42b96c8c0ffecb75456f01d4aef66f973cb7270d4eff32c71520ceefc1adcf38d77b6b80c67 +b043306ed2c3d8a5b9a056565afd8b5e354c8c4569fda66b0d797a50a3ce2c08cffbae9bbe292da69f39e89d5dc7911e +8d2afc36b1e44386ba350c14a6c1bb31ff6ea77128a0c5287584ac3584282d18516901ce402b4644a53db1ed8e7fa581 +8c294058bed53d7290325c363fe243f6ec4f4ea2343692f4bac8f0cb86f115c069ccb8334b53d2e42c067691ad110dba +b92157b926751aaf7ef82c1aa8c654907dccab6376187ee8b3e8c0c82811eae01242832de953faa13ebaff7da8698b3e +a780c4bdd9e4ba57254b09d745075cecab87feda78c88ffee489625c5a3cf96aa6b3c9503a374a37927d9b78de9bd22b +811f548ef3a2e6a654f7dcb28ac9378de9515ed61e5a428515d9594a83e80b35c60f96a5cf743e6fab0d3cb526149f49 +85a4dccf6d90ee8e094731eec53bd00b3887aec6bd81a0740efddf812fd35e3e4fe4f983afb49a8588691c202dabf942 +b152c2da6f2e01c8913079ae2b40a09b1f361a80f5408a0237a8131b429677c3157295e11b365b1b1841924b9efb922e +849b9efee8742502ffd981c4517c88ed33e4dd518a330802caff168abae3cd09956a5ee5eda15900243bc2e829016b74 +955a933f3c18ec0f1c0e38fa931e4427a5372c46a3906ebe95082bcf878c35246523c23f0266644ace1fa590ffa6d119 +911989e9f43e580c886656377c6f856cdd4ff1bd001b6db3bbd86e590a821d34a5c6688a29b8d90f28680e9fdf03ba69 +b73b8b4f1fd6049fb68d47cd96a18fcba3f716e0a1061aa5a2596302795354e0c39dea04d91d232aec86b0bf2ba10522 +90f87456d9156e6a1f029a833bf3c7dbed98ca2f2f147a8564922c25ae197a55f7ea9b2ee1f81bf7383197c4bad2e20c +903cba8b1e088574cb04a05ca1899ab00d8960580c884bd3c8a4c98d680c2ad11410f2b75739d6050f91d7208cac33a5 +9329987d42529c261bd15ecedd360be0ea8966e7838f32896522c965adfc4febf187db392bd441fb43bbd10c38fdf68b +8178ee93acf5353baa349285067b20e9bb41aa32d77b5aeb7384fe5220c1fe64a2461bd7a83142694fe673e8bbf61b7c +a06a8e53abcff271b1394bcc647440f81fb1c1a5f29c27a226e08f961c3353f4891620f2d59b9d1902bf2f5cc07a4553 +aaf5fe493b337810889e777980e6bbea6cac39ac66bc0875c680c4208807ac866e9fda9b5952aa1d04539b9f4a4bec57 +aa058abb1953eceac14ccfa7c0cc482a146e1232905dcecc86dd27f75575285f06bbae16a8c9fe8e35d8713717f5f19f +8f15dd732799c879ca46d2763453b359ff483ca33adb1d0e0a57262352e0476c235987dc3a8a243c74bc768f93d3014c +a61cc8263e9bc03cce985f1663b8a72928a607121005a301b28a278e9654727fd1b22bc8a949af73929c56d9d3d4a273 +98d6dc78502d19eb9f921225475a6ebcc7b44f01a2df6f55ccf6908d65b27af1891be2a37735f0315b6e0f1576c1f8d8 +8bd258b883f3b3793ec5be9472ad1ff3dc4b51bc5a58e9f944acfb927349ead8231a523cc2175c1f98e7e1e2b9f363b8 +aeacc2ecb6e807ad09bedd99654b097a6f39840e932873ace02eabd64ccfbb475abdcb62939a698abf17572d2034c51e +b8ccf78c08ccd8df59fd6eda2e01de328bc6d8a65824d6f1fc0537654e9bc6bf6f89c422dd3a295cce628749da85c864 +8f91fd8cb253ba2e71cc6f13da5e05f62c2c3b485c24f5d68397d04665673167fce1fc1aec6085c69e87e66ec555d3fd +a254baa10cb26d04136886073bb4c159af8a8532e3fd36b1e9c3a2e41b5b2b6a86c4ebc14dbe624ee07b7ccdaf59f9ab +94e3286fe5cd68c4c7b9a7d33ae3d714a7f265cf77cd0e9bc19fc51015b1d1c34ad7e3a5221c459e89f5a043ee84e3a9 +a279da8878af8d449a9539bec4b17cea94f0242911f66fab275b5143ab040825f78c89cb32a793930609415cfa3a1078 +ac846ceb89c9e5d43a2991c8443079dc32298cd63e370e64149cec98cf48a6351c09c856f2632fd2f2b3d685a18bbf8b +a847b27995c8a2e2454aaeb983879fb5d3a23105c33175839f7300b7e1e8ec3efd6450e9fa3f10323609dee7b98c6fd5 +a2f432d147d904d185ff4b2de8c6b82fbea278a2956bc406855b44c18041854c4f0ecccd472d1d0dff1d8aa8e281cb1d +94a48ad40326f95bd63dff4755f863a1b79e1df771a1173b17937f9baba57b39e651e7695be9f66a472f098b339364fc +a12a0ccd8f96e96e1bc6494341f7ebce959899341b3a084aa1aa87d1c0d489ac908552b7770b887bb47e7b8cbc3d8e66 +81a1f1681bda923bd274bfe0fbb9181d6d164fe738e54e25e8d4849193d311e2c4253614ed673c98af2c798f19a93468 +abf71106a05d501e84cc54610d349d7d5eae21a70bd0250f1bebbf412a130414d1c8dbe673ffdb80208fd72f1defa4d4 +96266dc2e0df18d8136d79f5b59e489978eee0e6b04926687fe389d4293c14f36f055c550657a8e27be4118b64254901 +8df5dcbefbfb4810ae3a413ca6b4bf08619ca53cd50eb1dde2a1c035efffc7b7ac7dff18d403253fd80104bd83dc029e +9610b87ff02e391a43324a7122736876d5b3af2a137d749c52f75d07b17f19900b151b7f439d564f4529e77aa057ad12 +a90a5572198b40fe2fcf47c422274ff36c9624df7db7a89c0eb47eb48a73a03c985f4ac5016161c76ca317f64339bce1 +98e5e61a6ab6462ba692124dba7794b6c6bde4249ab4fcc98c9edd631592d5bc2fb5e38466691a0970a38e48d87c2e43 +918cefb8f292f78d4db81462c633daf73b395e772f47b3a7d2cea598025b1d8c3ec0cbff46cdb23597e74929981cde40 +a98918a5dc7cf610fe55f725e4fd24ce581d594cb957bb9b4e888672e9c0137003e1041f83e3f1d7b9caab06462c87d4 +b92b74ac015262ca66c33f2d950221e19d940ba3bf4cf17845f961dc1729ae227aa9e1f2017829f2135b489064565c29 +a053ee339f359665feb178b4e7ee30a85df37debd17cacc5a27d6b3369d170b0114e67ad1712ed26d828f1df641bcd99 +8c3c8bad510b35da5ce5bd84b35c958797fbea024ad1c97091d2ff71d9b962e9222f65a9b776e5b3cc29c36e1063d2ee +af99dc7330fe7c37e850283eb47cc3257888e7c197cb0d102edf94439e1e02267b6a56306d246c326c4c79f9dc8c6986 +afecb2dc34d57a725efbd7eb93d61eb29dbe8409b668ab9ea040791f5b796d9be6d4fc10d7f627bf693452f330cf0435 +93334fedf19a3727a81a6b6f2459db859186227b96fe7a391263f69f1a0884e4235de64d29edebc7b99c44d19e7c7d7a +89579c51ac405ad7e9df13c904061670ce4b38372492764170e4d3d667ed52e5d15c7cd5c5991bbfa3a5e4e3fa16363e +9778f3e8639030f7ef1c344014f124e375acb8045bd13d8e97a92c5265c52de9d1ffebaa5bc3e1ad2719da0083222991 +88f77f34ee92b3d36791bdf3326532524a67d544297dcf1a47ff00b47c1b8219ff11e34034eab7d23b507caa2fd3c6b9 +a699c1e654e7c484431d81d90657892efeb4adcf72c43618e71ca7bd7c7a7ebbb1db7e06e75b75dc4c74efd306b5df3f +81d13153baebb2ef672b5bdb069d3cd669ce0be96b742c94e04038f689ff92a61376341366b286eee6bf3ae85156f694 +81efb17de94400fdacc1deec2550cbe3eecb27c7af99d8207e2f9be397e26be24a40446d2a09536bb5172c28959318d9 +989b21ebe9ceab02488992673dc071d4d5edec24bff0e17a4306c8cb4b3c83df53a2063d1827edd8ed16d6e837f0d222 +8d6005d6536825661b13c5fdce177cb37c04e8b109b7eb2b6d82ea1cb70efecf6a0022b64f84d753d165edc2bba784a3 +a32607360a71d5e34af2271211652d73d7756d393161f4cf0da000c2d66a84c6826e09e759bd787d4fd0305e2439d342 +aaad8d6f6e260db45d51b2da723be6fa832e76f5fbcb77a9a31e7f090dd38446d3b631b96230d78208cae408c288ac4e +abcfe425255fd3c5cffd3a818af7650190c957b6b07b632443f9e33e970a8a4c3bf79ac9b71f4d45f238a04d1c049857 +aeabf026d4c783adc4414b5923dbd0be4b039cc7201219f7260d321f55e9a5b166d7b5875af6129c034d0108fdc5d666 +af49e740c752d7b6f17048014851f437ffd17413c59797e5078eaaa36f73f0017c3e7da020310cfe7d3c85f94a99f203 +8854ca600d842566e3090040cd66bb0b3c46dae6962a13946f0024c4a8aca447e2ccf6f240045f1ceee799a88cb9210c +b6c03b93b1ab1b88ded8edfa1b487a1ed8bdce8535244dddb558ffb78f89b1c74058f80f4db2320ad060d0c2a9c351cc +b5bd7d17372faff4898a7517009b61a7c8f6f0e7ed4192c555db264618e3f6e57fb30a472d169fea01bf2bf0362a19a8 +96eb1d38319dc74afe7e7eb076fcd230d19983f645abd14a71e6103545c01301b31c47ae931e025f3ecc01fb3d2f31fa +b55a8d30d4403067def9b65e16f867299f8f64c9b391d0846d4780bc196569622e7e5b64ce799b5aefac8f965b2a7a7b +8356d199a991e5cbbff608752b6291731b6b6771aed292f8948b1f41c6543e4ab1bedc82dd26d10206c907c03508df06 +97f4137445c2d98b0d1d478049de952610ad698c91c9d0f0e7227d2aae690e9935e914ec4a2ea1fbf3fc1dddfeeacebb +af5621707e0938320b15ddfc87584ab325fbdfd85c30efea36f8f9bd0707d7ec12c344eff3ec21761189518d192df035 +8ac7817e71ea0825b292687928e349da7140285d035e1e1abff0c3704fa8453faaae343a441b7143a74ec56539687cc4 +8a5e0a9e4758449489df10f3386029ada828d1762e4fb0a8ffe6b79e5b6d5d713cb64ed95960e126398b0cdb89002bc9 +81324be4a71208bbb9bca74b77177f8f1abb9d3d5d9db195d1854651f2cf333cd618d35400da0f060f3e1b025124e4b2 +849971d9d095ae067525b3cbc4a7dfae81f739537ade6d6cec1b42fb692d923176197a8770907c58069754b8882822d6 +89f830825416802477cc81fdf11084885865ee6607aa15aa4eb28e351c569c49b8a1b9b5e95ddc04fa0ebafe20071313 +9240aeeaff37a91af55f860b9badd466e8243af9e8c96a7aa8cf348cd270685ab6301bc135b246dca9eda696f8b0e350 +acf74db78cc33138273127599eba35b0fb4e7b9a69fe02dae18fc6692d748ca332bd00b22afa8e654ed587aab11833f3 +b091e6d37b157b50d76bd297ad752220cd5c9390fac16dc838f8557aed6d9833fc920b61519df21265406216315e883f +a6446c429ebf1c7793c622250e23594c836b2fbcaf6c5b3d0995e1595a37f50ea643f3e549b0be8bbdadd69044d72ab9 +93e675353bd60e996bf1c914d5267eeaa8a52fc3077987ccc796710ef9becc6b7a00e3d82671a6bdfb8145ee3c80245a +a2f731e43251d04ed3364aa2f072d05355f299626f2d71a8a38b6f76cf08c544133f7d72dd0ab4162814b674b9fc7fa6 +97a8b791a5a8f6e1d0de192d78615d73d0c38f1e557e4e15d15adc663d649e655bc8da3bcc499ef70112eafe7fb45c7a +98cd624cbbd6c53a94469be4643c13130916b91143425bcb7d7028adbbfede38eff7a21092af43b12d4fab703c116359 +995783ce38fd5f6f9433027f122d4cf1e1ff3caf2d196ce591877f4a544ce9113ead60de2de1827eaff4dd31a20d79a8 +8cf251d6f5229183b7f3fe2f607a90b4e4b6f020fb4ba2459d28eb8872426e7be8761a93d5413640a661d73e34a5b81f +b9232d99620652a3aa7880cad0876f153ff881c4ed4c0c2e7b4ea81d5d42b70daf1a56b869d752c3743c6d4c947e6641 +849716f938f9d37250cccb1bf77f5f9fde53096cdfc6f2a25536a6187029a8f1331cdbed08909184b201f8d9f04b792f +80c7c4de098cbf9c6d17b14eba1805e433b5bc905f6096f8f63d34b94734f2e4ebf4bce8a177efd1186842a61204a062 +b790f410cf06b9b8daadceeb4fd5ff40a2deda820c8df2537e0a7554613ae3948e149504e3e79aa84889df50c8678eeb +813aab8bd000299cd37485b73cd7cba06e205f8efb87f1efc0bae8b70f6db2bc7702eb39510ad734854fb65515fe9d0f +94f0ab7388ac71cdb67f6b85dfd5945748afb2e5abb622f0b5ad104be1d4d0062b651f134ba22385c9e32c2dfdcccce1 +ab6223dca8bd6a4f969e21ccd9f8106fc5251d321f9e90cc42cea2424b3a9c4e5060a47eeef6b23c7976109b548498e8 +859c56b71343fce4d5c5b87814c47bf55d581c50fd1871a17e77b5e1742f5af639d0e94d19d909ec7dfe27919e954e0c +aae0d632b6191b8ad71b027791735f1578e1b89890b6c22e37de0e4a6074886126988fe8319ae228ac9ef3b3bcccb730 +8ca9f32a27a024c3d595ecfaf96b0461de57befa3b331ab71dc110ec3be5824fed783d9516597537683e77a11d334338 +a061df379fb3f4b24816c9f6cd8a94ecb89b4c6dc6cd81e4b8096fa9784b7f97ab3540259d1de9c02eb91d9945af4823 +998603102ac63001d63eb7347a4bb2bf4cf33b28079bb48a169076a65c20d511ccd3ef696d159e54cc8e772fb5d65d50 +94444d96d39450872ac69e44088c252c71f46be8333a608a475147752dbb99db0e36acfc5198f158509401959c12b709 +ac1b51b6c09fe055c1d7c9176eea9adc33f710818c83a1fbfa073c8dc3a7eb3513cbdd3f5960b7845e31e3e83181e6ba +803d530523fc9e1e0f11040d2412d02baef3f07eeb9b177fa9bfa396af42eea898a4276d56e1db998dc96ae47b644cb2 +85a3c9fc7638f5bf2c3e15ba8c2fa1ae87eb1ceb44c6598c67a2948667a9dfa41e61f66d535b4e7fda62f013a5a8b885 +a961cf5654c46a1a22c29baf7a4e77837a26b7f138f410e9d1883480ed5fa42411d522aba32040b577046c11f007388e +ad1154142344f494e3061ef45a34fab1aaacf5fdf7d1b26adbb5fbc3d795655fa743444e39d9a4119b4a4f82a6f30441 +b1d6c30771130c77806e7ab893b73d4deb590b2ff8f2f8b5e54c2040c1f3e060e2bd99afc668cf706a2df666a508bbf6 +a00361fd440f9decabd98d96c575cd251dc94c60611025095d1201ef2dedde51cb4de7c2ece47732e5ed9b3526c2012c +a85c5ab4d17d328bda5e6d839a9a6adcc92ff844ec25f84981e4f44a0e8419247c081530f8d9aa629c7eb4ca21affba6 +a4ddd3eab4527a2672cf9463db38bc29f61460e2a162f426b7852b7a7645fbd62084fd39a8e4d60e1958cce436dd8f57 +811648140080fe55b8618f4cf17f3c5a250adb0cd53d885f2ddba835d2b4433188e41fc0661faac88e4ff910b16278c0 +b85c7f1cfb0ed29addccf7546023a79249e8f15ac2d14a20accbfef4dd9dc11355d599815fa09d2b6b4e966e6ea8cff1 +a10b5d8c260b159043b020d5dd62b3467df2671afea6d480ca9087b7e60ed170c82b121819d088315902842d66c8fb45 +917e191df1bcf3f5715419c1e2191da6b8680543b1ba41fe84ed07ef570376e072c081beb67b375fca3565a2565bcabb +881fd967407390bfd7badc9ab494e8a287559a01eb07861f527207c127eadea626e9bcc5aa9cca2c5112fbac3b3f0e9c +959fd71149af82cc733619e0e5bf71760ca2650448c82984b3db74030d0e10f8ab1ce1609a6de6f470fe8b5bd90df5b3 +a3370898a1c5f33d15adb4238df9a6c945f18b9ada4ce2624fc32a844f9ece4c916a64e9442225b6592afa06d2e015f2 +817efb8a791435e4236f7d7b278181a5fa34587578c629dbc14fbf9a5c26772290611395eecd20222a4c58649fc256d8 +a04c9876acf2cfdc8ef96de4879742709270fa1d03fe4c8511fbef2d59eb0aaf0336fa2c7dfe41a651157377fa217813 +81e15875d7ea7f123e418edf14099f2e109d4f3a6ce0eb65f67fe9fb10d2f809a864a29f60ad3fc949f89e2596b21783 +b49f529975c09e436e6bc202fdc16e3fdcbe056db45178016ad6fdece9faad4446343e83aed096209690b21a6910724f +879e8eda589e1a279f7f49f6dd0580788c040d973748ec4942dbe51ea8fbd05983cc919b78f0c6b92ef3292ae29db875 +81a2b74b2118923f34139a102f3d95e7eee11c4c2929c2576dee200a5abfd364606158535a6c9e4178a6a83dbb65f3c4 +8913f281d8927f2b45fc815d0f7104631cb7f5f7278a316f1327d670d15868daadd2a64e3eb98e1f53fe7e300338cc80 +a6f815fba7ef9af7fbf45f93bc952e8b351f5de6568a27c7c47a00cb39a254c6b31753794f67940fc7d2e9cc581529f4 +b3722a15c66a0014ce4d082de118def8d39190c15678a472b846225585f3a83756ae1b255b2e3f86a26168878e4773b2 +817ae61ab3d0dd5b6e24846b5a5364b1a7dc2e77432d9fed587727520ae2f307264ea0948c91ad29f0aea3a11ff38624 +b3db467464415fcad36dc1de2d6ba7686772a577cc2619242ac040d6734881a45d3b40ed4588db124e4289cfeec4bbf6 +ad66a14f5a54ac69603b16e5f1529851183da77d3cc60867f10aea41339dd5e06a5257982e9e90a352cdd32750f42ee4 +adafa3681ef45d685555601a25a55cf23358319a17f61e2179e704f63df83a73bdd298d12cf6cef86db89bd17119e11d +a379dc44cb6dd3b9d378c07b2ec654fec7ca2f272de6ba895e3d00d20c9e4c5550498a843c8ac67e4221db2115bedc1c +b7bf81c267a78efc6b9e5a904574445a6487678d7ef70054e3e93ea6a23f966c2b68787f9164918e3b16d2175459ed92 +b41d66a13a4afafd5760062b77f79de7e6ab8ccacde9c6c5116a6d886912fb491dc027af435b1b44aacc6af7b3c887f2 +9904d23a7c1c1d2e4bab85d69f283eb0a8e26d46e8b7b30224438015c936729b2f0af7c7c54c03509bb0500acb42d8a4 +ae30d65e9e20c3bfd603994ae2b175ff691d51f3e24b2d058b3b8556d12ca4c75087809062dddd4aaac81c94d15d8a17 +9245162fab42ac01527424f6013310c3eb462982518debef6c127f46ba8a06c705d7dc9f0a41e796ba8d35d60ae6cc64 +87fab853638d7a29a20f3ba2b1a7919d023e9415bfa78ebb27973d8cbc7626f584dc5665d2e7ad71f1d760eba9700d88 +85aac46ecd330608e5272430970e6081ff02a571e8ea444f1e11785ea798769634a22a142d0237f67b75369d3c484a8a +938c85ab14894cc5dfce3d80456f189a2e98eddbc8828f4ff6b1df1dcb7b42b17ca2ff40226a8a1390a95d63dca698dd +a18ce1f846e3e3c4d846822f60271eecf0f5d7d9f986385ac53c5ace9589dc7c0188910448c19b91341a1ef556652fa9 +8611608a9d844f0e9d7584ad6ccf62a5087a64f764caf108db648a776b5390feb51e5120f0ef0e9e11301af3987dd7dc +8106333ba4b4de8d1ae43bc9735d3fea047392e88efd6a2fa6f7b924a18a7a265ca6123c3edc0f36307dd7fb7fe89257 +a91426fa500951ff1b051a248c050b7139ca30dde8768690432d597d2b3c4357b11a577be6b455a1c5d145264dcf81fc +b7f9f90e0e450f37b081297f7f651bad0496a8b9afd2a4cf4120a2671aaaa8536dce1af301258bfbfdb122afa44c5048 +84126da6435699b0c09fa4032dec73d1fca21d2d19f5214e8b0bea43267e9a8dd1fc44f8132d8315e734c8e2e04d7291 +aff064708103884cb4f1a3c1718b3fc40a238d35cf0a7dc24bdf9823693b407c70da50df585bf5bc4e9c07d1c2d203e8 +a8b40fc6533752983a5329c31d376c7a5c13ce6879cc7faee648200075d9cd273537001fb4c86e8576350eaac6ba60c2 +a02db682bdc117a84dcb9312eb28fcbde12d49f4ce915cc92c610bb6965ec3cc38290f8c5b5ec70afe153956692cda95 +86decd22b25d300508472c9ce75d3e465b737e7ce13bc0fcce32835e54646fe12322ba5bc457be18bfd926a1a6ca4a38 +a18666ef65b8c2904fd598791f5627207165315a85ee01d5fb0e6b2e10bdd9b00babc447da5bd63445e3337de33b9b89 +89bb0c06effadefdaf34ffe4b123e1678a90d4451ee856c863df1e752eef41fd984689ded8f0f878bf8916d5dd8e8024 +97cfcba08ebec05d0073992a66b1d7d6fb9d95871f2cdc36db301f78bf8069294d1c259efef5c93d20dc937eedae3a1a +ac2643b14ece79dcb2e289c96776a47e2bebd40dd6dc74fd035df5bb727b5596f40e3dd2d2202141e69b0993717ede09 +a5e6fd88a2f9174d9bd4c6a55d9c30974be414992f22aa852f552c7648f722ed8077acf5aba030abd47939bb451b2c60 +8ad40a612824a7994487731a40b311b7349038c841145865539c6ada75c56de6ac547a1c23df190e0caaafecddd80ccc +953a7cea1d857e09202c438c6108060961f195f88c32f0e012236d7a4b39d840c61b162ec86436e8c38567328bea0246 +80d8b47a46dae1868a7b8ccfe7029445bbe1009dad4a6c31f9ef081be32e8e1ac1178c3c8fb68d3e536c84990cc035b1 +81ecd99f22b3766ce0aca08a0a9191793f68c754fdec78b82a4c3bdc2db122bbb9ebfd02fc2dcc6e1567a7d42d0cc16a +b1dd0446bccc25846fb95d08c1c9cc52fb51c72c4c5d169ffde56ecfe800f108dc1106d65d5c5bd1087c656de3940b63 +b87547f0931e164e96de5c550ca5aa81273648fe34f6e193cd9d69cf729cb432e17aa02e25b1c27a8a0d20a3b795e94e +820a94e69a927e077082aae66f6b292cfbe4589d932edf9e68e268c9bd3d71ef76cf7d169dd445b93967c25db11f58f1 +b0d07ddf2595270c39adfa0c8cf2ab1322979b0546aa4d918f641be53cd97f36c879bb75d205e457c011aca3bbd9f731 +8700b876b35b4b10a8a9372c5230acecd39539c1bb87515640293ad4464a9e02929d7d6a6a11112e8a29564815ac0de4 +a61a601c5bb27dcb97e37c8e2b9ce479c6b192a5e04d9ed5e065833c5a1017ee5f237b77d1a17be5d48f8e7cc0bcacf6 +92fb88fe774c1ba1d4a08cae3c0e05467ad610e7a3f1d2423fd47751759235fe0a3036db4095bd6404716aa03820f484 +b274f140d77a3ce0796f5e09094b516537ccaf27ae1907099bff172e6368ba85e7c3ef8ea2a07457cac48ae334da95b3 +b2292d9181f16581a9a9142490b2bdcdfb218ca6315d1effc8592100d792eb89d5356996c890441f04f2b4a95763503e +8897e73f576d86bc354baa3bd96e553107c48cf5889dcc23c5ba68ab8bcd4e81f27767be2233fdfa13d39f885087e668 +a29eac6f0829791c728d71abc49569df95a4446ecbfc534b39f24f56c88fe70301838dfc1c19751e7f3c5c1b8c6af6a0 +9346dc3720adc5df500a8df27fd9c75ef38dc5c8f4e8ed66983304750e66d502c3c59b8e955be781b670a0afc70a2167 +9566d534e0e30a5c5f1428665590617e95fd05d45f573715f58157854ad596ece3a3cfec61356aee342308d623e029d5 +a464fb8bffe6bd65f71938c1715c6e296cc6d0311a83858e4e7eb5873b7f2cf0c584d2101e3407b85b64ca78b2ac93ce +b54088f7217987c87e9498a747569ac5b2f8afd5348f9c45bf3fd9fbf713a20f495f49c8572d087efe778ac7313ad6d3 +91fa9f5f8000fe050f5b224d90b59fcce13c77e903cbf98ded752e5b3db16adb2bc1f8c94be48b69f65f1f1ad81d6264 +92d04a5b0ac5d8c8e313709b432c9434ecd3e73231f01e9b4e7952b87df60cbfa97b5dedd2200bd033b4b9ea8ba45cc1 +a94b90ad3c3d6c4bbe169f8661a790c40645b40f0a9d1c7220f01cf7fc176e04d80bab0ced9323fcafb93643f12b2760 +94d86149b9c8443b46196f7e5a3738206dd6f3be7762df488bcbb9f9ee285a64c997ed875b7b16b26604fa59020a8199 +82efe4ae2c50a2d7645240c173a047f238536598c04a2c0b69c96e96bd18e075a99110f1206bc213f39edca42ba00cc1 +ab8667685f831bc14d4610f84a5da27b4ea5b133b4d991741a9e64dceb22cb64a3ce8f1b6e101d52af6296df7127c9ad +83ba433661c05dcc5d562f4a9a261c8110dac44b8d833ae1514b1fc60d8b4ee395b18804baea04cb10adb428faf713c3 +b5748f6f660cc5277f1211d2b8649493ed8a11085b871cd33a5aea630abd960a740f08c08be5f9c21574600ac9bf5737 +a5c8dd12af48fb710642ad65ebb97ca489e8206741807f7acfc334f8035d3c80593b1ff2090c9bb7bd138f0c48714ca8 +a2b382fd5744e3babf454b1d806cc8783efeb4761bc42b6914ea48a46a2eae835efbe0a18262b6bc034379e03cf1262b +b3145ffaf603f69f15a64936d32e3219eea5ed49fdfd2f5bf40ea0dfd974b36fb6ff12164d4c2282d892db4cf3ff3ce1 +87a316fb213f4c5e30c5e3face049db66be4f28821bd96034714ec23d3e97849d7b301930f90a4323c7ccf53de23050c +b9de09a919455070fed6220fc179c8b7a4c753062bcd27acf28f5b9947a659c0b364298daf7c85c4ca6fca7f945add1f +806fbd98d411b76979464c40ad88bc07a151628a27fcc1012ba1dfbaf5b5cc9d962fb9b3386008978a12515edce934bc +a15268877fae0d21610ae6a31061ed7c20814723385955fac09fdc9693a94c33dea11db98bb89fdfe68f933490f5c381 +8d633fb0c4da86b2e0b37d8fad5972d62bff2ac663c5ec815d095cd4b7e1fe66ebef2a2590995b57eaf941983c7ad7a4 +8139e5dd9cf405e8ef65f11164f0440827d98389ce1b418b0c9628be983a9ddd6cf4863036ccb1483b40b8a527acd9ed +88b15fa94a08eac291d2b94a2b30eb851ff24addf2cc30b678e72e32cfcb3424cf4b33aa395d741803f3e578ddf524de +b5eaf0c8506e101f1646bcf049ee38d99ea1c60169730da893fd6020fd00a289eb2f415947e44677af49e43454a7b1be +8489822ad0647a7e06aa2aa5595960811858ddd4542acca419dd2308a8c5477648f4dd969a6740bb78aa26db9bfcc555 +b1e9a7b9f3423c220330d45f69e45fa03d7671897cf077f913c252e3e99c7b1b1cf6d30caad65e4228d5d7b80eb86e5e +b28fe9629592b9e6a55a1406903be76250b1c50c65296c10c5e48c64b539fb08fe11f68cf462a6edcbba71b0cee3feb2 +a41acf96a02c96cd8744ff6577c244fc923810d17ade133587e4c223beb7b4d99fa56eae311a500d7151979267d0895c +880798938fe4ba70721be90e666dfb62fcab4f3556fdb7b0dc8ec5bc34f6b4513df965eae78527136eb391889fe2caf9 +98d4d89d358e0fb7e212498c73447d94a83c1b66e98fc81427ab13acddb17a20f52308983f3a5a8e0aaacec432359604 +81430b6d2998fc78ba937a1639c6020199c52da499f68109da227882dc26d005b73d54c5bdcac1a04e8356a8ca0f7017 +a8d906a4786455eb74613aba4ce1c963c60095ffb8658d368df9266fdd01e30269ce10bf984e7465f34b4fd83beba26a +af54167ac1f954d10131d44a8e0045df00d581dd9e93596a28d157543fbe5fb25d213806ed7fb3cba6b8f5b5423562db +8511e373a978a12d81266b9afbd55035d7bc736835cfa921903a92969eeba3624437d1346b55382e61415726ab84a448 +8cf43eea93508ae586fa9a0f1354a1e16af659782479c2040874a46317f9e8d572a23238efa318fdfb87cc63932602b7 +b0bdd3bacff077173d302e3a9678d1d37936188c7ecc34950185af6b462b7c679815176f3cce5db19aac8b282f2d60ad +a355e9b87f2f2672052f5d4d65b8c1c827d24d89b0d8594641fccfb69aef1b94009105f3242058bb31c8bf51caae5a41 +b8baa9e4b950b72ff6b88a6509e8ed1304bc6fd955748b2e59a523a1e0c5e99f52aec3da7fa9ff407a7adf259652466c +840bc3dbb300ea6f27d1d6dd861f15680bd098be5174f45d6b75b094d0635aced539fa03ddbccb453879de77fb5d1fe9 +b4bc7e7e30686303856472bae07e581a0c0bfc815657c479f9f5931cff208d5c12930d2fd1ff413ebd8424bcd7a9b571 +89b5d514155d7999408334a50822508b9d689add55d44a240ff2bdde2eee419d117031f85e924e2a2c1ca77db9b91eea +a8604b6196f87a04e1350302e8aa745bba8dc162115d22657b37a1d1a98cb14876ddf7f65840b5dbd77e80cd22b4256c +83cb7acdb9e03247515bb2ce0227486ccf803426717a14510f0d59d45e998b245797d356f10abca94f7a14e1a2f0d552 +aeb3266a9f16649210ab2df0e1908ac259f34ce1f01162c22b56cf1019096ee4ea5854c36e30bb2feb06c21a71e8a45c +89e72e86edf2aa032a0fc9acf4d876a40865fbb2c8f87cb7e4d88856295c4ac14583e874142fd0c314a49aba68c0aa3c +8c3576eba0583c2a7884976b4ed11fe1fda4f6c32f6385d96c47b0e776afa287503b397fa516a455b4b8c3afeedc76db +a31e5b633bda9ffa174654fee98b5d5930a691c3c42fcf55673d927dbc8d91c58c4e42e615353145431baa646e8bbb30 +89f2f3f7a8da1544f24682f41c68114a8f78c86bd36b066e27da13acb70f18d9f548773a16bd8e24789420e17183f137 +ada27fa4e90a086240c9164544d2528621a415a5497badb79f8019dc3dce4d12eb6b599597e47ec6ac39c81efda43520 +90dc1eb21bf21c0187f359566fc4bf5386abea52799306a0e5a1151c0817c5f5bc60c86e76b1929c092c0f3ff48cedd2 +b702a53ebcc17ae35d2e735a347d2c700e9cbef8eadbece33cac83df483b2054c126593e1f462cfc00a3ce9d737e2af5 +9891b06455ec925a6f8eafffba05af6a38cc5e193acaaf74ffbf199df912c5197106c5e06d72942bbb032ce277b6417f +8c0ee71eb01197b019275bcf96cae94e81d2cdc3115dbf2d8e3080074260318bc9303597e8f72b18f965ad601d31ec43 +8aaf580aaf75c1b7a5f99ccf60503506e62058ef43b28b02f79b8536a96be3f019c9f71caf327b4e6730134730d1bef5 +ae6f9fc21dd7dfa672b25a87eb0a41644f7609fab5026d5cedb6e43a06dbbfd6d6e30322a2598c8dedde88c52eaed626 +8159b953ffece5693edadb2e906ebf76ff080ee1ad22698950d2d3bfc36ac5ea78f58284b2ca180664452d55bd54716c +ab7647c32ca5e9856ac283a2f86768d68de75ceeba9e58b74c5324f8298319e52183739aba4340be901699d66ac9eb3f +a4d85a5701d89bcfaf1572db83258d86a1a0717603d6f24ac2963ffcf80f1265e5ab376a4529ca504f4396498791253c +816080c0cdbfe61b4d726c305747a9eb58ac26d9a35f501dd32ba43c098082d20faf3ccd41aad24600aa73bfa453dfac +84f3afac024f576b0fd9acc6f2349c2fcefc3f77dbe5a2d4964d14b861b88e9b1810334b908cf3427d9b67a8aee74b18 +94b390655557b1a09110018e9b5a14490681ade275bdc83510b6465a1218465260d9a7e2a6e4ec700f58c31dc3659962 +a8c66826b1c04a2dd4c682543242e7a57acae37278bd09888a3d17747c5b5fec43548101e6f46d703638337e2fd3277b +86e6f4608a00007fa533c36a5b054c5768ccafe41ad52521d772dcae4c8a4bcaff8f7609be30d8fab62c5988cbbb6830 +837da4cf09ae8aa0bceb16f8b3bfcc3b3367aecac9eed6b4b56d7b65f55981ef066490764fb4c108792623ecf8cad383 +941ff3011462f9b5bf97d8cbdb0b6f5d37a1b1295b622f5485b7d69f2cb2bcabc83630dae427f0259d0d9539a77d8424 +b99e5d6d82aa9cf7d5970e7f710f4039ac32c2077530e4c2779250c6b9b373bc380adb0a03b892b652f649720672fc8c +a791c78464b2d65a15440b699e1e30ebd08501d6f2720adbc8255d989a82fcded2f79819b5f8f201bed84a255211b141 +84af7ad4a0e31fcbb3276ab1ad6171429cf39adcf78dc03750dc5deaa46536d15591e26d53e953dfb31e1622bc0743ab +a833e62fe97e1086fae1d4917fbaf09c345feb6bf1975b5cb863d8b66e8d621c7989ab3dbecda36bc9eaffc5eaa6fa66 +b4ef79a46a2126f53e2ebe62770feb57fd94600be29459d70a77c5e9cc260fa892be06cd60f886bf48459e48eb50d063 +b43b8f61919ea380bf151c294e54d3a3ff98e20d1ee5efbfe38aa2b66fafbc6a49739793bd5cb1c809f8b30466277c3a +ab37735af2412d2550e62df9d8b3b5e6f467f20de3890bf56faf1abf2bf3bd1d98dc3fa0ad5e7ab3fce0fa20409eb392 +82416b74b1551d484250d85bb151fabb67e29cce93d516125533df585bc80779ab057ea6992801a3d7d5c6dcff87a018 +8145d0787f0e3b5325190ae10c1d6bee713e6765fb6a0e9214132c6f78f4582bb2771aaeae40d3dad4bafb56bf7e36d8 +b6935886349ecbdd5774e12196f4275c97ec8279fdf28ccf940f6a022ebb6de8e97d6d2173c3fe402cbe9643bed3883b +87ef9b4d3dc71ac86369f8ed17e0dd3b91d16d14ae694bc21a35b5ae37211b043d0e36d8ff07dcc513fb9e6481a1f37f +ae1d0ded32f7e6f1dc8fef495879c1d9e01826f449f903c1e5034aeeabc5479a9e323b162b688317d46d35a42d570d86 +a40d16497004db4104c6794e2f4428d75bdf70352685944f3fbe17526df333e46a4ca6de55a4a48c02ecf0bde8ba03c0 +8d45121efba8cc308a498e8ee39ea6fa5cae9fb2e4aab1c2ff9d448aa8494ccbec9a078f978a86fcd97b5d5e7be7522a +a8173865c64634ba4ac2fa432740f5c05056a9deaf6427cb9b4b8da94ca5ddbc8c0c5d3185a89b8b28878194de9cdfcd +b6ec06a74d690f6545f0f0efba236e63d1fdfba54639ca2617408e185177ece28901c457d02b849fd00f1a53ae319d0a +b69a12df293c014a40070e3e760169b6f3c627caf9e50b35a93f11ecf8df98b2bc481b410eecb7ab210bf213bbe944de +97e7dc121795a533d4224803e591eef3e9008bab16f12472210b73aaf77890cf6e3877e0139403a0d3003c12c8f45636 +acdfa6fdd4a5acb7738cc8768f7cba84dbb95c639399b291ae8e4e63df37d2d4096900a84d2f0606bf534a9ccaa4993f +86ee253f3a9446a33e4d1169719b7d513c6b50730988415382faaf751988c10a421020609f7bcdef91be136704b906e2 +aac9438382a856caf84c5a8a234282f71b5fc5f65219103b147e7e6cf565522285fbfd7417b513bdad8277a00f652ca1 +83f3799d8e5772527930f5dc071a2e0a65471618993ec8990a96ccdeee65270e490bda9d26bb877612475268711ffd80 +93f28a81ac8c0ec9450b9d762fae9c7f8feaace87a6ee6bd141ef1d2d0697ef1bbd159fe6e1de640dbdab2b0361fca8a +a0825c95ba69999b90eac3a31a3fd830ea4f4b2b7409bde5f202b61d741d6326852ce790f41de5cb0eccec7af4db30c1 +83924b0e66233edd603c3b813d698daa05751fc34367120e3cf384ea7432e256ccee4d4daf13858950549d75a377107d +956fd9fa58345277e06ba2ec72f49ed230b8d3d4ff658555c52d6cddeb84dd4e36f1a614f5242d5ca0192e8daf0543c2 +944869912476baae0b114cced4ff65c0e4c90136f73ece5656460626599051b78802df67d7201c55d52725a97f5f29fe +865cb25b64b4531fb6fe4814d7c8cd26b017a6c6b72232ff53defc18a80fe3b39511b23f9e4c6c7249d06e03b2282ed2 +81e09ff55214960775e1e7f2758b9a6c4e4cd39edf7ec1adfaad51c52141182b79fe2176b23ddc7df9fd153e5f82d668 +b31006896f02bc90641121083f43c3172b1039334501fbaf1672f7bf5d174ddd185f945adf1a9c6cf77be34c5501483d +88b92f6f42ae45e9f05b16e52852826e933efd0c68b0f2418ac90957fd018df661bc47c8d43c2a7d7bfcf669dab98c3c +92fc68f595853ee8683930751789b799f397135d002eda244fe63ecef2754e15849edde3ba2f0cc8b865c9777230b712 +99ca06a49c5cd0bb097c447793fcdd809869b216a34c66c78c7e41e8c22f05d09168d46b8b1f3390db9452d91bc96dea +b48b9490a5d65296802431852d548d81047bbefc74fa7dc1d4e2a2878faacdfcb365ae59209cb0ade01901a283cbd15d +aff0fdbef7c188b120a02bc9085d7b808e88f73973773fef54707bf2cd772cd066740b1b6f4127b5c349f657bd97e738 +966fd4463b4f43dd8ccba7ad50baa42292f9f8b2e70da23bb6780e14155d9346e275ef03ddaf79e47020dcf43f3738bd +9330c3e1fadd9e08ac85f4839121ae20bbeb0a5103d84fa5aadbd1213805bdcda67bf2fb75fc301349cbc851b5559d20 +993bb99867bd9041a71a55ad5d397755cfa7ab6a4618fc526179bfc10b7dc8b26e4372fe9a9b4a15d64f2b63c1052dda +a29b59bcfab51f9b3c490a3b96f0bf1934265c315349b236012adbd64a56d7f6941b2c8cc272b412044bc7731f71e1dc +a65c9cefe1fc35d089fe8580c2e7671ebefdb43014ac291528ff4deefd4883fd4df274af83711dad610dad0d615f9d65 +944c78c56fb227ae632805d448ca3884cd3d2a89181cead3d2b7835e63297e6d740aa79a112edb1d4727824991636df5 +a73d782da1db7e4e65d7b26717a76e16dd9fab4df65063310b8e917dc0bc24e0d6755df5546c58504d04d9e68c3b474a +af80f0b87811ae3124f68108b4ca1937009403f87928bbc53480e7c5408d072053ace5eeaf5a5aba814dab8a45502085 +88aaf1acfc6e2e19b8387c97da707cb171c69812fefdd4650468e9b2c627bd5ccfb459f4d8e56bdfd84b09ddf87e128f +92c97276ff6f72bab6e9423d02ad6dc127962dbce15a0dd1e4a393b4510c555df6aa27be0f697c0d847033a9ca8b8dfd +a0e07d43d96e2d85b6276b3c60aadb48f0aedf2de8c415756dc597249ea64d2093731d8735231dadc961e5682ac59479 +adc9e6718a8f9298957d1da3842a7751c5399bbdf56f8de6c1c4bc39428f4aee6f1ba6613d37bf46b9403345e9d6fc81 +951da434da4b20d949b509ceeba02e24da7ed2da964c2fcdf426ec787779c696b385822c7dbea4df3e4a35921f1e912c +a04cbce0d2b2e87bbf038c798a12ec828423ca6aca08dc8d481cf6466e3c9c73d4d4a7fa47df9a7e2e15aae9e9f67208 +8f855cca2e440d248121c0469de1f94c2a71b8ee2682bbad3a78243a9e03da31d1925e6760dbc48a1957e040fae9abe8 +b642e5b17c1df4a4e101772d73851180b3a92e9e8b26c918050f51e6dd3592f102d20b0a1e96f0e25752c292f4c903ff +a92454c300781f8ae1766dbbb50a96192da7d48ef4cbdd72dd8cbb44c6eb5913c112cc38e9144615fdc03684deb99420 +8b74f7e6c2304f8e780df4649ef8221795dfe85fdbdaa477a1542d135b75c8be45bf89adbbb6f3ddf54ca40f02e733e9 +85cf66292cbb30cec5fd835ab10c9fcb3aea95e093aebf123e9a83c26f322d76ebc89c4e914524f6c5f6ee7d74fc917d +ae0bfe0cdc97c09542a7431820015f2d16067b30dca56288013876025e81daa8c519e5e347268e19aa1a85fa1dc28793 +921322fc6a47dc091afa0ad6df18ed14cde38e48c6e71550aa513918b056044983aee402de21051235eecf4ce8040fbe +96c030381e97050a45a318d307dcb3c8377b79b4dd5daf6337cded114de26eb725c14171b9b8e1b3c08fe1f5ea6b49e0 +90c23b86b6111818c8baaf53a13eaee1c89203b50e7f9a994bf0edf851919b48edbac7ceef14ac9414cf70c486174a77 +8bf6c301240d2d1c8d84c71d33a6dfc6d9e8f1cfae66d4d0f7a256d98ae12b0bcebfa94a667735ee89f810bcd7170cff +a41a4ffbbea0e36874d65c009ee4c3feffff322f6fc0e30d26ee4dbc1f46040d05e25d9d0ecb378cef0d24a7c2c4b850 +a8d4cdd423986bb392a0a92c12a8bd4da3437eec6ef6af34cf5310944899287452a2eb92eb5386086d5063381189d10e +a81dd26ec057c4032a4ed7ad54d926165273ed51d09a1267b2e477535cf6966835a257c209e4e92d165d74fa75695fa3 +8d7f708c3ee8449515d94fc26b547303b53d8dd55f177bc3b25d3da2768accd9bc8e9f09546090ebb7f15c66e6c9c723 +839ba65cffcd24cfffa7ab3b21faabe3c66d4c06324f07b2729c92f15cad34e474b0f0ddb16cd652870b26a756b731d3 +87f1a3968afec354d92d77e2726b702847c6afcabb8438634f9c6f7766de4c1504317dc4fa9a4a735acdbf985e119564 +91a8a7fd6542f3e0673f07f510d850864b34ac087eb7eef8845a1d14b2b1b651cbdc27fa4049bdbf3fea54221c5c8549 +aef3cf5f5e3a2385ead115728d7059e622146c3457d266c612e778324b6e06fbfb8f98e076624d2f3ce1035d65389a07 +819915d6232e95ccd7693fdd78d00492299b1983bc8f96a08dcb50f9c0a813ed93ae53c0238345d5bea0beda2855a913 +8e9ba68ded0e94935131b392b28218315a185f63bf5e3c1a9a9dd470944509ca0ba8f6122265f8da851b5cc2abce68f1 +b28468e9b04ee9d69003399a3cf4457c9bf9d59f36ab6ceeb8e964672433d06b58beeea198fedc7edbaa1948577e9fa2 +a633005e2c9f2fd94c8bce2dd5bb708fe946b25f1ec561ae65e54e15cdd88dc339f1a083e01f0d39610c8fe24151aaf0 +841d0031e22723f9328dd993805abd13e0c99b0f59435d2426246996b08d00ce73ab906f66c4eab423473b409e972ce0 +85758d1b084263992070ec8943f33073a2d9b86a8606672550c17545507a5b3c88d87382b41916a87ee96ff55a7aa535 +8581b06b0fc41466ef94a76a1d9fb8ae0edca6d018063acf6a8ca5f4b02d76021902feba58972415691b4bdbc33ae3b4 +83539597ff5e327357ee62bc6bf8c0bcaec2f227c55c7c385a4806f0d37fb461f1690bad5066b8a5370950af32fafbef +aee3557290d2dc10827e4791d00e0259006911f3f3fce4179ed3c514b779160613eca70f720bff7804752715a1266ffa +b48d2f0c4e90fc307d5995464e3f611a9b0ef5fe426a289071f4168ed5cc4f8770c9332960c2ca5c8c427f40e6bb389f +847af8973b4e300bb06be69b71b96183fd1a0b9d51b91701bef6fcfde465068f1eb2b1503b07afda380f18d69de5c9e1 +a70a6a80ce407f07804c0051ac21dc24d794b387be94eb24e1db94b58a78e1bcfb48cd0006db8fc1f9bedaece7a44fbe +b40e942b8fa5336910ff0098347df716bff9d1fa236a1950c16eeb966b3bc1a50b8f7b0980469d42e75ae13ced53cead +b208fabaa742d7db3148515330eb7a3577487845abdb7bd9ed169d0e081db0a5816595c33d375e56aeac5b51e60e49d3 +b7c8194b30d3d6ef5ab66ec88ad7ebbc732a3b8a41731b153e6f63759a93f3f4a537eab9ad369705bd730184bdbbdc34 +9280096445fe7394d04aa1bc4620c8f9296e991cc4d6c131bd703cb1cc317510e6e5855ac763f4d958c5edfe7eebeed7 +abc2aa4616a521400af1a12440dc544e3c821313d0ab936c86af28468ef8bbe534837e364598396a81cf8d06274ed5a6 +b18ca8a3325adb0c8c18a666d4859535397a1c3fe08f95eebfac916a7a99bbd40b3c37b919e8a8ae91da38bc00fa56c0 +8a40c33109ecea2a8b3558565877082f79121a432c45ec2c5a5e0ec4d1c203a6788e6b69cb37f1fd5b8c9a661bc5476d +88c47301dd30998e903c84e0b0f2c9af2e1ce6b9f187dab03528d44f834dc991e4c86d0c474a2c63468cf4020a1e24a0 +920c832853e6ab4c851eecfa9c11d3acc7da37c823be7aa1ab15e14dfd8beb5d0b91d62a30cec94763bd8e4594b66600 +98e1addbe2a6b8edc7f12ecb9be81c3250aeeca54a1c6a7225772ca66549827c15f3950d01b8eb44aecb56fe0fff901a +8cfb0fa1068be0ec088402f5950c4679a2eb9218c729da67050b0d1b2d7079f3ddf4bf0f57d95fe2a8db04bc6bcdb20c +b70f381aafe336b024120453813aeab70baac85b9c4c0f86918797b6aee206e6ed93244a49950f3d8ec9f81f4ac15808 +a4c8edf4aa33b709a91e1062939512419711c1757084e46f8f4b7ed64f8e682f4e78b7135920c12f0eb0422fe9f87a6a +b4817e85fd0752d7ebb662d3a51a03367a84bac74ebddfba0e5af5e636a979500f72b148052d333b3dedf9edd2b4031b +a87430169c6195f5d3e314ff2d1c2f050e766fd5d2de88f5207d72dba4a7745bb86d0baca6e9ae156582d0d89e5838c7 +991b00f8b104566b63a12af4826b61ce7aa40f4e5b8fff3085e7a99815bdb4471b6214da1e480214fac83f86a0b93cc5 +b39966e3076482079de0678477df98578377a094054960ee518ef99504d6851f8bcd3203e8da5e1d4f6f96776e1fe6eb +a448846d9dc2ab7a0995fa44b8527e27f6b3b74c6e03e95edb64e6baa4f1b866103f0addb97c84bef1d72487b2e21796 +894bec21a453ae84b592286e696c35bc30e820e9c2fd3e63dd4fbe629e07df16439c891056070faa490155f255bf7187 +a9ec652a491b11f6a692064e955f3f3287e7d2764527e58938571469a1e29b5225b9415bd602a45074dfbfe9c131d6ca +b39d37822e6cbe28244b5f42ce467c65a23765bd16eb6447c5b3e942278069793763483dafd8c4dd864f8917aad357fe +88dba51133f2019cb266641c56101e3e5987d3b77647a2e608b5ff9113dfc5f85e2b7c365118723131fbc0c9ca833c9c +b566579d904b54ecf798018efcb824dccbebfc6753a0fd2128ac3b4bd3b038c2284a7c782b5ca6f310eb7ea4d26a3f0a +a97a55c0a492e53c047e7d6f9d5f3e86fb96f3dddc68389c0561515343b66b4bc02a9c0d5722dff1e3445308240b27f7 +a044028ab4bcb9e1a2b9b4ca4efbf04c5da9e4bf2fff0e8bd57aa1fc12a71e897999c25d9117413faf2f45395dee0f13 +a78dc461decbeaeed8ebd0909369b491a5e764d6a5645a7dac61d3140d7dc0062526f777b0eb866bff27608429ebbdde +b2c2a8991f94c39ca35fea59f01a92cb3393e0eccb2476dfbf57261d406a68bd34a6cff33ed80209991688c183609ef4 +84189eefb521aff730a4fd3fd5b10ddfd29f0d365664caef63bb015d07e689989e54c33c2141dd64427805d37a7e546e +85ac80bd734a52235da288ff042dea9a62e085928954e8eacd2c751013f61904ed110e5b3afe1ab770a7e6485efb7b5e +9183a560393dcb22d0d5063e71182020d0fbabb39e32493eeffeb808df084aa243eb397027f150b55a247d1ed0c8513e +81c940944df7ecc58d3c43c34996852c3c7915ed185d7654627f7af62abae7e0048dd444a6c09961756455000bd96d09 +aa8c34e164019743fd8284b84f06c3b449aae7996e892f419ee55d82ad548cb300fd651de329da0384243954c0ef6a60 +89a7b7bdfc7e300d06a14d463e573d6296d8e66197491900cc9ae49504c4809ff6e61b758579e9091c61085ba1237b83 +878d21809ba540f50bd11f4c4d9590fb6f3ab9de5692606e6e2ef4ed9d18520119e385be5e1f4b3f2e2b09c319f0e8fc +8eb248390193189cf0355365e630b782cd15751e672dc478b39d75dc681234dcd9309df0d11f4610dbb249c1e6be7ef9 +a1d7fb3aecb896df3a52d6bd0943838b13f1bd039c936d76d03de2044c371d48865694b6f532393b27fd10a4cf642061 +a34bca58a24979be442238cbb5ece5bee51ae8c0794dd3efb3983d4db713bc6f28a96e976ac3bd9a551d3ed9ba6b3e22 +817c608fc8cacdd178665320b5a7587ca21df8bdd761833c3018b967575d25e3951cf3d498a63619a3cd2ad4406f5f28 +86c95707db0495689afd0c2e39e97f445f7ca0edffad5c8b4cacd1421f2f3cc55049dfd504f728f91534e20383955582 +99c3b0bb15942c301137765d4e19502f65806f3b126dc01a5b7820c87e8979bce6a37289a8f6a4c1e4637227ad5bf3bf +8aa1518a80ea8b074505a9b3f96829f5d4afa55a30efe7b4de4e5dbf666897fdd2cf31728ca45921e21a78a80f0e0f10 +8d74f46361c79e15128ac399e958a91067ef4cec8983408775a87eca1eed5b7dcbf0ddf30e66f51780457413496c7f07 +a41cde4a786b55387458a1db95171aca4fd146507b81c4da1e6d6e495527c3ec83fc42fad1dfe3d92744084a664fd431 +8c352852c906fae99413a84ad11701f93f292fbf7bd14738814f4c4ceab32db02feb5eb70bc73898b0bc724a39d5d017 +a5993046e8f23b71ba87b7caa7ace2d9023fb48ce4c51838813174880d918e9b4d2b0dc21a2b9c6f612338c31a289df8 +83576d3324bf2d8afbfb6eaecdc5d767c8e22e7d25160414924f0645491df60541948a05e1f4202e612368e78675de8a +b43749b8df4b15bc9a3697e0f1c518e6b04114171739ef1a0c9c65185d8ec18e40e6954d125cbc14ebc652cf41ad3109 +b4eebd5d80a7327a040cafb9ccdb12b2dfe1aa86e6bc6d3ac8a57fadfb95a5b1a7332c66318ff72ba459f525668af056 +9198be7f1d413c5029b0e1c617bcbc082d21abe2c60ec8ce9b54ca1a85d3dba637b72fda39dae0c0ae40d047eab9f55a +8d96a0232832e24d45092653e781e7a9c9520766c3989e67bbe86b3a820c4bf621ea911e7cd5270a4bfea78b618411f6 +8d7160d0ea98161a2d14d46ef01dff72d566c330cd4fabd27654d300e1bc7644c68dc8eabf2a20a59bfe7ba276545f9b +abb60fce29dec7ba37e3056e412e0ec3e05538a1fc0e2c68877378c867605966108bc5742585ab6a405ce0c962b285b6 +8fabffa3ed792f05e414f5839386f6449fd9f7b41a47595c5d71074bd1bb3784cc7a1a7e1ad6b041b455035957e5b2dc +90ff017b4804c2d0533b72461436b10603ab13a55f86fd4ec11b06a70ef8166f958c110519ca1b4cc7beba440729fe2d +b340cfd120f6a4623e3a74cf8c32bfd7cd61a280b59dfd17b15ca8fae4d82f64a6f15fbde4c02f424debc72b7db5fe67 +871311c9c7220c932e738d59f0ecc67a34356d1429fe570ca503d340c9996cb5ee2cd188fad0e3bd16e4c468ec1dbebd +a772470262186e7b94239ba921b29f2412c148d6f97c4412e96d21e55f3be73f992f1ad53c71008f0558ec3f84e2b5a7 +b2a897dcb7ffd6257f3f2947ec966f2077d57d5191a88840b1d4f67effebe8c436641be85524d0a21be734c63ab5965d +a044f6eacc48a4a061fa149500d96b48cbf14853469aa4d045faf3dca973be1bd4b4ce01646d83e2f24f7c486d03205d +981af5dc2daa73f7fa9eae35a93d81eb6edba4a7f673b55d41f6ecd87a37685d31bb40ef4f1c469b3d72f2f18b925a17 +912d2597a07864de9020ac77083eff2f15ceb07600f15755aba61251e8ce3c905a758453b417f04d9c38db040954eb65 +9642b7f6f09394ba5e0805734ef6702c3eddf9eea187ba98c676d5bbaec0e360e3e51dc58433aaa1e2da6060c8659cb7 +8ab3836e0a8ac492d5e707d056310c4c8e0489ca85eb771bff35ba1d658360084e836a6f51bb990f9e3d2d9aeb18fbb5 +879e058e72b73bb1f4642c21ffdb90544b846868139c6511f299aafe59c2d0f0b944dffc7990491b7c4edcd6a9889250 +b9e60b737023f61479a4a8fd253ed0d2a944ea6ba0439bbc0a0d3abf09b0ad1f18d75555e4a50405470ae4990626f390 +b9c2535d362796dcd673640a9fa2ebdaec274e6f8b850b023153b0a7a30fffc87f96e0b72696f647ebe7ab63099a6963 +94aeff145386a087b0e91e68a84a5ede01f978f9dd9fe7bebca78941938469495dc30a96bba9508c0d017873aeea9610 +98b179f8a3d9f0d0a983c30682dd425a2ddc7803be59bd626c623c8951a5179117d1d2a68254c95c9952989877d0ee55 +889ecf5f0ee56938273f74eb3e9ecfb5617f04fb58e83fe4c0e4aef51615cf345bc56f3f61b17f6eed3249d4afd54451 +a0f2b2c39bcea4b50883e2587d16559e246248a66ecb4a4b7d9ab3b51fb39fe98d83765e087eee37a0f86b0ba4144c02 +b2a61e247ed595e8a3830f7973b07079cbda510f28ad8c78c220b26cb6acde4fbb5ee90c14a665f329168ee951b08cf0 +95bd0fcfb42f0d6d8a8e73d7458498a85bcddd2fb132fd7989265648d82ac2707d6d203fac045504977af4f0a2aca4b7 +843e5a537c298666e6cf50fcc044f13506499ef83c802e719ff2c90e85003c132024e04711be7234c04d4b0125512d5d +a46d1797c5959dcd3a5cfc857488f4d96f74277c3d13b98b133620192f79944abcb3a361d939a100187f1b0856eae875 +a1c7786736d6707a48515c38660615fcec67eb8a2598f46657855215f804fd72ab122d17f94fcffad8893f3be658dca7 +b23dc9e610abc7d8bd21d147e22509a0fa49db5be6ea7057b51aae38e31654b3aa044df05b94b718153361371ba2f622 +b00cc8f257d659c22d30e6d641f79166b1e752ea8606f558e4cad6fc01532e8319ea4ee12265ba4140ac45aa4613c004 +ac7019af65221b0cc736287b32d7f1a3561405715ba9a6a122342e04e51637ba911c41573de53e4781f2230fdcb2475f +81a630bc41b3da8b3eb4bf56cba10cd9f93153c3667f009dc332287baeb707d505fb537e6233c8e53d299ec0f013290c +a6b7aea5c545bb76df0f230548539db92bc26642572cb7dd3d5a30edca2b4c386f44fc8466f056b42de2a452b81aff5b +8271624ff736b7b238e43943c81de80a1612207d32036d820c11fc830c737972ccc9c60d3c2359922b06652311e3c994 +8a684106458cb6f4db478170b9ad595d4b54c18bf63b9058f095a2fa1b928c15101472c70c648873d5887880059ed402 +a5cc3c35228122f410184e4326cf61a37637206e589fcd245cb5d0cec91031f8f7586b80503070840fdfd8ce75d3c88b +9443fc631aed8866a7ed220890911057a1f56b0afe0ba15f0a0e295ab97f604b134b1ed9a4245e46ee5f9a93aa74f731 +984b6f7d79835dffde9558c6bb912d992ca1180a2361757bdba4a7b69dc74b056e303adc69fe67414495dd9c2dd91e64 +b15a5c8cba5de080224c274d31c68ed72d2a7126d347796569aef0c4e97ed084afe3da4d4b590b9dda1a07f0c2ff3dfb +991708fe9650a1f9a4e43938b91d45dc68c230e05ee999c95dbff3bf79b1c1b2bb0e7977de454237c355a73b8438b1d9 +b4f7edc7468b176a4a7c0273700c444fa95c726af6697028bed4f77eee887e3400f9c42ee15b782c0ca861c4c3b8c98a +8c60dcc16c51087eb477c13e837031d6c6a3dc2b8bf8cb43c23f48006bc7173151807e866ead2234b460c2de93b31956 +83ad63e9c910d1fc44bc114accfb0d4d333b7ebe032f73f62d25d3e172c029d5e34a1c9d547273bf6c0fead5c8801007 +85de73213cc236f00777560756bdbf2b16841ba4b55902cf2cad9742ecaf5d28209b012ceb41f337456dfeca93010cd7 +a7561f8827ccd75b6686ba5398bb8fc3083351c55a589b18984e186820af7e275af04bcd4c28e1dc11be1e8617a0610b +88c0a4febd4068850557f497ea888035c7fc9f404f6cc7794e7cc8722f048ad2f249e7dc62743e7a339eb7473ad3b0cd +932b22b1d3e6d5a6409c34980d176feb85ada1bf94332ef5c9fc4d42b907dabea608ceef9b5595ef3feee195151f18d8 +a2867bb3f5ab88fbdae3a16c9143ab8a8f4f476a2643c505bb9f37e5b1fd34d216cab2204c9a017a5a67b7ad2dda10e8 +b573d5f38e4e9e8a3a6fd82f0880dc049efa492a946d00283019bf1d5e5516464cf87039e80aef667cb86fdea5075904 +b948f1b5ab755f3f5f36af27d94f503b070696d793b1240c1bdfd2e8e56890d69e6904688b5f8ff5a4bdf5a6abfe195f +917eae95ebc4109a2e99ddd8fec7881d2f7aaa0e25fda44dec7ce37458c2ee832f1829db7d2dcfa4ca0f06381c7fe91d +95751d17ed00a3030bce909333799bb7f4ab641acf585807f355b51d6976dceee410798026a1a004ef4dcdff7ec0f5b8 +b9b7bd266f449a79bbfe075e429613e76c5a42ac61f01c8f0bbbd34669650682efe01ff9dbbc400a1e995616af6aa278 +ac1722d097ce9cd7617161f8ec8c23d68f1fb1c9ca533e2a8b4f78516c2fd8fb38f23f834e2b9a03bb06a9d655693ca9 +a7ad9e96ffd98db2ecdb6340c5d592614f3c159abfd832fe27ee9293519d213a578e6246aae51672ee353e3296858873 +989b8814d5de7937c4acafd000eec2b4cd58ba395d7b25f98cafd021e8efa37029b29ad8303a1f6867923f5852a220eb +a5bfe6282c771bc9e453e964042d44eff4098decacb89aecd3be662ea5b74506e1357ab26f3527110ba377711f3c9f41 +8900a7470b656639721d2abbb7b06af0ac4222ab85a1976386e2a62eb4b88bfb5b72cf7921ddb3cf3a395d7eeb192a2e +95a71b55cd1f35a438cf5e75f8ff11c5ec6a2ebf2e4dba172f50bfad7d6d5dca5de1b1afc541662c81c858f7604c1163 +82b5d62fea8db8d85c5bc3a76d68dedd25794cf14d4a7bc368938ffca9e09f7e598fdad2a5aac614e0e52f8112ae62b9 +997173f07c729202afcde3028fa7f52cefc90fda2d0c8ac2b58154a5073140683e54c49ed1f254481070d119ce0ce02a +aeffb91ccc7a72bbd6ffe0f9b99c9e66e67d59cec2e02440465e9636a613ab3017278cfa72ea8bc4aba9a8dc728cb367 +952743b06e8645894aeb6440fc7a5f62dd3acf96dab70a51e20176762c9751ea5f2ba0b9497ccf0114dc4892dc606031 +874c63baeddc56fbbca2ff6031f8634b745f6e34ea6791d7c439201aee8f08ef5ee75f7778700a647f3b21068513fce6 +85128fec9c750c1071edfb15586435cc2f317e3e9a175bb8a9697bcda1eb9375478cf25d01e7fed113483b28f625122d +85522c9576fd9763e32af8495ae3928ed7116fb70d4378448926bc9790e8a8d08f98cf47648d7da1b6e40d6a210c7924 +97d0f37a13cfb723b848099ca1c14d83e9aaf2f7aeb71829180e664b7968632a08f6a85f557d74b55afe6242f2a36e7c +abaa472d6ad61a5fccd1a57c01aa1bc081253f95abbcba7f73923f1f11c4e79b904263890eeb66926de3e2652f5d1c70 +b3c04945ba727a141e5e8aec2bf9aa3772b64d8fd0e2a2b07f3a91106a95cbcb249adcd074cbe498caf76fffac20d4ef +82c46781a3d730d9931bcabd7434a9171372dde57171b6180e5516d4e68db8b23495c8ac3ab96994c17ddb1cf249b9fb +a202d8b65613c42d01738ccd68ed8c2dbc021631f602d53f751966e04182743ebc8e0747d600b8a8676b1da9ae7f11ab +ae73e7256e9459db04667a899e0d3ea5255211fb486d084e6550b6dd64ca44af6c6b2d59d7aa152de9f96ce9b58d940d +b67d87b176a9722945ec7593777ee461809861c6cfd1b945dde9ee4ff009ca4f19cf88f4bbb5c80c9cbab2fe25b23ac8 +8f0b7a317a076758b0dac79959ee4a06c08b07d0f10538a4b53d3da2eda16e2af26922feb32c090330dc4d969cf69bd3 +90b36bf56adbd8c4b6cb32febc3a8d5f714370c2ac3305c10fa6d168dffb2a026804517215f9a2d4ec8310cdb6bb459b +aa80c19b0682ead69934bf18cf476291a0beddd8ef4ed75975d0a472e2ab5c70f119722a8574ae4973aceb733d312e57 +a3fc9abb12574e5c28dcb51750b4339b794b8e558675eef7d26126edf1de920c35e992333bcbffcbf6a5f5c0d383ce62 +a1573ff23ab972acdcd08818853b111fc757fdd35aa070186d3e11e56b172fb49d840bf297ac0dd222e072fc09f26a81 +98306f2be4caa92c2b4392212d0cbf430b409b19ff7d5b899986613bd0e762c909fc01999aa94be3bd529d67f0113d7f +8c1fc42482a0819074241746d17dc89c0304a2acdae8ed91b5009e9e3e70ff725ba063b4a3e68fdce05b74f5180c545e +a6c6113ebf72d8cf3163b2b8d7f3fa24303b13f55752522c660a98cd834d85d8c79214d900fa649499365e2e7641f77a +ab95eea424f8a2cfd9fb1c78bb724e5b1d71a0d0d1e4217c5d0f98b0d8bbd3f8400a2002abc0a0e4576d1f93f46fefad +823c5a4fd8cf4a75fdc71d5f2dd511b6c0f189b82affeacd2b7cfcad8ad1a5551227dcc9bfdb2e34b2097eaa00efbb51 +b97314dfff36d80c46b53d87a61b0e124dc94018a0bb680c32765b9a2d457f833a7c42bbc90b3b1520c33a182580398d +b17566ee3dcc6bb3b004afe4c0136dfe7dd27df9045ae896dca49fb36987501ae069eb745af81ba3fc19ff037e7b1406 +b0bdc0f55cfd98d331e3a0c4fbb776a131936c3c47c6bffdc3aaf7d8c9fa6803fbc122c2fefbb532e634228687d52174 +aa5d9e60cc9f0598559c28bb9bdd52aa46605ab4ffe3d192ba982398e72cec9a2a44c0d0d938ce69935693cabc0887ea +802b6459d2354fa1d56c592ac1346c428dadea6b6c0a87bf7d309bab55c94e1cf31dd98a7a86bd92a840dd51f218b91b +a526914efdc190381bf1a73dd33f392ecf01350b9d3f4ae96b1b1c3d1d064721c7d6eec5788162c933245a3943f5ee51 +b3b8fcf637d8d6628620a1a99dbe619eabb3e5c7ce930d6efd2197e261bf394b74d4e5c26b96c4b8009c7e523ccfd082 +8f7510c732502a93e095aba744535f3928f893f188adc5b16008385fb9e80f695d0435bfc5b91cdad4537e87e9d2551c +97b90beaa56aa936c3ca45698f79273a68dd3ccd0076eab48d2a4db01782665e63f33c25751c1f2e070f4d1a8525bf96 +b9fb798324b1d1283fdc3e48288e3861a5449b2ab5e884b34ebb8f740225324af86e4711da6b5cc8361c1db15466602f +b6d52b53cea98f1d1d4c9a759c25bf9d8a50b604b144e4912acbdbdc32aab8b9dbb10d64a29aa33a4f502121a6fb481c +9174ffff0f2930fc228f0e539f5cfd82c9368d26b074467f39c07a774367ff6cccb5039ac63f107677d77706cd431680 +a33b6250d4ac9e66ec51c063d1a6a31f253eb29bbaed12a0d67e2eccfffb0f3a52750fbf52a1c2aaba8c7692346426e7 +a97025fd5cbcebe8ef865afc39cd3ea707b89d4e765ec817fd021d6438e02fa51e3544b1fd45470c58007a08efac6edd +b32a78480edd9ff6ba2f1eec4088db5d6ceb2d62d7e59e904ecaef7bb4a2e983a4588e51692b3be76e6ffbc0b5f911a5 +b5ab590ef0bb77191f00495b33d11c53c65a819f7d0c1f9dc4a2caa147a69c77a4fff7366a602d743ee1f395ce934c1e +b3fb0842f9441fb1d0ee0293b6efbc70a8f58d12d6f769b12872db726b19e16f0f65efbc891cf27a28a248b0ef9c7e75 +9372ad12856fefb928ccb0d34e198df99e2f8973b07e9d417a3134d5f69e12e79ff572c4e03ccd65415d70639bc7c73e +aa8d6e83d09ce216bfe2009a6b07d0110d98cf305364d5529c170a23e693aabb768b2016befb5ada8dabdd92b4d012bb +a954a75791eeb0ce41c85200c3763a508ed8214b5945a42c79bfdcfb1ec4f86ad1dd7b2862474a368d4ac31911a2b718 +8e2081cfd1d062fe3ab4dab01f68062bac802795545fede9a188f6c9f802cb5f884e60dbe866710baadbf55dc77c11a4 +a2f06003b9713e7dd5929501ed485436b49d43de80ea5b15170763fd6346badf8da6de8261828913ee0dacd8ff23c0e1 +98eecc34b838e6ffd1931ca65eec27bcdb2fdcb61f33e7e5673a93028c5865e0d1bf6d3bec040c5e96f9bd08089a53a4 +88cc16019741b341060b95498747db4377100d2a5bf0a5f516f7dec71b62bcb6e779de2c269c946d39040e03b3ae12b7 +ad1135ccbc3019d5b2faf59a688eef2500697642be8cfbdf211a1ab59abcc1f24483e50d653b55ff1834675ac7b4978f +a946f05ed9972f71dfde0020bbb086020fa35b482cce8a4cc36dd94355b2d10497d7f2580541bb3e81b71ac8bba3c49f +a83aeed488f9a19d8cfd743aa9aa1982ab3723560b1cd337fc2f91ad82f07afa412b3993afb845f68d47e91ba4869840 +95eebe006bfc316810cb71da919e5d62c2cebb4ac99d8e8ef67be420302320465f8b69873470982de13a7c2e23516be9 +a55f8961295a11e91d1e5deadc0c06c15dacbfc67f04ccba1d069cba89d72aa3b3d64045579c3ea8991b150ac29366ae +b321991d12f6ac07a5de3c492841d1a27b0d3446082fbce93e7e1f9e8d8fe3b45d41253556261c21b70f5e189e1a7a6f +a0b0822f15f652ce7962a4f130104b97bf9529797c13d6bd8e24701c213cc37f18157bd07f3d0f3eae6b7cd1cb40401f +96e2fa4da378aa782cc2d5e6e465fc9e49b5c805ed01d560e9b98abb5c0de8b74a2e7bec3aa5e2887d25cccb12c66f0c +97e4ab610d414f9210ed6f35300285eb3ccff5b0b6a95ed33425100d7725e159708ea78704497624ca0a2dcabce3a2f9 +960a375b17bdb325761e01e88a3ea57026b2393e1d887b34b8fa5d2532928079ce88dc9fd06a728b26d2bb41b12b9032 +8328a1647398e832aadc05bd717487a2b6fcdaa0d4850d2c4da230c6a2ed44c3e78ec4837b6094f3813f1ee99414713f +aa283834ebd18e6c99229ce4b401eda83f01d904f250fedd4e24f1006f8fa0712a6a89a7296a9bf2ce8de30e28d1408e +b29e097f2caadae3e0f0ae3473c072b0cd0206cf6d2e9b22c1a5ad3e07d433e32bd09ed1f4e4276a2da4268633357b7f +9539c5cbba14538b2fe077ecf67694ef240da5249950baaabea0340718b882a966f66d97f08556b08a4320ceb2cc2629 +b4529f25e9b42ae8cf8338d2eface6ba5cd4b4d8da73af502d081388135c654c0b3afb3aa779ffc80b8c4c8f4425dd2b +95be0739c4330619fbe7ee2249c133c91d6c07eab846c18c5d6c85fc21ac5528c5d56dcb0145af68ed0c6a79f68f2ccd +ac0c83ea802227bfc23814a24655c9ff13f729619bcffdb487ccbbf029b8eaee709f8bddb98232ef33cd70e30e45ca47 +b503becb90acc93b1901e939059f93e671900ca52c6f64ae701d11ac891d3a050b505d89324ce267bc43ab8275da6ffe +98e3811b55b1bacb70aa409100abb1b870f67e6d059475d9f278c751b6e1e2e2d6f2e586c81a9fb6597fda06e7923274 +b0b0f61a44053fa6c715dbb0731e35d48dba257d134f851ee1b81fd49a5c51a90ebf5459ec6e489fce25da4f184fbdb1 +b1d2117fe811720bb997c7c93fe9e4260dc50fca8881b245b5e34f724aaf37ed970cdad4e8fcb68e05ac8cf55a274a53 +a10f502051968f14b02895393271776dee7a06db9de14effa0b3471825ba94c3f805302bdddac4d397d08456f620999d +a3dbad2ef060ae0bb7b02eaa4a13594f3f900450faa1854fc09620b01ac94ab896321dfb1157cf2374c27e5718e8026a +b550fdec503195ecb9e079dcdf0cad559d64d3c30818ef369b4907e813e689da316a74ad2422e391b4a8c2a2bef25fc0 +a25ba865e2ac8f28186cea497294c8649a201732ecb4620c4e77b8e887403119910423df061117e5f03fc5ba39042db1 +b3f88174e03fdb443dd6addd01303cf88a4369352520187c739fc5ae6b22fa99629c63c985b4383219dab6acc5f6f532 +97a7503248e31e81b10eb621ba8f5210c537ad11b539c96dfb7cf72b846c7fe81bd7532c5136095652a9618000b7f8d3 +a8bcdc1ce5aa8bfa683a2fc65c1e79de8ff5446695dcb8620f7350c26d2972a23da22889f9e2b1cacb3f688c6a2953dc +8458c111df2a37f5dd91a9bee6c6f4b79f4f161c93fe78075b24a35f9817da8dde71763218d627917a9f1f0c4709c1ed +ac5f061a0541152b876cbc10640f26f1cc923c9d4ae1b6621e4bb3bf2cec59bbf87363a4eb72fb0e5b6d4e1c269b52d5 +a9a25ca87006e8a9203cbb78a93f50a36694aa4aad468b8d80d3feff9194455ca559fcc63838128a0ab75ad78c07c13a +a450b85f5dfffa8b34dfd8bc985f921318efacf8857cf7948f93884ba09fb831482ee90a44224b1a41e859e19b74962f +8ed91e7f92f5c6d7a71708b6132f157ac226ecaf8662af7d7468a4fa25627302efe31e4620ad28719318923e3a59bf82 +ab524165fd4c71b1fd395467a14272bd2b568592deafa039d8492e9ef36c6d3f96927c95c72d410a768dc0b6d1fbbc9b +b662144505aa8432c75ffb8d10318526b6d5777ac7af9ebfad87d9b0866c364f7905a6352743bd8fd79ffd9d5dd4f3e6 +a48f1677550a5cd40663bb3ba8f84caaf8454f332d0ceb1d94dbea52d0412fe69c94997f7749929712fd3995298572f7 +8391cd6e2f6b0c242de1117a612be99776c3dc95cb800b187685ea5bf7e2722275eddb79fd7dfc8be8e389c4524cdf70 +875d3acb9af47833b72900bc0a2448999d638f153c5e97e8a14ec02d0c76f6264353a7e275e1f1a5855daced523d243b +91f1823657d30b59b2f627880a9a9cb530f5aca28a9fd217fe6f2f5133690dfe7ad5a897872e400512db2e788b3f7628 +ad3564332aa56cea84123fc7ca79ea70bb4fef2009fa131cb44e4b15e8613bd11ca1d83b9d9bf456e4b7fee9f2e8b017 +8c530b84001936d5ab366c84c0b105241a26d1fb163669f17c8f2e94776895c2870edf3e1bc8ccd04d5e65531471f695 +932d01fa174fdb0c366f1230cffde2571cc47485f37f23ba5a1825532190cc3b722aeb1f15aed62cf83ccae9403ba713 +88b28c20585aca50d10752e84b901b5c2d58efef5131479fbbe53de7bce2029e1423a494c0298e1497669bd55be97a5d +b914148ca717721144ebb3d3bf3fcea2cd44c30c5f7051b89d8001502f3856fef30ec167174d5b76265b55d70f8716b5 +81d0173821c6ddd2a068d70766d9103d1ee961c475156e0cbd67d54e668a796310474ef698c7ab55abe6f2cf76c14679 +8f28e8d78e2fe7fa66340c53718e0db4b84823c8cfb159c76eac032a62fb53da0a5d7e24ca656cf9d2a890cb2a216542 +8a26360335c73d1ab51cec3166c3cf23b9ea51e44a0ad631b0b0329ef55aaae555420348a544e18d5760969281759b61 +94f326a32ed287545b0515be9e08149eb0a565025074796d72387cc3a237e87979776410d78339e23ef3172ca43b2544 +a785d2961a2fa5e70bffa137858a92c48fe749fee91b02599a252b0cd50d311991a08efd7fa5e96b78d07e6e66ffe746 +94af9030b5ac792dd1ce517eaadcec1482206848bea4e09e55cc7f40fd64d4c2b3e9197027c5636b70d6122c51d2235d +9722869f7d1a3992850fe7be405ec93aa17dc4d35e9e257d2e469f46d2c5a59dbd504056c85ab83d541ad8c13e8bcd54 +b13c4088b61a06e2c03ac9813a75ff1f68ffdfee9df6a8f65095179a475e29cc49119cad2ce05862c3b1ac217f3aace9 +8c64d51774753623666b10ca1b0fe63ae42f82ed6aa26b81dc1d48c86937c5772eb1402624c52a154b86031854e1fb9f +b47e4df18002b7dac3fee945bf9c0503159e1b8aafcce2138818e140753011b6d09ef1b20894e08ba3006b093559061b +93cb5970076522c5a0483693f6a35ffd4ea2aa7aaf3730c4eccd6af6d1bebfc1122fc4c67d53898ae13eb6db647be7e2 +a68873ef80986795ea5ed1a597d1cd99ed978ec25e0abb57fdcc96e89ef0f50aeb779ff46e3dce21dc83ada3157a8498 +8cab67f50949cc8eee6710e27358aea373aae3c92849f8f0b5531c080a6300cdf2c2094fe6fecfef6148de0d28446919 +993e932bcb616dbaa7ad18a4439e0565211d31071ef1b85a0627db74a05d978c60d507695eaeea5c7bd9868a21d06923 +acdadff26e3132d9478a818ef770e9fa0d2b56c6f5f48bd3bd674436ccce9bdfc34db884a73a30c04c5f5e9764cb2218 +a0d3e64c9c71f84c0eef9d7a9cb4fa184224b969db5514d678e93e00f98b41595588ca802643ea225512a4a272f5f534 +91c9140c9e1ba6e330cb08f6b2ce4809cd0d5a0f0516f70032bf30e912b0ed684d07b413b326ab531ee7e5b4668c799b +87bc2ee7a0c21ba8334cd098e35cb703f9af57f35e091b8151b9b63c3a5b0f89bd7701dbd44f644ea475901fa6d9ef08 +9325ccbf64bf5d71b303e31ee85d486298f9802c5e55b2c3d75427097bf8f60fa2ab4fcaffa9b60bf922c3e24fbd4b19 +95d0506e898318f3dc8d28d16dfd9f0038b54798838b3c9be2a2ae3c2bf204eb496166353fc042220b0bd4f6673b9285 +811de529416331fe9c416726d45df9434c29dcd7e949045eb15740f47e97dde8f31489242200e19922cac2a8b7c6fd1f +ade632d04a4c8bbab6ca7df370b2213cb9225023e7973f0e29f4f5e52e8aeaabc65171306bbdd12a67b195dfbb96d48f +88b7f029e079b6ae956042c0ea75d53088c5d0efd750dd018adaeacf46be21bf990897c58578c491f41afd3978d08073 +91f477802de507ffd2be3f4319903119225b277ad24f74eb50f28b66c14d32fae53c7edb8c7590704741af7f7f3e3654 +809838b32bb4f4d0237e98108320d4b079ee16ed80c567e7548bd37e4d7915b1192880f4812ac0e00476d246aec1dbc8 +84183b5fc4a7997a8ae5afedb4d21dce69c480d5966b5cbdafd6dd10d29a9a6377f3b90ce44da0eb8b176ac3af0253bb +8508abbf6d3739a16b9165caf0f95afb3b3ac1b8c38d6d374cf0c91296e2c1809a99772492b539cda184510bce8a0271 +8722054e59bab2062e6419a6e45fc803af77fde912ef2cd23055ad0484963de65a816a2debe1693d93c18218d2b8e81a +8e895f80e485a7c4f56827bf53d34b956281cdc74856c21eb3b51f6288c01cc3d08565a11cc6f3e2604775885490e8c5 +afc92714771b7aa6e60f3aee12efd9c2595e9659797452f0c1e99519f67c8bc3ac567119c1ddfe82a3e961ee9defea9a +818ff0fd9cefd32db87b259e5fa32967201016fc02ef44116cdca3c63ce5e637756f60477a408709928444a8ad69c471 +8251e29af4c61ae806fc5d032347fb332a94d472038149225298389495139ce5678fae739d02dfe53a231598a992e728 +a0ea39574b26643f6f1f48f99f276a8a64b5481989cfb2936f9432a3f8ef5075abfe5c067dc5512143ce8bf933984097 +af67a73911b372bf04e57e21f289fc6c3dfac366c6a01409b6e76fea4769bdb07a6940e52e8d7d3078f235c6d2f632c6 +b5291484ef336024dd2b9b4cf4d3a6b751133a40656d0a0825bcc6d41c21b1c79cb50b0e8f4693f90c29c8f4358641f9 +8bc0d9754d70f2cb9c63f991902165a87c6535a763d5eece43143b5064ae0bcdce7c7a8f398f2c1c29167b2d5a3e6867 +8d7faff53579ec8f6c92f661c399614cc35276971752ce0623270f88be937c414eddcb0997e14724a783905a026c8883 +9310b5f6e675fdf60796f814dbaa5a6e7e9029a61c395761e330d9348a7efab992e4e115c8be3a43d08e90d21290c892 +b5eb4f3eb646038ad2a020f0a42202532d4932e766da82b2c1002bf9c9c2e5336b54c8c0ffcc0e02d19dde2e6a35b6cc +91dabfd30a66710f1f37a891136c9be1e23af4abf8cb751f512a40c022a35f8e0a4fb05b17ec36d4208de02d56f0d53a +b3ded14e82d62ac7a5a036122a62f00ff8308498f3feae57d861babaff5a6628d43f0a0c5fc903f10936bcf4e2758ceb +a88e8348fed2b26acca6784d19ef27c75963450d99651d11a950ea81d4b93acd2c43e0ecce100eaf7e78508263d5baf3 +b1f5bbf7c4756877b87bb42163ac570e08c6667c4528bf68b5976680e19beeff7c5effd17009b0718797077e2955457a +ad2e7b516243f915d4d1415326e98b1a7390ae88897d0b03b66c2d9bd8c3fba283d7e8fe44ed3333296a736454cef6d8 +8f82eae096d5b11f995de6724a9af895f5e1c58d593845ad16ce8fcae8507e0d8e2b2348a0f50a1f66a17fd6fac51a5c +890e4404d0657c6c1ee14e1aac132ecf7a568bb3e04137b85ac0f84f1d333bd94993e8750f88eee033a33fb00f85dcc7 +82ac7d3385e035115f1d39a99fc73e5919de44f5e6424579776d118d711c8120b8e5916372c6f27bed4cc64cac170b6c +85ee16d8901c272cfbbe966e724b7a891c1bd5e68efd5d863043ad8520fc409080af61fd726adc680b3f1186fe0ac8b8 +86dc564c9b545567483b43a38f24c41c6551a49cabeebb58ce86404662a12dbfafd0778d30d26e1c93ce222e547e3898 +a29f5b4522db26d88f5f95f18d459f8feefab02e380c2edb65aa0617a82a3c1a89474727a951cef5f15050bcf7b380fb +a1ce039c8f6cac53352899edb0e3a72c76da143564ad1a44858bd7ee88552e2fe6858d1593bbd74aeee5a6f8034b9b9d +97f10d77983f088286bd7ef3e7fdd8fa275a56bec19919adf33cf939a90c8f2967d2b1b6fc51195cb45ad561202a3ed7 +a25e2772e8c911aaf8712bdac1dd40ee061c84d3d224c466cfaae8e5c99604053f940cde259bd1c3b8b69595781dbfec +b31bb95a0388595149409c48781174c340960d59032ab2b47689911d03c68f77a2273576fbe0c2bf4553e330656058c7 +b8b2e9287ad803fb185a13f0d7456b397d4e3c8ad5078f57f49e8beb2e85f661356a3392dbd7bcf6a900baa5582b86a1 +a3d0893923455eb6e96cc414341cac33d2dbc88fba821ac672708cce131761d85a0e08286663a32828244febfcae6451 +82310cb42f647d99a136014a9f881eb0b9791efd2e01fc1841907ad3fc8a9654d3d1dab6689c3607214b4dc2aca01cee +874022d99c16f60c22de1b094532a0bc6d4de700ad01a31798fac1d5088b9a42ad02bef8a7339af7ed9c0d4f16b186ee +94981369e120265aed40910eebc37eded481e90f4596b8d57c3bec790ab7f929784bd33ddd05b7870aad6c02e869603b +a4f1f50e1e2a73f07095e0dd31cb45154f24968dae967e38962341c1241bcd473102fff1ff668b20c6547e9732d11701 +ae2328f3b0ad79fcda807e69a1b5278145225083f150f67511dafc97e079f860c3392675f1752ae7e864c056e592205b +875d8c971e593ca79552c43d55c8c73b17cd20c81ff2c2fed1eb19b1b91e4a3a83d32df150dbfd5db1092d0aebde1e1f +add2e80aa46aae95da73a11f130f4bda339db028e24c9b11e5316e75ba5e63bc991d2a1da172c7c8e8fee038baae3433 +b46dbe1cb3424002aa7de51e82f600852248e251465c440695d52538d3f36828ff46c90ed77fc1d11534fe3c487df8ef +a5e5045d28b4e83d0055863c30c056628c58d4657e6176fd0536f5933f723d60e851bb726d5bf3c546b8ce4ac4a57ef8 +91fec01e86dd1537e498fff7536ea3ca012058b145f29d9ada49370cd7b7193ac380e116989515df1b94b74a55c45df3 +a7428176d6918cd916a310bdc75483c72de660df48cac4e6e7478eef03205f1827ea55afc0df5d5fa7567d14bbea7fc9 +851d89bef45d9761fe5fdb62972209335193610015e16a675149519f9911373bac0919add226ef118d9f3669cfdf4734 +b74acf5c149d0042021cb2422ea022be4c4f72a77855f42393e71ffd12ebb3eec16bdf16f812159b67b79a9706e7156d +99f35dce64ec99aa595e7894b55ce7b5a435851b396e79036ffb249c28206087db4c85379df666c4d95857db02e21ff9 +b6b9a384f70db9e298415b8ab394ee625dafff04be2886476e59df8d052ca832d11ac68a9b93fba7ab055b7bc36948a4 +898ee4aefa923ffec9e79f2219c7389663eb11eb5b49014e04ed4a336399f6ea1691051d86991f4c46ca65bcd4fdf359 +b0f948217b0d65df7599a0ba4654a5e43c84db477936276e6f11c8981efc6eaf14c90d3650107ed4c09af4cc8ec11137 +aa6286e27ac54f73e63dbf6f41865dd94d24bc0cf732262fcaff67319d162bb43af909f6f8ee27b1971939cfbba08141 +8bca7cdf730cf56c7b2c8a2c4879d61361a6e1dba5a3681a1a16c17a56e168ace0e99cf0d15826a1f5e67e6b8a8a049a +a746d876e8b1ce225fcafca603b099b36504846961526589af977a88c60d31ba2cc56e66a3dec8a77b3f3531bf7524c9 +a11e2e1927e6704cdb8874c75e4f1842cef84d7d43d7a38e339e61dc8ba90e61bbb20dd3c12e0b11d2471d58eed245be +a36395e22bc1d1ba8b0459a235203177737397da5643ce54ded3459d0869ff6d8d89f50c73cb62394bf66a959cde9b90 +8b49f12ba2fdf9aca7e5f81d45c07d47f9302a2655610e7634d1e4bd16048381a45ef2c95a8dd5b0715e4b7cf42273af +91cffa2a17e64eb7f76bccbe4e87280ee1dd244e04a3c9eac12e15d2d04845d876eb24fe2ec6d6d266cce9efb281077f +a6b8afabf65f2dee01788114e33a2f3ce25376fb47a50b74da7c3c25ff1fdc8aa9f41307534abbf48acb6f7466068f69 +8d13db896ccfea403bd6441191995c1a65365cab7d0b97fbe9526da3f45a877bd1f4ef2edef160e8a56838cd1586330e +98c717de9e01bef8842c162a5e757fe8552d53269c84862f4d451e7c656ae6f2ae473767b04290b134773f63be6fdb9d +8c2036ace1920bd13cf018e82848c49eb511fad65fd0ff51f4e4b50cf3bfc294afb63cba682c16f52fb595a98fa84970 +a3520fdff05dbad9e12551b0896922e375f9e5589368bcb2cc303bde252743b74460cb5caf99629325d3620f13adc796 +8d4f83a5bfec05caf5910e0ce538ee9816ee18d0bd44c1d0da2a87715a23cd2733ad4d47552c6dc0eb397687d611dd19 +a7b39a0a6a02823452d376533f39d35029867b3c9a6ad6bca181f18c54132d675613a700f9db2440fb1b4fa13c8bf18a +80bcb114b2544b80f404a200fc36860ed5e1ad31fe551acd4661d09730c452831751baa9b19d7d311600d267086a70bc +90dcce03c6f88fc2b08f2b42771eedde90cc5330fe0336e46c1a7d1b5a6c1641e5fcc4e7b3d5db00bd8afca9ec66ed81 +aec15f40805065c98e2965b1ae12a6c9020cfdb094c2d0549acfc7ea2401a5fb48d3ea7d41133cf37c4e096e7ff53eb9 +80e129b735dba49fa627a615d6c273119acec8e219b2f2c4373a332b5f98d66cbbdd688dfbe72a8f8bfefaccc02c50c1 +a9b596da3bdfe23e6799ece5f7975bf7a1979a75f4f546deeaf8b34dfe3e0d623217cb4cf4ccd504cfa3625b88cd53f1 +abcbbb70b16f6e517c0ab4363ab76b46e4ff58576b5f8340e5c0e8cc0e02621b6e23d742d73b015822a238b17cfd7665 +a046937cc6ea6a2e1adae543353a9fe929c1ae4ad655be1cc051378482cf88b041e28b1e9a577e6ccff2d3570f55e200 +831279437282f315e65a60184ef158f0a3dddc15a648dc552bdc88b3e6fe8288d3cfe9f0031846d81350f5e7874b4b33 +993d7916fa213c6d66e7c4cafafc1eaec9a2a86981f91c31eb8a69c5df076c789cbf498a24c84e0ee77af95b42145026 +823907a3b6719f8d49b3a4b7c181bd9bb29fcf842d7c70660c4f351852a1e197ca46cf5e879b47fa55f616fa2b87ce5e +8d228244e26132b234930ee14c75d88df0943cdb9c276a8faf167d259b7efc1beec2a87c112a6c608ad1600a239e9aae +ab6e55766e5bfb0cf0764ed909a8473ab5047d3388b4f46faeba2d1425c4754c55c6daf6ad4751e634c618b53e549529 +ab0cab6860e55a84c5ad2948a7e0989e2b4b1fd637605634b118361497332df32d9549cb854b2327ca54f2bcb85eed8f +b086b349ae03ef34f4b25a57bcaa5d1b29bd94f9ebf87e22be475adfe475c51a1230c1ebe13506cb72c4186192451658 +8a0b49d8a254ca6d91500f449cbbfbb69bb516c6948ac06808c65595e46773e346f97a5ce0ef7e5a5e0de278af22709c +ac49de11edaaf04302c73c578cc0824bdd165c0d6321be1c421c1950e68e4f3589aa3995448c9699e93c6ebae8803e27 +884f02d841cb5d8f4c60d1402469216b114ab4e93550b5bc1431756e365c4f870a9853449285384a6fa49e12ce6dc654 +b75f3a28fa2cc8d36b49130cb7448a23d73a7311d0185ba803ad55c8219741d451c110f48b786e96c728bc525903a54f +80ae04dbd41f4a35e33f9de413b6ad518af0919e5a30cb0fa1b061b260420780bb674f828d37fd3b52b5a31673cbd803 +b9a8011eb5fcea766907029bf743b45262db3e49d24f84503687e838651ed11cb64c66281e20a0ae9f6aa51acc552263 +90bfdd75e2dc9cf013e22a5d55d2d2b8a754c96103a17524488e01206e67f8b6d52b1be8c4e3d5307d4fe06d0e51f54c +b4af353a19b06203a815ec43e79a88578cc678c46f5a954b85bc5c53b84059dddba731f3d463c23bfd5273885c7c56a4 +aa125e96d4553b64f7140e5453ff5d2330318b69d74d37d283e84c26ad672fa00e3f71e530eb7e28be1e94afb9c4612e +a18e060aee3d49cde2389b10888696436bb7949a79ca7d728be6456a356ea5541b55492b2138da90108bd1ce0e6f5524 +93e55f92bdbccc2de655d14b1526836ea2e52dba65eb3f87823dd458a4cb5079bf22ce6ef625cb6d6bfdd0995ab9a874 +89f5a683526b90c1c3ceebbb8dc824b21cff851ce3531b164f6626e326d98b27d3e1d50982e507d84a99b1e04e86a915 +83d1c38800361633a3f742b1cb2bfc528129496e80232611682ddbe403e92c2ac5373aea0bca93ecb5128b0b2b7a719e +8ecba560ac94905e19ce8d9c7af217bf0a145d8c8bd38e2db82f5e94cc3f2f26f55819176376b51f154b4aab22056059 +a7e2a4a002b60291924850642e703232994acb4cfb90f07c94d1e0ecd2257bb583443283c20fc6017c37e6bfe85b7366 +93ed7316fa50b528f1636fc6507683a672f4f4403e55e94663f91221cc198199595bd02eef43d609f451acc9d9b36a24 +a1220a8ebc5c50ceed76a74bc3b7e0aa77f6884c71b64b67c4310ac29ce5526cb8992d6abc13ef6c8413ce62486a6795 +b2f6eac5c869ad7f4a25161d3347093e2f70e66cd925032747e901189355022fab3038bca4d610d2f68feb7e719c110b +b703fa11a4d511ca01c7462979a94acb40b5d933759199af42670eb48f83df202fa0c943f6ab3b4e1cc54673ea3aab1e +b5422912afbfcb901f84791b04f1ddb3c3fbdc76d961ee2a00c5c320e06d3cc5b5909c3bb805df66c5f10c47a292b13d +ad0934368da823302e1ac08e3ede74b05dfdbfffca203e97ffb0282c226814b65c142e6e15ec1e754518f221f01b30f7 +a1dd302a02e37df15bf2f1147efe0e3c06933a5a767d2d030e1132f5c3ce6b98e216b6145eb39e1e2f74e76a83165b8d +a346aab07564432f802ae44738049a36f7ca4056df2d8f110dbe7fef4a3e047684dea609b2d03dc6bf917c9c2a47608f +b96c5f682a5f5d02123568e50f5d0d186e4b2c4c9b956ec7aabac1b3e4a766d78d19bd111adb5176b898e916e49be2aa +8a96676d56876fc85538db2e806e1cba20fd01aeb9fa3cb43ca6ca94a2c102639f65660db330e5d74a029bb72d6a0b39 +ab0048336bd5c3def1a4064eadd49e66480c1f2abb4df46e03afbd8a3342c2c9d74ee35d79f08f4768c1646681440984 +888427bdf76caec90814c57ee1c3210a97d107dd88f7256f14f883ad0f392334b82be11e36dd8bfec2b37935177c7831 +b622b282becf0094a1916fa658429a5292ba30fb48a4c8066ce1ddcefb71037948262a01c95bab6929ed3a76ba5db9fe +b5b9e005c1f456b6a368a3097634fb455723abe95433a186e8278dceb79d4ca2fbe21f8002e80027b3c531e5bf494629 +a3c6707117a1e48697ed41062897f55d8119403eea6c2ee88f60180f6526f45172664bfee96bf61d6ec0b7fbae6aa058 +b02a9567386a4fbbdb772d8a27057b0be210447348efe6feb935ceec81f361ed2c0c211e54787dc617cdffed6b4a6652 +a9b8364e40ef15c3b5902e5534998997b8493064fa2bea99600def58279bb0f64574c09ba11e9f6f669a8354dd79dc85 +9998a2e553a9aa9a206518fae2bc8b90329ee59ab23005b10972712389f2ec0ee746033c733092ffe43d73d33abbb8ef +843a4b34d9039bf79df96d79f2d15e8d755affb4d83d61872daf540b68c0a3888cf8fc00d5b8b247b38524bcb3b5a856 +84f7128920c1b0bb40eee95701d30e6fc3a83b7bb3709f16d97e72acbb6057004ee7ac8e8f575936ca9dcb7866ab45f7 +918d3e2222e10e05edb34728162a899ad5ada0aaa491aeb7c81572a9c0d506e31d5390e1803a91ff3bd8e2bb15d47f31 +9442d18e2489613a7d47bb1cb803c8d6f3259d088cd079460976d87f7905ee07dea8f371b2537f6e1d792d36d7e42723 +b491976970fe091995b2ed86d629126523ccf3e9daf8145302faca71b5a71a5da92e0e05b62d7139d3efac5c4e367584 +aa628006235dc77c14cef4c04a308d66b07ac92d377df3de1a2e6ecfe3144f2219ad6d7795e671e1cb37a3641910b940 +99d386adaea5d4981d7306feecac9a555b74ffdc218c907c5aa7ac04abaead0ec2a8237300d42a3fbc464673e417ceed +8f78e8b1556f9d739648ea3cab9606f8328b52877fe72f9305545a73b74d49884044ba9c1f1c6db7d9b7c7b7c661caba +8fb357ae49932d0babdf74fc7aa7464a65d3b6a2b3acf4f550b99601d3c0215900cfd67f2b6651ef94cfc323bac79fae +9906f2fa25c0290775aa001fb6198113d53804262454ae8b83ef371b5271bde189c0460a645829cb6c59f9ee3a55ce4d +8f4379b3ebb50e052325b27655ca6a82e6f00b87bf0d2b680d205dd2c7afdc9ff32a9047ae71a1cdf0d0ce6b9474d878 +a85534e88c2bd43c043792eaa75e50914b21741a566635e0e107ae857aed0412035f7576cf04488ade16fd3f35fdbb87 +b4ce93199966d3c23251ca7f28ec5af7efea1763d376b0385352ffb2e0a462ef95c69940950278cf0e3dafd638b7bd36 +b10cb3d0317dd570aa73129f4acf63c256816f007607c19b423fb42f65133ce21f2f517e0afb41a5378cccf893ae14d0 +a9b231c9f739f7f914e5d943ed9bff7eba9e2c333fbd7c34eb1648a362ee01a01af6e2f7c35c9fe962b11152cddf35de +99ff6a899e156732937fb81c0cced80ae13d2d44c40ba99ac183aa246103b31ec084594b1b7feb96da58f4be2dd5c0ed +8748d15d18b75ff2596f50d6a9c4ce82f61ecbcee123a6ceae0e43cab3012a29b6f83cf67b48c22f6f9d757c6caf76b2 +b88ab05e4248b7fb634cf640a4e6a945d13e331237410f7217d3d17e3e384ddd48897e7a91e4516f1b9cbd30f35f238b +8d826deaeeb84a3b2d2c04c2300ca592501f992810582d6ae993e0d52f6283a839dba66c6c72278cff5871802b71173b +b36fed027c2f05a5ef625ca00b0364b930901e9e4420975b111858d0941f60e205546474bb25d6bfa6928d37305ae95f +af2fcfc6b87967567e8b8a13a4ed914478185705724e56ce68fb2df6d1576a0cf34a61e880997a0d35dc2c3276ff7501 +ac351b919cd1fbf106feb8af2c67692bfcddc84762d18cea681cfa7470a5644839caace27efee5f38c87d3df306f4211 +8d6665fb1d4d8d1fa23bd9b8a86e043b8555663519caac214d1e3e3effbc6bee7f2bcf21e645f77de0ced279d69a8a8b +a9fc1c2061756b2a1a169c1b149f212ff7f0d2488acd1c5a0197eba793cffa593fc6d1d1b40718aa75ca3ec77eff10e1 +aff64f0fa009c7a6cf0b8d7a22ddb2c8170c3cb3eec082e60d5aadb00b0040443be8936d728d99581e33c22178c41c87 +82e0b181adc5e3b1c87ff8598447260e839d53debfae941ebea38265575546c3a74a14b4325a030833a62ff6c52d9365 +b7ad43cbb22f6f892c2a1548a41dc120ab1f4e1b8dea0cb6272dd9cb02054c542ecabc582f7e16de709d48f5166cae86 +985e0c61094281532c4afb788ecb2dfcba998e974b5d4257a22040a161883908cdd068fe80f8eb49b8953cfd11acf43a +ae46895c6d67ea6d469b6c9c07b9e5d295d9ae73b22e30da4ba2c973ba83a130d7eef39717ec9d0f36e81d56bf742671 +8600177ea1f7e7ef90514b38b219a37dedfc39cb83297e4c7a5b479817ef56479d48cf6314820960c751183f6edf8b0e +b9208ec1c1d7a1e99b59c62d3e4e61dfb706b0e940d09d3abfc3454c19749083260614d89cfd7e822596c3cdbcc6bb95 +a1e94042c796c2b48bc724352d2e9f3a22291d9a34705993357ddb6adabd76da6fc25dac200a8cb0b5bbd99ecddb7af6 +b29c3adedd0bcad8a930625bc4dfdc3552a9afd5ca6dd9c0d758f978068c7982b50b711aa0eb5b97f2b84ee784637835 +af0632a238bb1f413c7ea8e9b4c3d68f2827bd2e38cd56024391fba6446ac5d19a780d0cfd4a78fe497d537b766a591a +aaf6e7f7d54f8ef5e2e45dd59774ecbeecf8683aa70483b2a75be6a6071b5981bbaf1627512a65d212817acdfab2e428 +8c751496065da2e927cf492aa5ca9013b24f861d5e6c24b30bbf52ec5aaf1905f40f9a28175faef283dd4ed4f2182a09 +8952377d8e80a85cf67d6b45499f3bad5fd452ea7bcd99efc1b066c4720d8e5bff1214cea90fd1f972a7f0baac3d29be +a1946ee543d1a6e21f380453be4d446e4130950c5fc3d075794eb8260f6f52d0a795c1ff91d028a648dc1ce7d9ab6b47 +89f3fefe37af31e0c17533d2ca1ce0884cc1dc97c15cbfab9c331b8debd94781c9396abef4bb2f163d09277a08d6adf0 +a2753f1e6e1a154fb117100a5bd9052137add85961f8158830ac20541ab12227d83887d10acf7fd36dcaf7c2596d8d23 +814955b4198933ee11c3883863b06ff98c7eceb21fc3e09df5f916107827ccf3323141983e74b025f46ae00284c9513b +8cc5c6bb429073bfef47cae7b3bfccb0ffa076514d91a1862c6bda4d581e0df87db53cc6c130bf8a7826304960f5a34e +909f22c1f1cdc87f7be7439c831a73484a49acbf8f23d47087d7cf867c64ef61da3bde85dc57d705682b4c3fc710d36e +8048fee7f276fcd504aed91284f28e73693615e0eb3858fa44bcf79d7285a9001c373b3ef71d9a3054817ba293ebe28c +94400e5cf5d2700ca608c5fe35ce14623f71cc24959f2bc27ca3684092850f76b67fb1f07ca9e5b2ca3062cf8ad17bd4 +81c2ae7d4d1b17f8b6de6a0430acc0d58260993980fe48dc2129c4948269cdc74f9dbfbf9c26b19360823fd913083d48 +8c41fe765128e63f6889d6a979f6a4342300327c8b245a8cfe3ecfbcac1e09c3da30e2a1045b24b78efc6d6d50c8c6ac +a5dd4ae51ae48c8be4b218c312ade226cffce671cf121cb77810f6c0990768d6dd767badecb5c69921d5574d5e8433d3 +b7642e325f4ba97ae2a39c1c9d97b35aafd49d53dba36aed3f3cb0ca816480b3394079f46a48252d46596559c90f4d58 +ae87375b40f35519e7bd4b1b2f73cd0b329b0c2cb9d616629342a71c6c304338445eda069b78ea0fbe44087f3de91e09 +b08918cb6f736855e11d3daca1ddfbdd61c9589b203b5493143227bf48e2c77c2e8c94b0d1aa2fab2226e0eae83f2681 +ac36b84a4ac2ebd4d6591923a449c564e3be8a664c46092c09e875c2998eba16b5d32bfd0882fd3851762868e669f0b1 +a44800a3bb192066fa17a3f29029a23697240467053b5aa49b9839fb9b9b8b12bcdcbfc557f024b61f4f51a9aacdefcb +9064c688fec23441a274cdf2075e5a449caf5c7363cc5e8a5dc9747183d2e00a0c69f2e6b3f6a7057079c46014c93b3b +aa367b021469af9f5b764a79bb3afbe2d87fe1e51862221672d1a66f954b165778b7c27a705e0f93841fab4c8468344d +a1a8bfc593d4ab71f91640bc824de5c1380ab2591cfdafcbc78a14b32de3c0e15f9d1b461d85c504baa3d4232c16bb53 +97df48da1799430f528184d30b6baa90c2a2f88f34cdfb342d715339c5ebd6d019aa693cea7c4993daafc9849063a3aa +abd923831fbb427e06e0dd335253178a9e5791395c84d0ab1433c07c53c1209161097e9582fb8736f8a60bde62d8693e +84cd1a43f1a438b43dc60ffc775f646937c4f6871438163905a3cebf1115f814ccd38a6ccb134130bff226306e412f32 +91426065996b0743c5f689eb3ca68a9f7b9e4d01f6c5a2652b57fa9a03d8dc7cd4bdbdab0ca5a891fee1e97a7f00cf02 +a4bee50249db3df7fd75162b28f04e57c678ba142ce4d3def2bc17bcb29e4670284a45f218dad3969af466c62a903757 +83141ebcc94d4681404e8b67a12a46374fded6df92b506aff3490d875919631408b369823a08b271d006d5b93136f317 +a0ea1c8883d58d5a784da3d8c8a880061adea796d7505c1f903d07c287c5467f71e4563fc0faafbc15b5a5538b0a7559 +89d9d480574f201a87269d26fb114278ed2c446328df431dc3556e3500e80e4cd01fcac196a2459d8646361ebda840df +8bf302978973632dd464bec819bdb91304712a3ec859be071e662040620422c6e75eba6f864f764cffa2799272efec39 +922f666bc0fd58b6d7d815c0ae4f66d193d32fc8382c631037f59eeaeae9a8ca6c72d08e72944cf9e800b8d639094e77 +81ad8714f491cdff7fe4399f2eb20e32650cff2999dd45b9b3d996d54a4aba24cc6c451212e78c9e5550368a1a38fb3f +b58fcf4659d73edb73175bd9139d18254e94c3e32031b5d4b026f2ed37aa19dca17ec2eb54c14340231615277a9d347e +b365ac9c2bfe409b710928c646ea2fb15b28557e0f089d39878e365589b9d1c34baf5566d20bb28b33bb60fa133f6eff +8fcae1d75b53ab470be805f39630d204853ca1629a14158bac2f52632277d77458dec204ff84b7b2d77e641c2045be65 +a03efa6bebe84f4f958a56e2d76b5ba4f95dd9ed7eb479edc7cc5e646c8d4792e5b0dfc66cc86aa4b4afe2f7a4850760 +af1c823930a3638975fb0cc5c59651771b2719119c3cd08404fbd4ce77a74d708cefbe3c56ea08c48f5f10e6907f338f +8260c8299b17898032c761c325ac9cabb4c5b7e735de81eacf244f647a45fb385012f4f8df743128888c29aefcaaad16 +ab2f37a573c82e96a8d46198691cd694dfa860615625f477e41f91b879bc58a745784fccd8ffa13065834ffd150d881d +986c746c9b4249352d8e5c629e8d7d05e716b3c7aab5e529ca969dd1e984a14b5be41528baef4c85d2369a42d7209216 +b25e32da1a8adddf2a6080725818b75bc67240728ad1853d90738485d8924ea1e202df0a3034a60ffae6f965ec55cf63 +a266e627afcebcefea6b6b44cbc50f5c508f7187e87d047b0450871c2a030042c9e376f3ede0afcf9d1952f089582f71 +86c3bbca4c0300606071c0a80dbdec21ce1dd4d8d4309648151c420854032dff1241a1677d1cd5de4e4de4385efda986 +b9a21a1fe2d1f3273a8e4a9185abf2ff86448cc98bfa435e3d68306a2b8b4a6a3ea33a155be3cb62a2170a86f77679a5 +b117b1ea381adce87d8b342cba3a15d492ff2d644afa28f22424cb9cbc820d4f7693dfc1a4d1b3697046c300e1c9b4c8 +9004c425a2e68870d6c69b658c344e3aa3a86a8914ee08d72b2f95c2e2d8a4c7bb0c6e7e271460c0e637cec11117bf8e +86a18aa4783b9ebd9131580c8b17994825f27f4ac427b0929a1e0236907732a1c8139e98112c605488ee95f48bbefbfc +84042243b955286482ab6f0b5df4c2d73571ada00716d2f737ca05a0d2e88c6349e8ee9e67934cfee4a1775dbf7f4800 +92c2153a4733a62e4e1d5b60369f3c26777c7d01cd3c8679212660d572bd3bac9b8a8a64e1f10f7dbf5eaa7579c4e423 +918454b6bb8e44a2afa144695ba8d48ae08d0cdfef4ad078f67709eddf3bb31191e8b006f04e82ea45a54715ef4d5817 +acf0b54f6bf34cf6ed6c2b39cf43194a40d68de6bcf1e4b82c34c15a1343e9ac3737885e1a30b78d01fa3a5125463db8 +a7d60dbe4b6a7b054f7afe9ee5cbbfeca0d05dc619e6041fa2296b549322529faddb8a11e949562309aecefb842ac380 +91ffb53e6d7e5f11159eaf13e783d6dbdfdb1698ed1e6dbf3413c6ea23492bbb9e0932230a9e2caac8fe899a17682795 +b6e8d7be5076ee3565d5765a710c5ecf17921dd3cf555c375d01e958a365ae087d4a88da492a5fb81838b7b92bf01143 +a8c6b763de2d4b2ed42102ef64eccfef31e2fb2a8a2776241c82912fa50fc9f77f175b6d109a97ede331307c016a4b1a +99839f86cb700c297c58bc33e28d46b92931961548deac29ba8df91d3e11721b10ea956c8e16984f9e4acf1298a79b37 +8c2e2c338f25ea5c25756b7131cde0d9a2b35abf5d90781180a00fe4b8e64e62590dc63fe10a57fba3a31c76d784eb01 +9687d7df2f41319ca5469d91978fed0565a5f11f829ebadaa83db92b221755f76c6eacd7700735e75c91e257087512e3 +8795fdfb7ff8439c58b9bf58ed53873d2780d3939b902b9ddaaa4c99447224ced9206c3039a23c2c44bcc461e2bb637f +a803697b744d2d087f4e2307218d48fa88620cf25529db9ce71e2e3bbcc65bac5e8bb9be04777ef7bfb5ed1a5b8e6170 +80f3d3efbbb9346ddd413f0a8e36b269eb5d7ff6809d5525ff9a47c4bcab2c01b70018b117f6fe05253775612ff70c6b +9050e0e45bcc83930d4c505af35e5e4d7ca01cd8681cba92eb55821aececcebe32bb692ebe1a4daac4e7472975671067 +8d206812aac42742dbaf233e0c080b3d1b30943b54b60283515da005de05ea5caa90f91fedcfcba72e922f64d7040189 +a2d44faaeb2eff7915c83f32b13ca6f31a6847b1c1ce114ea240bac3595eded89f09b2313b7915ad882292e2b586d5b4 +961776c8576030c39f214ea6e0a3e8b3d32f023d2600958c098c95c8a4e374deeb2b9dc522adfbd6bda5949bdc09e2a2 +993fa7d8447407af0fbcd9e6d77f815fa5233ab00674efbcf74a1f51c37481445ae291cc7b76db7c178f9cb0e570e0fc +abd5b1c78e05f9d7c8cc99bdaef8b0b6a57f2daf0f02bf492bec48ea4a27a8f1e38b5854da96efff11973326ff980f92 +8f15af4764bc275e6ccb892b3a4362cacb4e175b1526a9a99944e692fe6ccb1b4fc19abf312bb2a089cb1f344d91a779 +a09b27ccd71855512aba1d0c30a79ffbe7f6707a55978f3ced50e674b511a79a446dbc6d7946add421ce111135a460af +94b2f98ce86a9271fbd4153e1fc37de48421fe3490fb3840c00f2d5a4d0ba8810c6a32880b002f6374b59e0a7952518b +8650ac644f93bbcb88a6a0f49fee2663297fd4bc6fd47b6a89b9d8038d32370438ab3a4775ec9b58cb10aea8a95ef7b6 +95e5c2f2e84eed88c6980bbba5a1c0bb375d5a628bff006f7516d45bb7d723da676add4fdd45956f312e7bab0f052644 +b3278a3fa377ac93af7cfc9453f8cb594aae04269bbc99d2e0e45472ff4b6a2f97a26c4c57bf675b9d86f5e77a5d55d1 +b4bcbe6eb666a206e2ea2f877912c1d3b5bdbd08a989fc4490eb06013e1a69ad1ba08bcdac048bf29192312be399077b +a76d70b78c99fffcbf9bb9886eab40f1ea4f99a309710b660b64cbf86057cbcb644d243f6e341711bb7ef0fedf0435a7 +b2093c1ee945dca7ac76ad5aed08eae23af31dd5a77c903fd7b6f051f4ab84425d33a03c3d45bf2907bc93c02d1f3ad8 +904b1f7534e053a265b22d20be859912b9c9ccb303af9a8d6f1d8f6ccdc5c53eb4a45a1762b880d8444d9be0cd55e7f9 +8f664a965d65bc730c9ef1ec7467be984d4b8eb46bd9b0d64e38e48f94e6e55dda19aeac82cbcf4e1473440e64c4ca18 +8bcee65c4cc7a7799353d07b114c718a2aae0cd10a3f22b7eead5185d159dafd64852cb63924bf87627d176228878bce +8c78f2e3675096fef7ebaa898d2615cd50d39ca3d8f02b9bdfb07e67da648ae4be3da64838dffc5935fd72962c4b96c7 +8c40afd3701629421fec1df1aac4e849384ef2e80472c0e28d36cb1327acdf2826f99b357f3d7afdbc58a6347fc40b3c +a197813b1c65a8ea5754ef782522a57d63433ef752215ecda1e7da76b0412ee619f58d904abd2e07e0c097048b6ae1dd +a670542629e4333884ad7410f9ea3bd6f988df4a8f8a424ca74b9add2312586900cf9ae8bd50411f9146e82626b4af56 +a19875cc07ab84e569d98b8b67fb1dbbdfb59093c7b748fae008c8904a6fd931a63ca8d03ab5fea9bc8d263568125a9b +b57e7f68e4eb1bd04aafa917b1db1bdab759a02aa8a9cdb1cba34ba8852b5890f655645c9b4e15d5f19bf37e9f2ffe9f +8abe4e2a4f6462b6c64b3f10e45db2a53c2b0d3c5d5443d3f00a453e193df771eda635b098b6c8604ace3557514027af +8459e4fb378189b22b870a6ef20183deb816cefbf66eca1dc7e86d36a2e011537db893729f500dc154f14ce24633ba47 +930851df4bc7913c0d8c0f7bd3b071a83668987ed7c397d3d042fdc0d9765945a39a3bae83da9c88cb6b686ed8aeeb26 +8078c9e5cd05e1a8c932f8a1d835f61a248b6e7133fcbb3de406bf4ffc0e584f6f9f95062740ba6008d98348886cf76b +addff62bb29430983fe578e3709b0949cdc0d47a13a29bc3f50371a2cb5c822ce53e2448cfaa01bcb6e0aa850d5a380e +9433add687b5a1e12066721789b1db2edf9b6558c3bdc0f452ba33b1da67426abe326e9a34d207bfb1c491c18811bde1 +822beda3389963428cccc4a2918fa9a8a51cf0919640350293af70821967108cded5997adae86b33cb917780b097f1ca +a7a9f52bda45e4148ed56dd176df7bd672e9b5ed18888ccdb405f47920fdb0844355f8565cefb17010b38324edd8315f +b35c3a872e18e607b2555c51f9696a17fa18da1f924d503b163b4ec9fe22ed0c110925275cb6c93ce2d013e88f173d6a +adf34b002b2b26ab84fc1bf94e05bd8616a1d06664799ab149363c56a6e0c807fdc473327d25632416e952ea327fcd95 +ae4a6b9d22a4a3183fac29e2551e1124a8ce4a561a9a2afa9b23032b58d444e6155bb2b48f85c7b6d70393274e230db7 +a2ea3be4fc17e9b7ce3110284038d46a09e88a247b6971167a7878d9dcf36925d613c382b400cfa4f37a3ebea3699897 +8e5863786b641ce3140fbfe37124d7ad3925472e924f814ebfc45959aaf3f61dc554a597610b5defaecc85b59a99b50f +aefde3193d0f700d0f515ab2aaa43e2ef1d7831c4f7859f48e52693d57f97fa9e520090f3ed700e1c966f4b76048e57f +841a50f772956622798e5cd208dc7534d4e39eddee30d8ce133383d66e5f267e389254a0cdae01b770ecd0a9ca421929 +8fbc2bfd28238c7d47d4c03b1b910946c0d94274a199575e5b23242619b1de3497784e646a92aa03e3e24123ae4fcaba +926999579c8eec1cc47d7330112586bdca20b4149c8b2d066f527c8b9f609e61ce27feb69db67eea382649c6905efcf9 +b09f31f305efcc65589adf5d3690a76cf339efd67cd43a4e3ced7b839507466e4be72dd91f04e89e4bbef629d46e68c0 +b917361f6b95f759642638e0b1d2b3a29c3bdef0b94faa30de562e6078c7e2d25976159df3edbacbf43614635c2640b4 +8e7e8a1253bbda0e134d62bfe003a2669d471b47bd2b5cde0ff60d385d8e62279d54022f5ac12053b1e2d3aaa6910b4c +b69671a3c64e0a99d90b0ed108ce1912ff8ed983e4bddd75a370e9babde25ee1f5efb59ec707edddd46793207a8b1fe7 +910b2f4ebd37b7ae94108922b233d0920b4aba0bd94202c70f1314418b548d11d8e9caa91f2cd95aff51b9432d122b7f +82f645c90dfb52d195c1020346287c43a80233d3538954548604d09fbab7421241cde8593dbc4acc4986e0ea39a27dd9 +8fee895f0a140d88104ce442fed3966f58ff9d275e7373483f6b4249d64a25fb5374bbdc6bce6b5ab0270c2847066f83 +84f5bd7aab27b2509397aeb86510dd5ac0a53f2c8f73799bf720f2f87a52277f8d6b0f77f17bc80739c6a7119b7eb062 +9903ceced81099d7e146e661bcf01cbaccab5ba54366b85e2177f07e2d8621e19d9c9c3eee14b9266de6b3f9b6ea75ae +b9c16ea2a07afa32dd6c7c06df0dec39bca2067a9339e45475c98917f47e2320f6f235da353fd5e15b477de97ddc68dd +9820a9bbf8b826bec61ebf886de2c4f404c1ebdc8bab82ee1fea816d9de29127ce1852448ff717a3fe8bbfe9e92012e5 +817224d9359f5da6f2158c2c7bf9165501424f063e67ba9859a07ab72ee2ee62eb00ca6da821cfa19065c3282ca72c74 +94b95c465e6cb00da400558a3c60cfec4b79b27e602ca67cbc91aead08de4b6872d8ea096b0dc06dca4525c8992b8547 +a2b539a5bccd43fa347ba9c15f249b417997c6a38c63517ca38394976baa08e20be384a360969ff54e7e721db536b3e5 +96caf707e34f62811ee8d32ccf28d8d6ec579bc33e424d0473529af5315c456fd026aa910c1fed70c91982d51df7d3ca +8a77b73e890b644c6a142bdbac59b22d6a676f3b63ddafb52d914bb9d395b8bf5aedcbcc90429337df431ebd758a07a6 +8857830a7351025617a08bc44caec28d2fae07ebf5ffc9f01d979ce2a53839a670e61ae2783e138313929129790a51a1 +aa3e420321ed6f0aa326d28d1a10f13facec6f605b6218a6eb9cbc074801f3467bf013a456d1415a5536f12599efa3d3 +824aed0951957b00ea2f3d423e30328a3527bf6714cf9abbae84cf27e58e5c35452ba89ccc011de7c68c75d6e021d8f1 +a2e87cc06bf202e953fb1081933d8b4445527dde20e38ed1a4f440144fd8fa464a2b73e068b140562e9045e0f4bd3144 +ae3b8f06ad97d7ae3a5e5ca839efff3e4824dc238c0c03fc1a8d2fc8aa546cdfd165b784a31bb4dec7c77e9305b99a4b +b30c3e12395b1fb8b776f3ec9f87c70e35763a7b2ddc68f0f60a4982a84017f27c891a98561c830038deb033698ed7fc +874e507757cd1177d0dff0b0c62ce90130324442a33da3b2c8ee09dbca5d543e3ecfe707e9f1361e7c7db641c72794bb +b53012dd10b5e7460b57c092eaa06d6502720df9edbbe3e3f61a9998a272bf5baaac4a5a732ad4efe35d6fac6feca744 +85e6509d711515534d394e6cacbed6c81da710074d16ef3f4950bf2f578d662a494d835674f79c4d6315bced4defc5f0 +b6132b2a34b0905dcadc6119fd215419a7971fe545e52f48b768006944b4a9d7db1a74b149e2951ea48c083b752d0804 +989867da6415036d19b4bacc926ce6f4df7a556f50a1ba5f3c48eea9cefbb1c09da81481c8009331ee83f0859185e164 +960a6c36542876174d3fbc1505413e29f053ed87b8d38fef3af180491c7eff25200b45dd5fe5d4d8e63c7e8c9c00f4c8 +9040b59bd739d9cc2e8f6e894683429e4e876a8106238689ff4c22770ae5fdae1f32d962b30301fa0634ee163b524f35 +af3fcd0a45fe9e8fe256dc7eab242ef7f582dd832d147444483c62787ac820fafc6ca55d639a73f76bfa5e7f5462ab8f +b934c799d0736953a73d91e761767fdb78454355c4b15c680ce08accb57ccf941b13a1236980001f9e6195801cffd692 +8871e8e741157c2c326b22cf09551e78da3c1ec0fc0543136f581f1550f8bab03b0a7b80525c1e99812cdbf3a9698f96 +a8a977f51473a91d178ee8cfa45ffef8d6fd93ab1d6e428f96a3c79816d9c6a93cd70f94d4deda0125fd6816e30f3bea +a7688b3b0a4fc1dd16e8ba6dc758d3cfe1b7cf401c31739484c7fa253cce0967df1b290769bcefc9d23d3e0cb19e6218 +8ae84322662a57c6d729e6ff9d2737698cc2da2daeb1f39e506618750ed23442a6740955f299e4a15dda6db3e534d2c6 +a04a961cdccfa4b7ef83ced17ab221d6a043b2c718a0d6cc8e6f798507a31f10bf70361f70a049bc8058303fa7f96864 +b463e39732a7d9daec8a456fb58e54b30a6e160aa522a18b9a9e836488cce3342bcbb2e1deab0f5e6ec0a8796d77197d +b1434a11c6750f14018a2d3bcf94390e2948f4f187e93bb22070ca3e5393d339dc328cbfc3e48815f51929465ffe7d81 +84ff81d73f3828340623d7e3345553610aa22a5432217ef0ebd193cbf4a24234b190c65ca0873c22d10ea7b63bd1fbed +b6fe2723f0c47757932c2ddde7a4f8434f665612f7b87b4009c2635d56b6e16b200859a8ade49276de0ef27a2b6c970a +9742884ed7cd52b4a4a068a43d3faa02551a424136c85a9313f7cb58ea54c04aa83b0728fd741d1fe39621e931e88f8f +b7d2d65ea4d1ad07a5dee39e40d6c03a61264a56b1585b4d76fc5b2a68d80a93a42a0181d432528582bf08d144c2d6a9 +88c0f66bada89f8a43e5a6ead2915088173d106c76f724f4a97b0f6758aed6ae5c37c373c6b92cdd4aea8f6261f3a374 +81f9c43582cb42db3900747eb49ec94edb2284999a499d1527f03315fd330e5a509afa3bff659853570e9886aab5b28b +821f9d27d6beb416abf9aa5c79afb65a50ed276dbda6060103bc808bcd34426b82da5f23e38e88a55e172f5c294b4d40 +8ba307b9e7cb63a6c4f3851b321aebfdb6af34a5a4c3bd949ff7d96603e59b27ff4dc4970715d35f7758260ff942c9e9 +b142eb6c5f846de33227d0bda61d445a7c33c98f0a8365fe6ab4c1fabdc130849be597ef734305894a424ea715372d08 +a732730ae4512e86a741c8e4c87fee8a05ee840fec0e23b2e037d58dba8dde8d10a9bc5191d34d00598941becbbe467f +adce6f7c30fd221f6b10a0413cc76435c4bb36c2d60bca821e5c67409fe9dbb2f4c36ef85eb3d734695e4be4827e9fd3 +a74f00e0f9b23aff7b2527ce69852f8906dab9d6abe62ecd497498ab21e57542e12af9918d4fd610bb09e10b0929c510 +a593b6b0ef26448ce4eb3ab07e84238fc020b3cb10d542ff4b16d4e2be1bcde3797e45c9cf753b8dc3b0ffdb63984232 +aed3913afccf1aa1ac0eb4980eb8426d0baccebd836d44651fd72af00d09fac488a870223c42aca3ceb39752070405ae +b2c44c66a5ea7fde626548ba4cef8c8710191343d3dadfd3bb653ce715c0e03056a5303a581d47dde66e70ea5a2d2779 +8e5029b2ccf5128a12327b5103f7532db599846e422531869560ceaff392236434d87159f597937dbf4054f810c114f4 +82beed1a2c4477e5eb39fc5b0e773b30cfec77ef2b1bf17eadaf60eb35b6d0dd9d8cf06315c48d3546badb3f21cd0cca +90077bd6cc0e4be5fff08e5d07a5a158d36cebd1d1363125bc4fae0866ffe825b26f933d4ee5427ba5cd0c33c19a7b06 +a7ec0d8f079970e8e34f0ef3a53d3e0e45428ddcef9cc776ead5e542ef06f3c86981644f61c5a637e4faf001fb8c6b3e +ae6d4add6d1a6f90b22792bc9d40723ee6850c27d0b97eefafd5b7fd98e424aa97868b5287cc41b4fbd7023bca6a322c +831aa917533d077da07c01417feaa1408846363ba2b8d22c6116bb858a95801547dd88b7d7fa1d2e3f0a02bdeb2e103d +96511b860b07c8a5ed773f36d4aa9d02fb5e7882753bf56303595bcb57e37ccc60288887eb83bef08c657ec261a021a2 +921d2a3e7e9790f74068623de327443666b634c8443aba80120a45bba450df920b2374d96df1ce3fb1b06dd06f8cf6e3 +aa74451d51fe82b4581ead8e506ec6cd881010f7e7dd51fc388eb9a557db5d3c6721f81c151d08ebd9c2591689fbc13e +a972bfbcf4033d5742d08716c927c442119bdae336bf5dff914523b285ccf31953da2733759aacaa246a9af9f698342c +ad1fcd0cae0e76840194ce4150cb8a56ebed728ec9272035f52a799d480dfc85840a4d52d994a18b6edb31e79be6e8ad +a2c69fe1d36f235215432dad48d75887a44c99dfa0d78149acc74087da215a44bdb5f04e6eef88ff7eff80a5a7decc77 +a94ab2af2b6ee1bc6e0d4e689ca45380d9fbd3c5a65b9bd249d266a4d4c07bf5d5f7ef2ae6000623aee64027892bf8fe +881ec1fc514e926cdc66480ac59e139148ff8a2a7895a49f0dff45910c90cdda97b66441a25f357d6dd2471cddd99bb3 +884e6d3b894a914c8cef946a76d5a0c8351843b2bffa2d1e56c6b5b99c84104381dd1320c451d551c0b966f4086e60f9 +817c6c10ce2677b9fc5223500322e2b880583254d0bb0d247d728f8716f5e05c9ff39f135854342a1afecd9fbdcf7c46 +aaf4a9cb686a14619aa1fc1ac285dd3843ac3dd99f2b2331c711ec87b03491c02f49101046f3c5c538dc9f8dba2a0ac2 +97ecea5ce53ca720b5d845227ae61d70269a2f53540089305c86af35f0898bfd57356e74a8a5e083fa6e1ea70080bd31 +a22d811e1a20a75feac0157c418a4bfe745ccb5d29466ffa854dca03e395b6c3504a734341746b2846d76583a780b32e +940cbaa0d2b2db94ae96b6b9cf2deefbfd059e3e5745de9aec4a25f0991b9721e5cd37ef71c631575d1a0c280b01cd5b +ae33cb4951191258a11044682de861bf8d92d90ce751b354932dd9f3913f542b6a0f8a4dc228b3cd9244ac32c4582832 +a580df5e58c4274fe0f52ac2da1837e32f5c9db92be16c170187db4c358f43e5cfdda7c5911dcc79d77a5764e32325f5 +81798178cb9d8affa424f8d3be67576ba94d108a28ccc01d330c51d5a63ca45bb8ca63a2f569b5c5fe1303cecd2d777f +89975b91b94c25c9c3660e4af4047a8bacf964783010820dbc91ff8281509379cb3b24c25080d5a01174dd9a049118d5 +a7327fcb3710ed3273b048650bde40a32732ef40a7e58cf7f2f400979c177944c8bc54117ba6c80d5d4260801dddab79 +92b475dc8cb5be4b90c482f122a51bcb3b6c70593817e7e2459c28ea54a7845c50272af38119406eaadb9bcb993368d0 +9645173e9ecefc4f2eae8363504f7c0b81d85f8949a9f8a6c01f2d49e0a0764f4eacecf3e94016dd407fc14494fce9f9 +9215fd8983d7de6ae94d35e6698226fc1454977ae58d42d294be9aad13ac821562ad37d5e7ee5cdfe6e87031d45cd197 +810360a1c9b88a9e36f520ab5a1eb8bed93f52deefbe1312a69225c0a08edb10f87cc43b794aced9c74220cefcc57e7d +ad7e810efd61ed4684aeda9ed8bb02fb9ae4b4b63fda8217d37012b94ff1b91c0087043bfa4e376f961fff030c729f3b +8b07c95c6a06db8738d10bb03ec11b89375c08e77f0cab7e672ce70b2685667ca19c7e1c8b092821d31108ea18dfd4c7 +968825d025ded899ff7c57245250535c732836f7565eab1ae23ee7e513201d413c16e1ba3f5166e7ac6cf74de8ceef4f +908243370c5788200703ade8164943ad5f8c458219186432e74dbc9904a701ea307fd9b94976c866e6c58595fd891c4b +959969d16680bc535cdc6339e6186355d0d6c0d53d7bbfb411641b9bf4b770fd5f575beef5deec5c4fa4d192d455c350 +ad177f4f826a961adeac76da40e2d930748effff731756c797eddc4e5aa23c91f070fb69b19221748130b0961e68a6bb +82f8462bcc25448ef7e0739425378e9bb8a05e283ce54aae9dbebaf7a3469f57833c9171672ad43a79778366c72a5e37 +a28fb275b1845706c2814d9638573e9bc32ff552ebaed761fe96fdbce70395891ca41c400ae438369264e31a2713b15f +8a9c613996b5e51dadb587a787253d6081ea446bf5c71096980bf6bd3c4b69905062a8e8a3792de2d2ece3b177a71089 +8d5aefef9f60cb27c1db2c649221204dda48bb9bf8bf48f965741da051340e8e4cab88b9d15c69f3f84f4c854709f48a +93ebf2ca6ad85ab6deace6de1a458706285b31877b1b4d7dcb9d126b63047efaf8c06d580115ec9acee30c8a7212fa55 +b3ee46ce189956ca298057fa8223b7fd1128cf52f39159a58bca03c71dd25161ac13f1472301f72aef3e1993fe1ab269 +a24d7a8d066504fc3f5027ccb13120e2f22896860e02c45b5eba1dbd512d6a17c28f39155ea581619f9d33db43a96f92 +ae9ceacbfe12137db2c1a271e1b34b8f92e4816bad1b3b9b6feecc34df0f8b3b0f7ed0133acdf59c537d43d33fc8d429 +83967e69bf2b361f86361bd705dce0e1ad26df06da6c52b48176fe8dfcbeb03c462c1a4c9e649eff8c654b18c876fdef +9148e6b814a7d779c19c31e33a068e97b597de1f8100513db3c581190513edc4d544801ce3dd2cf6b19e0cd6daedd28a +94ccdafc84920d320ed22de1e754adea072935d3c5f8c2d1378ebe53d140ea29853f056fb3fb1e375846061a038cc9bc +afb43348498c38b0fa5f971b8cdd3a62c844f0eb52bc33daf2f67850af0880fce84ecfb96201b308d9e6168a0d443ae3 +86d5736520a83538d4cd058cc4b4e84213ed00ebd6e7af79ae787adc17a92ba5359e28ba6c91936d967b4b28d24c3070 +b5210c1ff212c5b1e9ef9126e08fe120a41e386bb12c22266f7538c6d69c7fd8774f11c02b81fd4e88f9137b020801fe +b78cfd19f94d24e529d0f52e18ce6185cb238edc6bd43086270fd51dd99f664f43dd4c7d2fe506762fbd859028e13fcf +a6e7220598c554abdcc3fdc587b988617b32c7bb0f82c06205467dbedb58276cc07cae317a190f19d19078773f4c2bbb +b88862809487ee430368dccd85a5d72fa4d163ca4aad15c78800e19c1a95be2192719801e315d86cff7795e0544a77e4 +87ecb13a03921296f8c42ceb252d04716f10e09c93962239fcaa0a7fef93f19ab3f2680bc406170108bc583e9ff2e721 +a810cd473832b6581c36ec4cb403f2849357ba2d0b54df98ef3004b8a530c078032922a81d40158f5fb0043d56477f6e +a247b45dd85ca7fbb718b328f30a03f03c84aef2c583fbdc9fcc9eb8b52b34529e8c8f535505c10598b1b4dac3d7c647 +96ee0b91313c68bac4aa9e065ce9e1d77e51ca4cff31d6a438718c58264dee87674bd97fc5c6b8008be709521e4fd008 +837567ad073e42266951a9a54750919280a2ac835a73c158407c3a2b1904cf0d17b7195a393c71a18ad029cbd9cf79ee +a6a469c44b67ebf02196213e7a63ad0423aab9a6e54acc6fcbdbb915bc043586993454dc3cd9e4be8f27d67c1050879b +8712d380a843b08b7b294f1f06e2f11f4ad6bcc655fdde86a4d8bc739c23916f6fad2b902fe47d6212f03607907e9f0e +920adfb644b534789943cdae1bdd6e42828dda1696a440af2f54e6b97f4f97470a1c6ea9fa6a2705d8f04911d055acd1 +a161c73adf584a0061e963b062f59d90faac65c9b3a936b837a10d817f02fcabfa748824607be45a183dd40f991fe83f +874f4ecd408c76e625ea50bc59c53c2d930ee25baf4b4eca2440bfbffb3b8bc294db579caa7c68629f4d9ec24187c1ba +8bff18087f112be7f4aa654e85c71fef70eee8ae480f61d0383ff6f5ab1a0508f966183bb3fc4d6f29cb7ca234aa50d3 +b03b46a3ca3bc743a173cbc008f92ab1aedd7466b35a6d1ca11e894b9482ea9dc75f8d6db2ddd1add99bfbe7657518b7 +8b4f3691403c3a8ad9e097f02d130769628feddfa8c2b3dfe8cff64e2bed7d6e5d192c1e2ba0ac348b8585e94acd5fa1 +a0d9ca4a212301f97591bf65d5ef2b2664766b427c9dd342e23cb468426e6a56be66b1cb41fea1889ac5d11a8e3c50a5 +8c93ed74188ca23b3df29e5396974b9cc135c91fdefdea6c0df694c8116410e93509559af55533a3776ac11b228d69b1 +82dd331fb3f9e344ebdeeb557769b86a2cc8cc38f6c298d7572a33aea87c261afa9dbd898989139b9fc16bc1e880a099 +a65faedf326bcfd8ef98a51410c78b021d39206704e8291cd1f09e096a66b9b0486be65ff185ca224c45918ac337ddeb +a188b37d363ac072a766fd5d6fa27df07363feff1342217b19e3c37385e42ffde55e4be8355aceaa2f267b6d66b4ac41 +810fa3ba3e96d843e3bafd3f2995727f223d3567c8ba77d684c993ba1773c66551eb5009897c51b3fe9b37196984f5ec +87631537541852da323b4353af45a164f68b304d24c01183bf271782e11687f3fcf528394e1566c2a26cb527b3148e64 +b721cb2b37b3c477a48e3cc0044167d51ff568a5fd2fb606e5aec7a267000f1ddc07d3db919926ae12761a8e017c767c +904dfad4ba2cc1f6e60d1b708438a70b1743b400164cd981f13c064b8328d5973987d4fb9cf894068f29d3deaf624dfb +a70491538893552c20939fae6be2f07bfa84d97e2534a6bbcc0f1729246b831103505e9f60e97a8fa7d2e6c1c2384579 +8726cf1b26b41f443ff7485adcfddc39ace2e62f4d65dd0bb927d933e262b66f1a9b367ded5fbdd6f3b0932553ac1735 +ae8a11cfdf7aa54c08f80cb645e3339187ab3886babe9fae5239ba507bb3dd1c0d161ca474a2df081dcd3d63e8fe445e +92328719e97ce60e56110f30a00ac5d9c7a2baaf5f8d22355d53c1c77941e3a1fec7d1405e6fbf8959665fe2ba7a8cad +8d9d6255b65798d0018a8cccb0b6343efd41dc14ff2058d3eed9451ceaad681e4a0fa6af67b0a04318aa628024e5553d +b70209090055459296006742d946a513f0cba6d83a05249ee8e7a51052b29c0ca9722dc4af5f9816a1b7938a5dac7f79 +aab7b766b9bf91786dfa801fcef6d575dc6f12b77ecc662eb4498f0312e54d0de9ea820e61508fc8aeee5ab5db529349 +a8104b462337748b7f086a135d0c3f87f8e51b7165ca6611264b8fb639d9a2f519926cb311fa2055b5fadf03da70c678 +b0d2460747d5d8b30fc6c6bd0a87cb343ddb05d90a51b465e8f67d499cfc5e3a9e365da05ae233bbee792cdf90ec67d5 +aa55f5bf3815266b4a149f85ed18e451c93de9163575e3ec75dd610381cc0805bb0a4d7c4af5b1f94d10231255436d2c +8d4c6a1944ff94426151909eb5b99cfd92167b967dabe2bf3aa66bb3c26c449c13097de881b2cfc1bf052862c1ef7b03 +8862296162451b9b6b77f03bf32e6df71325e8d7485cf3335d66fd48b74c2a8334c241db8263033724f26269ad95b395 +901aa96deb26cda5d9321190ae6624d357a41729d72ef1abfd71bebf6139af6d690798daba53b7bc5923462115ff748a +96c195ec4992728a1eb38cdde42d89a7bce150db43adbc9e61e279ea839e538deec71326b618dd39c50d589f78fc0614 +b6ff8b8aa0837b99a1a8b46fb37f20ad4aecc6a98381b1308697829a59b8442ffc748637a88cb30c9b1f0f28a926c4f6 +8d807e3dca9e7bef277db1d2cfb372408dd587364e8048b304eff00eacde2c723bfc84be9b98553f83cba5c7b3cba248 +8800c96adb0195c4fc5b24511450dee503c32bf47044f5e2e25bd6651f514d79a2dd9b01cd8c09f3c9d3859338490f57 +89fe366096097e38ec28dd1148887112efa5306cc0c3da09562aafa56f4eb000bf46ff79bf0bdd270cbde6bf0e1c8957 +af409a90c2776e1e7e3760b2042507b8709e943424606e31e791d42f17873a2710797f5baaab4cc4a19998ef648556b0 +8d761863c9b6edbd232d35ab853d944f5c950c2b643f84a1a1327ebb947290800710ff01dcfa26dc8e9828481240e8b1 +90b95e9be1e55c463ed857c4e0617d6dc3674e99b6aa62ed33c8e79d6dfcf7d122f4f4cc2ee3e7c5a49170cb617d2e2e +b3ff381efefabc4db38cc4727432e0301949ae4f16f8d1dea9b4f4de611cf5a36d84290a0bef160dac4e1955e516b3b0 +a8a84564b56a9003adcadb3565dc512239fc79572762cda7b5901a255bc82656bb9c01212ad33d6bef4fbbce18dacc87 +90a081890364b222eef54bf0075417f85e340d2fec8b7375995f598aeb33f26b44143ebf56fca7d8b4ebb36b5747b0eb +ade6ee49e1293224ddf2d8ab7f14bb5be6bc6284f60fd5b3a1e0cf147b73cff57cf19763b8a36c5083badc79c606b103 +b2fa99806dd2fa3de09320b615a2570c416c9bcdb052e592b0aead748bbe407ec9475a3d932ae48b71c2627eb81986a6 +91f3b7b73c8ccc9392542711c45fe6f236057e6efad587d661ad5cb4d6e88265f86b807bb1151736b1009ab74fd7acb4 +8800e2a46af96696dfbdcbf2ca2918b3dcf28ad970170d2d1783b52b8d945a9167d052beeb55f56c126da7ffa7059baa +9862267a1311c385956b977c9aa08548c28d758d7ba82d43dbc3d0a0fd1b7a221d39e8399997fea9014ac509ff510ac4 +b7d24f78886fd3e2d283e18d9ad5a25c1a904e7d9b9104bf47da469d74f34162e27e531380dbbe0a9d051e6ffd51d6e7 +b0f445f9d143e28b9df36b0f2c052da87ee2ca374d9d0fbe2eff66ca6fe5fe0d2c1951b428d58f7314b7e74e45d445ea +b63fc4083eabb8437dafeb6a904120691dcb53ce2938b820bb553da0e1eecd476f72495aacb72600cf9cad18698fd3db +b9ffd8108eaebd582d665f8690fe8bb207fd85185e6dd9f0b355a09bac1bbff26e0fdb172bc0498df025414e88fe2eda +967ed453e1f1a4c5b7b6834cc9f75c13f6889edc0cc91dc445727e9f408487bbf05c337103f61397a10011dfbe25d61d +98ceb673aff36e1987d5521a3984a07079c3c6155974bb8b413e8ae1ce84095fe4f7862fba7aefa14753eb26f2a5805f +85f01d28603a8fdf6ce6a50cb5c44f8a36b95b91302e3f4cd95c108ce8f4d212e73aec1b8d936520d9226802a2bd9136 +88118e9703200ca07910345fbb789e7a8f92bd80bbc79f0a9e040e8767d33df39f6eded403a9b636eabf9101e588482a +90833a51eef1b10ed74e8f9bbd6197e29c5292e469c854eed10b0da663e2bceb92539710b1858bbb21887bd538d28d89 +b513b905ec19191167c6193067b5cfdf5a3d3828375360df1c7e2ced5815437dfd37f0c4c8f009d7fb29ff3c8793f560 +b1b6d405d2d18f9554b8a358cc7e2d78a3b34269737d561992c8de83392ac9a2857be4bf15de5a6c74e0c9d0f31f393c +b828bd3e452b797323b798186607849f85d1fb20c616833c0619360dfd6b3e3aa000fd09dafe4b62d74abc41072ff1a9 +8efde67d0cca56bb2c464731879c9ac46a52e75bac702a63200a5e192b4f81c641f855ca6747752b84fe469cb7113b6c +b2762ba1c89ac3c9a983c242e4d1c2610ff0528585ed5c0dfc8a2c0253551142af9b59f43158e8915a1da7cc26b9df67 +8a3f1157fb820d1497ef6b25cd70b7e16bb8b961b0063ad340d82a79ee76eb2359ca9e15e6d42987ed7f154f5eeaa2da +a75e29f29d38f09c879f971c11beb5368affa084313474a5ecafa2896180b9e47ea1995c2733ec46f421e395a1d9cffe +8e8c3dd3e7196ef0b4996b531ec79e4a1f211db5d5635e48ceb80ff7568b2ff587e845f97ee703bb23a60945ad64314a +8e7f32f4a3e3c584af5e3d406924a0aa34024c42eca74ef6cc2a358fd3c9efaf25f1c03aa1e66bb94b023a2ee2a1cace +ab7dce05d59c10a84feb524fcb62478906b3fa045135b23afbede3bb32e0c678d8ebe59feabccb5c8f3550ea76cae44b +b38bb4b44d827f6fd3bd34e31f9186c59e312dbfadd4a7a88e588da10146a78b1f8716c91ad8b806beb8da65cab80c4c +9490ce9442bbbd05438c7f5c4dea789f74a7e92b1886a730544b55ba377840740a3ae4f2f146ee73f47c9278b0e233bc +83c003fab22a7178eed1a668e0f65d4fe38ef3900044e9ec63070c23f2827d36a1e73e5c2b883ec6a2afe2450171b3b3 +9982f02405978ddc4fca9063ebbdb152f524c84e79398955e66fe51bc7c1660ec1afc3a86ec49f58d7b7dde03505731c +ab337bd83ccdd2322088ffa8d005f450ced6b35790f37ab4534313315ee84312adc25e99cce052863a8bedee991729ed +8312ce4bec94366d88f16127a17419ef64285cd5bf9e5eda010319b48085966ed1252ed2f5a9fd3e0259b91bb65f1827 +a60d5a6327c4041b0c00a1aa2f0af056520f83c9ce9d9ccd03a0bd4d9e6a1511f26a422ea86bd858a1f77438adf07e6c +b84a0a0b030bdad83cf5202aa9afe58c9820e52483ab41f835f8c582c129ee3f34aa096d11c1cd922eda02ea1196a882 +8077d105317f4a8a8f1aadeb05e0722bb55f11abcb490c36c0904401107eb3372875b0ac233144829e734f0c538d8c1d +9202503bd29a6ec198823a1e4e098f9cfe359ed51eb5174d1ca41368821bfeebcbd49debfd02952c41359d1c7c06d2b1 +abc28c155e09365cb77ffead8dc8f602335ef93b2f44e4ef767ce8fc8ef9dd707400f3a722e92776c2e0b40192c06354 +b0f6d1442533ca45c9399e0a63a11f85ff288d242cea6cb3b68c02e77bd7d158047cae2d25b3bcd9606f8f66d9b32855 +b01c3d56a0db84dc94575f4b6ee2de4beca3230e86bed63e2066beb22768b0a8efb08ebaf8ac3dedb5fe46708b084807 +8c8634b0432159f66feaabb165842d1c8ac378f79565b1b90c381aa8450eb4231c3dad11ec9317b9fc2b155c3a771e32 +8e67f623d69ecd430c9ee0888520b6038f13a2b6140525b056dc0951f0cfed2822e62cf11d952a483107c5c5acac4826 +9590bb1cba816dd6acd5ac5fba5142c0a19d53573e422c74005e0bcf34993a8138c83124cad35a3df65879dba6134edd +801cd96cde0749021a253027118d3ea135f3fcdbe895db08a6c145641f95ebd368dd6a1568d995e1d0084146aebe224a +848b5d196427f6fc1f762ee3d36e832b64a76ec1033cfedc8b985dea93932a7892b8ef1035c653fb9dcd9ab2d9a44ac8 +a1017eb83d5c4e2477e7bd2241b2b98c4951a3b391081cae7d75965cadc1acaec755cf350f1f3d29741b0828e36fedea +8d6d2785e30f3c29aad17bd677914a752f831e96d46caf54446d967cb2432be2c849e26f0d193a60bee161ea5c6fe90a +935c0ba4290d4595428e034b5c8001cbd400040d89ab00861108e8f8f4af4258e41f34a7e6b93b04bc253d3b9ffc13bf +aac02257146246998477921cef2e9892228590d323b839f3e64ea893b991b463bc2f47e1e5092ddb47e70b2f5bce7622 +b921fde9412970a5d4c9a908ae8ce65861d06c7679af577cf0ad0d5344c421166986bee471fd6a6cecb7d591f06ec985 +8ef4c37487b139d6756003060600bb6ebac7ea810b9c4364fc978e842f13ac196d1264fbe5af60d76ff6d9203d8e7d3f +94b65e14022b5cf6a9b95f94be5ace2711957c96f4211c3f7bb36206bd39cfbd0ea82186cab5ad0577a23214a5c86e9e +a31c166d2a2ca1d5a75a5920fef7532681f62191a50d8555fdaa63ba4581c3391cc94a536fc09aac89f64eafceec3f90 +919a8cc128de01e9e10f5d83b08b52293fdd41bde2b5ae070f3d95842d4a16e5331cf2f3d61c765570c8022403610fa4 +b23d6f8331eef100152d60483cfa14232a85ee712c8538c9b6417a5a7c5b353c2ac401390c6c215cb101f5cee6b5f43e +ab357160c08a18319510a571eafff154298ce1020de8e1dc6138a09fcb0fcbcdd8359f7e9386bda00b7b9cdea745ffdc +ab55079aea34afa5c0bd1124b9cdfe01f325b402fdfa017301bf87812eaa811ea5798c3aaf818074d420d1c782b10ada +ade616010dc5009e7fc4f8d8b00dc716686a5fa0a7816ad9e503e15839d3b909b69d9dd929b7575376434ffec0d2bea8 +863997b97ed46898a8a014599508fa3079f414b1f4a0c4fdc6d74ae8b444afa350f327f8bfc2a85d27f9e2d049c50135 +8d602ff596334efd4925549ed95f2aa762b0629189f0df6dbb162581657cf3ea6863cd2287b4d9c8ad52813d87fcd235 +b70f68c596dcdeed92ad5c6c348578b26862a51eb5364237b1221e840c47a8702f0fbc56eb520a22c0eed99795d3903e +9628088f8e0853cefadee305a8bf47fa990c50fa96a82511bbe6e5dc81ef4b794e7918a109070f92fc8384d77ace226f +97e26a46e068b605ce96007197ecd943c9a23881862f4797a12a3e96ba2b8d07806ad9e2a0646796b1889c6b7d75188c +b1edf467c068cc163e2d6413cc22b16751e78b3312fe47b7ea82b08a1206d64415b2c8f2a677fa89171e82cc49797150 +a44d15ef18745b251429703e3cab188420e2d974de07251501799b016617f9630643fcd06f895634d8ecdd579e1bf000 +abd126df3917ba48c618ee4dbdf87df506193462f792874439043fa1b844466f6f4e0ff2e42516e63b5b23c0892b2695 +a2a67f57c4aa3c2aa1eeddbfd5009a89c26c2ce8fa3c96a64626aba19514beb125f27df8559506f737de3eae0f1fc18f +a633e0132197e6038197304b296ab171f1d8e0d0f34dcf66fe9146ac385b0239232a8470b9205a4802ab432389f4836d +a914b3a28509a906c3821463b936455d58ff45dcbe158922f9efb2037f2eb0ce8e92532d29b5d5a3fcd0d23fa773f272 +a0e1412ce4505daf1a2e59ce4f0fc0e0023e335b50d2b204422f57cd65744cc7a8ed35d5ef131a42c70b27111d3115b7 +a2339e2f2b6072e88816224fdd612c04d64e7967a492b9f8829db15367f565745325d361fd0607b0def1be384d010d9e +a7309fc41203cb99382e8193a1dcf03ac190a7ce04835304eb7e341d78634e83ea47cb15b885601956736d04cdfcaa01 +81f3ccd6c7f5b39e4e873365f8c37b214e8ab122d04a606fbb7339dc3298c427e922ec7418002561d4106505b5c399ee +92c121cf914ca549130e352eb297872a63200e99b148d88fbc9506ad882bec9d0203d65f280fb5b0ba92e336b7f932e8 +a4b330cf3f064f5b131578626ad7043ce2a433b6f175feb0b52d36134a454ca219373fd30d5e5796410e005b69082e47 +86fe5774112403ad83f9c55d58317eeb17ad8e1176d9f2f69c2afb7ed83bc718ed4e0245ceab4b377f5f062dcd4c00e7 +809d152a7e2654c7fd175b57f7928365a521be92e1ed06c05188a95864ddb25f7cab4c71db7d61bbf4cae46f3a1d96ce +b82d663e55c2a5ada7e169e9b1a87bc1c0177baf1ec1c96559b4cb1c5214ce1ddf2ab8d345014cab6402f3774235cf5a +86580af86df1bd2c385adb8f9a079e925981b7184db66fc5fe5b14cddb82e7d836b06eaeef14924ac529487b23dae111 +b5f5f4c5c94944ecc804df6ab8687d64e27d988cbfeae1ba7394e0f6adbf778c5881ead7cd8082dd7d68542b9bb4ecd5 +a6016916146c2685c46e8fdd24186394e2d5496e77e08c0c6a709d4cd7dfa97f1efcef94922b89196819076a91ad37b5 +b778e7367ded3b6eab53d5fc257f7a87e8faf74a593900f2f517220add2125be3f6142022660d8181df8d164ad9441ce +8581b2d36abe6f553add4d24be761bec1b8efaa2929519114346615380b3c55b59e6ad86990e312f7e234d0203bdf59b +9917e74fd45c3f71a829ff5498a7f6b5599b48c098dda2339bf04352bfc7f368ccf1a407f5835901240e76452ae807d7 +afd196ce6f9335069138fd2e3d133134da253978b4ce373152c0f26affe77a336505787594022e610f8feb722f7cc1fb +a477491a1562e329764645e8f24d8e228e5ef28c9f74c6b5b3abc4b6a562c15ffb0f680d372aed04d9e1bf944dece7be +9767440d58c57d3077319d3a330e5322b9ba16981ec74a5a14d53462eab59ae7fd2b14025bfc63b268862094acb444e6 +80986d921be3513ef69264423f351a61cb48390c1be8673aee0f089076086aaebea7ebe268fd0aa7182695606116f679 +a9554c5c921c07b450ee04e34ec58e054ac1541b26ce2ce5a393367a97348ba0089f53db6660ad76b60278b66fd12e3e +95097e7d2999b3e84bf052c775581cf361325325f4a50192521d8f4693c830bed667d88f482dc1e3f833aa2bd22d2cbf +9014c91d0f85aefd28436b5228c12f6353c055a9326c7efbf5e071e089e2ee7c070fcbc84c5fafc336cbb8fa6fec1ca1 +90f57ba36ee1066b55d37384942d8b57ae00f3cf9a3c1d6a3dfee1d1af42d4b5fa9baeb0cd7e46687d1d6d090ddb931d +8e4b1db12fd760a17214c9e47f1fce6e43c0dbb4589a827a13ac61aaae93759345697bb438a00edab92e0b7b62414683 +8022a959a513cdc0e9c705e0fc04eafd05ff37c867ae0f31f6d01cddd5df86138a426cab2ff0ac8ff03a62e20f7e8f51 +914e9a38829834c7360443b8ed86137e6f936389488eccf05b4b4db7c9425611705076ecb3f27105d24b85c852be7511 +957fb10783e2bd0db1ba66b18e794df710bc3b2b05776be146fa5863c15b1ebdd39747b1a95d9564e1772cdfc4f37b8a +b6307028444daed8ed785ac9d0de76bc3fe23ff2cc7e48102553613bbfb5afe0ebe45e4212a27021c8eb870721e62a1f +8f76143597777d940b15a01b39c5e1b045464d146d9a30a6abe8b5d3907250e6c7f858ff2308f8591e8b0a7b3f3c568a +96163138ac0ce5fd00ae9a289648fd9300a0ca0f63a88481d703ecd281c06a52a3b5178e849e331f9c85ca4ba398f4cc +a63ef47c3e18245b0482596a09f488a716df3cbd0f9e5cfabed0d742843e65db8961c556f45f49762f3a6ac8b627b3ef +8cb595466552e7c4d42909f232d4063e0a663a8ef6f6c9b7ce3a0542b2459cde04e0e54c7623d404acb5b82775ac04f6 +b47fe69960eb45f399368807cff16d941a5a4ebad1f5ec46e3dc8a2e4d598a7e6114d8f0ca791e9720fd786070524e2b +89eb5ff83eea9df490e5beca1a1fbbbbcf7184a37e2c8c91ede7a1e654c81e8cd41eceece4042ea7918a4f4646b67fd6 +a84f5d155ed08b9054eecb15f689ba81e44589e6e7207a99790c598962837ca99ec12344105b16641ca91165672f7153 +a6cc8f25c2d5b2d2f220ec359e6a37a52b95fa6af6e173c65e7cd55299eff4aa9e6d9e6f2769e6459313f1f2aecb0fab +afcde944411f017a9f7979755294981e941cc41f03df5e10522ef7c7505e5f1babdd67b3bf5258e8623150062eb41d9b +8fab39f39c0f40182fcd996ade2012643fe7731808afbc53f9b26900b4d4d1f0f5312d9d40b3df8baa4739970a49c732 +ae193af9726da0ebe7df1f9ee1c4846a5b2a7621403baf8e66c66b60f523e719c30c6b4f897bb14b27d3ff3da8392eeb +8ac5adb82d852eba255764029f42e6da92dcdd0e224d387d1ef94174038db9709ac558d90d7e7c57ad4ce7f89bbfc38c +a2066b3458fdf678ee487a55dd5bfb74fde03b54620cb0e25412a89ee28ad0d685e309a51e3e4694be2fa6f1593a344c +88d031745dd0ae07d61a15b594be5d4b2e2a29e715d081649ad63605e3404b0c3a5353f0fd9fad9c05c18e93ce674fa1 +8283cfb0ef743a043f2b77ecaeba3005e2ca50435585b5dd24777ee6bce12332f85e21b446b536da38508807f0f07563 +b376de22d5f6b0af0b59f7d9764561f4244cf8ffe22890ecd3dcf2ff1832130c9b821e068c9d8773136f4796721e5963 +ae3afc50c764f406353965363840bf28ee85e7064eb9d5f0bb3c31c64ab10f48c853e942ee2c9b51bae59651eaa08c2f +948b204d103917461a01a6c57a88f2d66b476eae5b00be20ec8c747650e864bc8a83aee0aff59cb7584b7a3387e0ee48 +81ab098a082b07f896c5ffd1e4446cb7fb44804cbbf38d125208b233fc82f8ec9a6a8d8dd1c9a1162dc28ffeec0dde50 +a149c6f1312821ced2969268789a3151bdda213451760b397139a028da609c4134ac083169feb0ee423a0acafd10eceb +b0ac9e27a5dadaf523010f730b28f0ebac01f460d3bbbe277dc9d44218abb5686f4fac89ae462682fef9edbba663520a +8d0e0073cca273daaaa61b6fc54bfe5a009bc3e20ae820f6c93ba77b19eca517d457e948a2de5e77678e4241807157cb +ad61d3a2edf7c7533a04964b97499503fd8374ca64286dba80465e68fe932e96749b476f458c6fc57cb1a7ca85764d11 +90eb5e121ae46bc01a30881eaa556f46bd8457a4e80787cf634aab355082de34ac57d7f497446468225f7721e68e2a47 +8cdac557de7c42d1f3780e33dec1b81889f6352279be81c65566cdd4952d4c15d79e656cbd46035ab090b385e90245ef +82b67e61b88b84f4f4d4f65df37b3e3dcf8ec91ea1b5c008fdccd52da643adbe6468a1cfdb999e87d195afe2883a3b46 +8503b467e8f5d6048a4a9b78496c58493a462852cab54a70594ae3fd064cfd0deb4b8f336a262155d9fedcaa67d2f6fd +8db56c5ac763a57b6ce6832930c57117058e3e5a81532b7d19346346205e2ec614eb1a2ee836ef621de50a7bc9b7f040 +ad344699198f3c6e8c0a3470f92aaffc805b76266734414c298e10b5b3797ca53578de7ccb2f458f5e0448203f55282b +80602032c43c9e2a09154cc88b83238343b7a139f566d64cb482d87436b288a98f1ea244fd3bff8da3c398686a900c14 +a6385bd50ecd548cfb37174cdbb89e10025b5cadaf3cff164c95d7aef5a33e3d6a9bf0c681b9e11db9ef54ebeee2a0c1 +abf2d95f4aa34b0581eb9257a0cc8462b2213941a5deb8ba014283293e8b36613951b61261cc67bbd09526a54cbbff76 +a3d5de52f48df72c289ff713e445991f142390798cd42bd9d9dbefaee4af4f5faf09042d126b975cf6b98711c3072553 +8e627302ff3d686cff8872a1b7c2a57b35f45bf2fc9aa42b049d8b4d6996a662b8e7cbac6597f0cb79b0cc4e29fbf133 +8510702e101b39a1efbf4e504e6123540c34b5689645e70d0bac1ecc1baf47d86c05cef6c4317a4e99b4edaeb53f2d00 +aa173f0ecbcc6088f878f8726d317748c81ebf501bba461f163b55d66099b191ec7c55f7702f351a9c8eb42cfa3280e2 +b560a697eafab695bcef1416648a0a664a71e311ecbe5823ae903bd0ed2057b9d7574b9a86d3fe22aa3e6ddce38ea513 +8df6304a3d9cf40100f3f687575419c998cd77e5cc27d579cf4f8e98642de3609af384a0337d145dd7c5635172d26a71 +8105c7f3e4d30a29151849673853b457c1885c186c132d0a98e63096c3774bc9deb956cf957367e633d0913680bda307 +95373fc22c0917c3c2044ac688c4f29a63ed858a45c0d6d2d0fe97afd6f532dcb648670594290c1c89010ecc69259bef +8c2fae9bcadab341f49b55230310df93cac46be42d4caa0d42e45104148a91e527af1b4209c0d972448162aed28fab64 +b05a77baab70683f76209626eaefdda2d36a0b66c780a20142d23c55bd479ddd4ad95b24579384b6cf62c8eb4c92d021 +8e6bc6a7ea2755b4aaa19c1c1dee93811fcde514f03485fdc3252f0ab7f032c315614f6336e57cea25dcfb8fb6084eeb +b656a27d06aade55eadae2ad2a1059198918ea6cc3fd22c0ed881294d34d5ac7b5e4700cc24350e27d76646263b223aa +a296469f24f6f56da92d713afcd4dd606e7da1f79dc4e434593c53695847eefc81c7c446486c4b3b8c8d00c90c166f14 +87a326f57713ac2c9dffeb3af44b9f3c613a8f952676fc46343299122b47ee0f8d792abaa4b5db6451ced5dd153aabd0 +b689e554ba9293b9c1f6344a3c8fcb6951d9f9eac4a2e2df13de021aade7c186be27500e81388e5b8bcab4c80f220a31 +87ae0aa0aa48eac53d1ca5a7b93917de12db9e40ceabf8fdb40884ae771cfdf095411deef7c9f821af0b7070454a2608 +a71ffa7eae8ace94e6c3581d4cb2ad25d48cbd27edc9ec45baa2c8eb932a4773c3272b2ffaf077b40f76942a1f3af7f2 +94c218c91a9b73da6b7a495b3728f3028df8ad9133312fc0c03e8c5253b7ccb83ed14688fd4602e2fd41f29a0bc698bd +ae1e77b90ca33728af07a4c03fb2ef71cd92e2618e7bf8ed4d785ce90097fc4866c29999eb84a6cf1819d75285a03af2 +b7a5945b277dab9993cf761e838b0ac6eaa903d7111fca79f9fde3d4285af7a89bf6634a71909d095d7619d913972c9c +8c43b37be02f39b22029b20aca31bff661abce4471dca88aa3bddefd9c92304a088b2dfc8c4795acc301ca3160656af2 +b32e5d0fba024554bd5fe8a793ebe8003335ddd7f585876df2048dcf759a01285fecb53daae4950ba57f3a282a4d8495 +85ea7fd5e10c7b659df5289b2978b2c89e244f269e061b9a15fcab7983fc1962b63546e82d5731c97ec74b6804be63ef +96b89f39181141a7e32986ac02d7586088c5a9662cec39843f397f3178714d02f929af70630c12cbaba0268f8ba2d4fa +929ab1a2a009b1eb37a2817c89696a06426529ebe3f306c586ab717bd34c35a53eca2d7ddcdef36117872db660024af9 +a696dccf439e9ca41511e16bf3042d7ec0e2f86c099e4fc8879d778a5ea79e33aa7ce96b23dc4332b7ba26859d8e674d +a8fe69a678f9a194b8670a41e941f0460f6e2dbc60470ab4d6ae2679cc9c6ce2c3a39df2303bee486dbfde6844e6b31a +95f58f5c82de2f2a927ca99bf63c9fc02e9030c7e46d0bf6b67fe83a448d0ae1c99541b59caf0e1ccab8326231af09a5 +a57badb2c56ca2c45953bd569caf22968f76ed46b9bac389163d6fe22a715c83d5e94ae8759b0e6e8c2f27bff7748f3f +868726fd49963b24acb5333364dffea147e98f33aa19c7919dc9aca0fd26661cfaded74ede7418a5fadbe7f5ae67b67b +a8d8550dcc64d9f1dd7bcdab236c4122f2b65ea404bb483256d712c7518f08bb028ff8801f1da6aed6cbfc5c7062e33b +97e25a87dae23155809476232178538d4bc05d4ff0882916eb29ae515f2a62bfce73083466cc0010ca956aca200aeacc +b4ea26be3f4bd04aa82d7c4b0913b97bcdf5e88b76c57eb1a336cbd0a3eb29de751e1bc47c0e8258adec3f17426d0c71 +99ee555a4d9b3cf2eb420b2af8e3bc99046880536116d0ce7193464ac40685ef14e0e3c442f604e32f8338cb0ef92558 +8c64efa1da63cd08f319103c5c7a761221080e74227bbc58b8fb35d08aa42078810d7af3e60446cbaff160c319535648 +8d9fd88040076c28420e3395cbdfea402e4077a3808a97b7939d49ecbcf1418fe50a0460e1c1b22ac3f6e7771d65169a +ae3c19882d7a9875d439265a0c7003c8d410367627d21575a864b9cb4918de7dbdb58a364af40c5e045f3df40f95d337 +b4f7bfacab7b2cafe393f1322d6dcc6f21ffe69cd31edc8db18c06f1a2b512c27bd0618091fd207ba8df1808e9d45914 +94f134acd0007c623fb7934bcb65ef853313eb283a889a3ffa79a37a5c8f3665f3d5b4876bc66223610c21dc9b919d37 +aa15f74051171daacdc1f1093d3f8e2d13da2833624b80a934afec86fc02208b8f55d24b7d66076444e7633f46375c6a +a32d6bb47ef9c836d9d2371807bafbbbbb1ae719530c19d6013f1d1f813c49a60e4fa51d83693586cba3a840b23c0404 +b61b3599145ea8680011aa2366dc511a358b7d67672d5b0c5be6db03b0efb8ca5a8294cf220ea7409621f1664e00e631 +859cafc3ee90b7ececa1ed8ef2b2fc17567126ff10ca712d5ffdd16aa411a5a7d8d32c9cab1fbf63e87dce1c6e2f5f53 +a2fef1b0b2874387010e9ae425f3a9676d01a095d017493648bcdf3b31304b087ccddb5cf76abc4e1548b88919663b6b +939e18c73befc1ba2932a65ede34c70e4b91e74cc2129d57ace43ed2b3af2a9cc22a40fbf50d79a63681b6d98852866d +b3b4259d37b1b14aee5b676c9a0dd2d7f679ab95c120cb5f09f9fbf10b0a920cb613655ddb7b9e2ba5af4a221f31303c +997255fe51aaca6e5a9cb3359bcbf25b2bb9e30649bbd53a8a7c556df07e441c4e27328b38934f09c09d9500b5fabf66 +abb91be2a2d860fd662ed4f1c6edeefd4da8dc10e79251cf87f06029906e7f0be9b486462718f0525d5e049472692cb7 +b2398e593bf340a15f7801e1d1fbda69d93f2a32a889ec7c6ae5e8a37567ac3e5227213c1392ee86cfb3b56ec2787839 +8ddf10ccdd72922bed36829a36073a460c2118fc7a56ff9c1ac72581c799b15c762cb56cb78e3d118bb9f6a7e56cb25e +93e6bc0a4708d16387cacd44cf59363b994dc67d7ada7b6d6dbd831c606d975247541b42b2a309f814c1bfe205681fc6 +b93fc35c05998cffda2978e12e75812122831523041f10d52f810d34ff71944979054b04de0117e81ddf5b0b4b3e13c0 +92221631c44d60d68c6bc7b287509f37ee44cbe5fdb6935cee36b58b17c7325098f98f7910d2c3ca5dc885ad1d6dabc7 +a230124424a57fad3b1671f404a94d7c05f4c67b7a8fbacfccea28887b78d7c1ed40b92a58348e4d61328891cd2f6cee +a6a230edb8518a0f49d7231bc3e0bceb5c2ac427f045819f8584ba6f3ae3d63ed107a9a62aad543d7e1fcf1f20605706 +845be1fe94223c7f1f97d74c49d682472585d8f772762baad8a9d341d9c3015534cc83d102113c51a9dea2ab10d8d27b +b44262515e34f2db597c8128c7614d33858740310a49cdbdf9c8677c5343884b42c1292759f55b8b4abc4c86e4728033 +805592e4a3cd07c1844bc23783408310accfdb769cca882ad4d07d608e590a288b7370c2cb327f5336e72b7083a0e30f +95153e8b1140df34ee864f4ca601cb873cdd3efa634af0c4093fbaede36f51b55571ab271e6a133020cd34db8411241f +82878c1285cfa5ea1d32175c9401f3cc99f6bb224d622d3fd98cc7b0a27372f13f7ab463ce3a33ec96f9be38dbe2dfe3 +b7588748f55783077c27fc47d33e20c5c0f5a53fc0ac10194c003aa09b9f055d08ec971effa4b7f760553997a56967b3 +b36b4de6d1883b6951f59cfae381581f9c6352fcfcf1524fccdab1571a20f80441d9152dc6b48bcbbf00371337ca0bd5 +89c5523f2574e1c340a955cbed9c2f7b5fbceb260cb1133160dabb7d41c2f613ec3f6e74bbfab3c4a0a6f0626dbe068f +a52f58cc39f968a9813b1a8ddc4e83f4219e4dd82c7aa1dd083bea7edf967151d635aa9597457f879771759b876774e4 +8300a67c2e2e123f89704abfde095463045dbd97e20d4c1157bab35e9e1d3d18f1f4aaba9cbe6aa2d544e92578eaa1b6 +ac6a7f2918768eb6a43df9d3a8a04f8f72ee52f2e91c064c1c7d75cad1a3e83e5aba9fe55bb94f818099ac91ccf2e961 +8d64a2b0991cf164e29835c8ddef6069993a71ec2a7de8157bbfa2e00f6367be646ed74cbaf524f0e9fe13fb09fa15fd +8b2ffe5a545f9f680b49d0a9797a4a11700a2e2e348c34a7a985fc278f0f12def6e06710f40f9d48e4b7fbb71e072229 +8ab8f71cd337fa19178924e961958653abf7a598e3f022138b55c228440a2bac4176cea3aea393549c03cd38a13eb3fc +8419d28318c19ea4a179b7abb43669fe96347426ef3ac06b158d79c0acf777a09e8e770c2fb10e14b3a0421705990b23 +8bacdac310e1e49660359d0a7a17fe3d334eb820e61ae25e84cb52f863a2f74cbe89c2e9fc3283745d93a99b79132354 +b57ace3fa2b9f6b2db60c0d861ace7d7e657c5d35d992588aeed588c6ce3a80b6f0d49f8a26607f0b17167ab21b675e4 +83e265cde477f2ecc164f49ddc7fb255bb05ff6adc347408353b7336dc3a14fdedc86d5a7fb23f36b8423248a7a67ed1 +a60ada971f9f2d79d436de5d3d045f5ab05308cae3098acaf5521115134b2a40d664828bb89895840db7f7fb499edbc5 +a63eea12efd89b62d3952bf0542a73890b104dd1d7ff360d4755ebfa148fd62de668edac9eeb20507967ea37fb220202 +a0275767a270289adc991cc4571eff205b58ad6d3e93778ddbf95b75146d82517e8921bd0d0564e5b75fa0ccdab8e624 +b9b03fd3bf07201ba3a039176a965d736b4ef7912dd9e9bf69fe1b57c330a6aa170e5521fe8be62505f3af81b41d7806 +a95f640e26fb1106ced1729d6053e41a16e4896acac54992279ff873e5a969aad1dcfa10311e28b8f409ac1dab7f03bb +b144778921742418053cb3c70516c63162c187f00db2062193bb2c14031075dbe055d020cde761b26e8c58d0ea6df2c1 +8432fbb799e0435ef428d4fefc309a05dd589bce74d7a87faf659823e8c9ed51d3e42603d878e80f439a38be4321c2fa +b08ddef14e42d4fd5d8bf39feb7485848f0060d43b51ed5bdda39c05fe154fb111d29719ee61a23c392141358c0cfcff +8ae3c5329a5e025b86b5370e06f5e61177df4bda075856fade20a17bfef79c92f54ed495f310130021ba94fb7c33632b +92b6d3c9444100b4d7391febfc1dddaa224651677c3695c47a289a40d7a96d200b83b64e6d9df51f534564f272a2c6c6 +b432bc2a3f93d28b5e506d68527f1efeb2e2570f6be0794576e2a6ef9138926fdad8dd2eabfa979b79ab7266370e86bc +8bc315eacedbcfc462ece66a29662ca3dcd451f83de5c7626ef8712c196208fb3d8a0faf80b2e80384f0dd9772f61a23 +a72375b797283f0f4266dec188678e2b2c060dfed5880fc6bb0c996b06e91a5343ea2b695adaab0a6fd183b040b46b56 +a43445036fbaa414621918d6a897d3692fdae7b2961d87e2a03741360e45ebb19fcb1703d23f1e15bb1e2babcafc56ac +b9636b2ffe305e63a1a84bd44fb402442b1799bd5272638287aa87ca548649b23ce8ce7f67be077caed6aa2dbc454b78 +99a30bf0921d854c282b83d438a79f615424f28c2f99d26a05201c93d10378ab2cd94a792b571ddae5d4e0c0013f4006 +8648e3c2f93d70b392443be116b48a863e4b75991bab5db656a4ef3c1e7f645e8d536771dfe4e8d1ceda3be8d32978b0 +ab50dc9e6924c1d2e9d2e335b2d679fc7d1a7632e84964d3bac0c9fe57e85aa5906ec2e7b0399d98ddd022e9b19b5904 +ab729328d98d295f8f3272afaf5d8345ff54d58ff9884da14f17ecbdb7371857fdf2f3ef58080054e9874cc919b46224 +83fa5da7592bd451cad3ad7702b4006332b3aae23beab4c4cb887fa6348317d234bf62a359e665b28818e5410c278a09 +8bdbff566ae9d368f114858ef1f009439b3e9f4649f73efa946e678d6c781d52c69af195df0a68170f5f191b2eac286b +91245e59b4425fd4edb2a61d0d47c1ccc83d3ced8180de34887b9655b5dcda033d48cde0bdc3b7de846d246c053a02e8 +a2cb00721e68f1cad8933947456f07144dc69653f96ceed845bd577d599521ba99cdc02421118971d56d7603ed118cbf +af8cd66d303e808b22ec57860dd909ca64c27ec2c60e26ffecfdc1179d8762ffd2739d87b43959496e9fee4108df71df +9954136812dffcd5d3f167a500e7ab339c15cfc9b3398d83f64b0daa3dd5b9a851204f424a3493b4e326d3de81e50a62 +93252254d12511955f1aa464883ad0da793f84d900fea83e1df8bca0f2f4cf5b5f9acbaec06a24160d33f908ab5fea38 +997cb55c26996586ba436a95566bd535e9c22452ca5d2a0ded2bd175376557fa895f9f4def4519241ff386a063f2e526 +a12c78ad451e0ac911260ade2927a768b50cb4125343025d43474e7f465cdc446e9f52a84609c5e7e87ae6c9b3f56cda +a789d4ca55cbba327086563831b34487d63d0980ba8cf55197c016702ed6da9b102b1f0709ce3da3c53ff925793a3d73 +a5d76acbb76741ce85be0e655b99baa04f7f587347947c0a30d27f8a49ae78cce06e1cde770a8b618d3db402be1c0c4b +873c0366668c8faddb0eb7c86f485718d65f8c4734020f1a18efd5fa123d3ea8a990977fe13592cd01d17e60809cb5ff +b659b71fe70f37573ff7c5970cc095a1dc0da3973979778f80a71a347ef25ad5746b2b9608bad4ab9a4a53a4d7df42d7 +a34cbe05888e5e5f024a2db14cb6dcdc401a9cbd13d73d3c37b348f68688f87c24ca790030b8f84fef9e74b4eab5e412 +94ce8010f85875c045b0f014db93ef5ab9f1f6842e9a5743dce9e4cb872c94affd9e77c1f1d1ab8b8660b52345d9acb9 +adefa9b27a62edc0c5b019ddd3ebf45e4de846165256cf6329331def2e088c5232456d3de470fdce3fa758bfdd387512 +a6b83821ba7c1f83cc9e4529cf4903adb93b26108e3d1f20a753070db072ad5a3689643144bdd9c5ea06bb9a7a515cd0 +a3a9ddedc2a1b183eb1d52de26718151744db6050f86f3580790c51d09226bf05f15111691926151ecdbef683baa992c +a64bac89e7686932cdc5670d07f0b50830e69bfb8c93791c87c7ffa4913f8da881a9d8a8ce8c1a9ce5b6079358c54136 +a77b5a63452cb1320b61ab6c7c2ef9cfbcade5fd4727583751fb2bf3ea330b5ca67757ec1f517bf4d503ec924fe32fbd +8746fd8d8eb99639d8cd0ca34c0d9c3230ed5a312aab1d3d925953a17973ee5aeb66e68667e93caf9cb817c868ea8f3d +88a2462a26558fc1fbd6e31aa8abdc706190a17c27fdc4217ffd2297d1b1f3321016e5c4b2384c5454d5717dc732ed03 +b78893a97e93d730c8201af2e0d3b31cb923d38dc594ffa98a714e627c473d42ea82e0c4d2eeb06862ee22a9b2c54588 +920cc8b5f1297cf215a43f6fc843e379146b4229411c44c0231f6749793d40f07b9af7699fd5d21fd69400b97febe027 +a0f0eafce1e098a6b58c7ad8945e297cd93aaf10bc55e32e2e32503f02e59fc1d5776936577d77c0b1162cb93b88518b +98480ba0064e97a2e7a6c4769b4d8c2a322cfc9a3b2ca2e67e9317e2ce04c6e1108169a20bd97692e1cb1f1423b14908 +83dbbb2fda7e287288011764a00b8357753a6a44794cc8245a2275237f11affdc38977214e463ad67aec032f3dfa37e9 +86442fff37598ce2b12015ff19b01bb8a780b40ad353d143a0f30a06f6d23afd5c2b0a1253716c855dbf445cc5dd6865 +b8a4c60c5171189414887847b9ed9501bff4e4c107240f063e2d254820d2906b69ef70406c585918c4d24f1dd052142b +919f33a98e84015b2034b57b5ffe9340220926b2c6e45f86fd79ec879dbe06a148ae68b77b73bf7d01bd638a81165617 +95c13e78d89474a47fbc0664f6f806744b75dede95a479bbf844db4a7f4c3ae410ec721cb6ffcd9fa9c323da5740d5ae +ab7151acc41fffd8ec6e90387700bcd7e1cde291ea669567295bea1b9dd3f1df2e0f31f3588cd1a1c08af8120aca4921 +80e74c5c47414bd6eeef24b6793fb1fa2d8fb397467045fcff887c52476741d5bc4ff8b6d3387cb53ad285485630537f +a296ad23995268276aa351a7764d36df3a5a3cffd7dbeddbcea6b1f77adc112629fdeffa0918b3242b3ccd5e7587e946 +813d2506a28a2b01cb60f49d6bd5e63c9b056aa56946faf2f33bd4f28a8d947569cfead3ae53166fc65285740b210f86 +924b265385e1646287d8c09f6c855b094daaee74b9e64a0dddcf9ad88c6979f8280ba30c8597b911ef58ddb6c67e9fe3 +8d531513c70c2d3566039f7ca47cd2352fd2d55b25675a65250bdb8b06c3843db7b2d29c626eed6391c238fc651cf350 +82b338181b62fdc81ceb558a6843df767b6a6e3ceedc5485664b4ea2f555904b1a45fbb35f6cf5d96f27da10df82a325 +92e62faaedea83a37f314e1d3cb4faaa200178371d917938e59ac35090be1db4b4f4e0edb78b9c991de202efe4f313d8 +99d645e1b642c2dc065bac9aaa0621bc648c9a8351efb6891559c3a41ba737bd155fb32d7731950514e3ecf4d75980e4 +b34a13968b9e414172fb5d5ece9a39cf2eb656128c3f2f6cc7a9f0c69c6bae34f555ecc8f8837dc34b5e470e29055c78 +a2a0bb7f3a0b23a2cbc6585d59f87cd7e56b2bbcb0ae48f828685edd9f7af0f5edb4c8e9718a0aaf6ef04553ba71f3b7 +8e1a94bec053ed378e524b6685152d2b52d428266f2b6eadd4bcb7c4e162ed21ab3e1364879673442ee2162635b7a4d8 +9944adaff14a85eab81c73f38f386701713b52513c4d4b838d58d4ffa1d17260a6d056b02334850ea9a31677c4b078bd +a450067c7eceb0854b3eca3db6cf38669d72cb7143c3a68787833cbca44f02c0be9bfbe082896f8a57debb13deb2afb1 +8be4ad3ac9ef02f7df09254d569939757101ee2eda8586fefcd8c847adc1efe5bdcb963a0cafa17651befaafb376a531 +90f6de91ea50255f148ac435e08cf2ac00c772a466e38155bd7e8acf9197af55662c7b5227f88589b71abe9dcf7ba343 +86e5a24f0748b106dee2d4d54e14a3b0af45a96cbee69cac811a4196403ebbee17fd24946d7e7e1b962ac7f66dbaf610 +afdd96fbcda7aa73bf9eeb2292e036c25753d249caee3b9c013009cc22e10d3ec29e2aa6ddbb21c4e949b0c0bccaa7f4 +b5a4e7436d5473647c002120a2cb436b9b28e27ad4ebdd7c5f122b91597c507d256d0cbd889d65b3a908531936e53053 +b632414c3da704d80ac2f3e5e0e9f18a3637cdc2ebeb613c29300745582427138819c4e7b0bec3099c1b8739dac1807b +a28df1464d3372ce9f37ef1db33cc010f752156afae6f76949d98cd799c0cf225c20228ae86a4da592d65f0cffe3951b +898b93d0a31f7d3f11f253cb7a102db54b669fd150da302d8354d8e02b1739a47cb9bd88015f3baf12b00b879442464e +96fb88d89a12049091070cb0048a381902965e67a8493e3991eaabe5d3b7ff7eecd5c94493a93b174df3d9b2c9511755 +b899cb2176f59a5cfba3e3d346813da7a82b03417cad6342f19cc8f12f28985b03bf031e856a4743fd7ebe16324805b0 +a60e2d31bc48e0c0579db15516718a03b73f5138f15037491f4dae336c904e312eda82d50862f4debd1622bb0e56d866 +979fc8b987b5cef7d4f4b58b53a2c278bd25a5c0ea6f41c715142ea5ff224c707de38451b0ad3aa5e749aa219256650a +b2a75bff18e1a6b9cf2a4079572e41205741979f57e7631654a3c0fcec57c876c6df44733c9da3d863db8dff392b44a3 +b7a0f0e811222c91e3df98ff7f286b750bc3b20d2083966d713a84a2281744199e664879401e77470d44e5a90f3e5181 +82b74ba21c9d147fbc338730e8f1f8a6e7fc847c3110944eb17a48bea5e06eecded84595d485506d15a3e675fd0e5e62 +a7f44eef817d5556f0d1abcf420301217d23c69dd2988f44d91ea1f1a16c322263cbacd0f190b9ba22b0f141b9267b4f +aadb68164ede84fc1cb3334b3194d84ba868d5a88e4c9a27519eef4923bc4abf81aab8114449496c073c2a6a0eb24114 +b5378605fabe9a8c12a5dc55ef2b1de7f51aedb61960735c08767a565793cea1922a603a6983dc25f7cea738d0f7c40d +a97a4a5cd8d51302e5e670aee78fe6b5723f6cc892902bbb4f131e82ca1dfd5de820731e7e3367fb0c4c1922a02196e3 +8bdfeb15c29244d4a28896f2b2cb211243cd6a1984a3f5e3b0ebe5341c419beeab3304b390a009ffb47588018034b0ea +a9af3022727f2aa2fca3b096968e97edad3f08edcbd0dbca107b892ae8f746a9c0485e0d6eb5f267999b23a845923ed0 +8e7594034feef412f055590fbb15b6322dc4c6ab7a4baef4685bd13d71a83f7d682b5781bdfa0d1c659489ce9c2b8000 +84977ca6c865ebee021c58106c1a4ad0c745949ecc5332948002fd09bd9b890524878d0c29da96fd11207621136421fe +8687551a79158e56b2375a271136756313122132a6670fa51f99a1b5c229ed8eea1655a734abae13228b3ebfd2a825dd +a0227d6708979d99edfc10f7d9d3719fd3fc68b0d815a7185b60307e4c9146ad2f9be2b8b4f242e320d4288ceeb9504c +89f75583a16735f9dd8b7782a130437805b34280ccea8dac6ecaee4b83fe96947e7b53598b06fecfffdf57ffc12cc445 +a0056c3353227f6dd9cfc8e3399aa5a8f1d71edf25d3d64c982910f50786b1e395c508d3e3727ac360e3e040c64b5298 +b070e61a6d813626144b312ded1788a6d0c7cec650a762b2f8df6e4743941dd82a2511cd956a3f141fc81e15f4e092da +b4e6db232e028a1f989bb5fc13416711f42d389f63564d60851f009dcffac01acfd54efa307aa6d4c0f932892d4e62b0 +89b5991a67db90024ddd844e5e1a03ef9b943ad54194ae0a97df775dde1addf31561874f4e40fbc37a896630f3bbda58 +ad0e8442cb8c77d891df49cdb9efcf2b0d15ac93ec9be1ad5c3b3cca1f4647b675e79c075335c1f681d56f14dc250d76 +b5d55a6ae65bb34dd8306806cb49b5ccb1c83a282ee47085cf26c4e648e19a52d9c422f65c1cd7e03ca63e926c5e92ea +b749501347e5ec07e13a79f0cb112f1b6534393458b3678a77f02ca89dca973fa7b30e55f0b25d8b92b97f6cb0120056 +94144b4a3ffc5eec6ba35ce9c245c148b39372d19a928e236a60e27d7bc227d18a8cac9983851071935d8ffb64b3a34f +92bb4f9f85bc8c028a3391306603151c6896673135f8a7aefedd27acb322c04ef5dac982fc47b455d6740023e0dd3ea3 +b9633a4a101461a782fc2aa092e9dbe4e2ad00987578f18cd7cf0021a909951d60fe79654eb7897806795f93c8ff4d1c +809f0196753024821b48a016eca5dbb449a7c55750f25981bb7a4b4c0e0846c09b8f6128137905055fc43a3f0deb4a74 +a27dc9cdd1e78737a443570194a03d89285576d3d7f3a3cf15cc55b3013e42635d4723e2e8fe1d0b274428604b630db9 +861f60f0462e04cd84924c36a28163def63e777318d00884ab8cb64c8df1df0bce5900342163edb60449296484a6c5bf +b7bc23fb4e14af4c4704a944253e760adefeca8caee0882b6bbd572c84434042236f39ae07a8f21a560f486b15d82819 +b9a6eb492d6dd448654214bd01d6dc5ff12067a11537ab82023fc16167507ee25eed2c91693912f4155d1c07ed9650b3 +97678af29c68f9a5e213bf0fb85c265303714482cfc4c2c00b4a1e8a76ed08834ee6af52357b143a1ca590fb0265ea5a +8a15b499e9eca5b6cac3070b5409e8296778222018ad8b53a5d1f6b70ad9bb10c68a015d105c941ed657bf3499299e33 +b487fefede2e8091f2c7bfe85770db2edff1db83d4effe7f7d87bff5ab1ace35e9b823a71adfec6737fede8d67b3c467 +8b51b916402aa2c437fce3bcad6dad3be8301a1a7eab9d163085b322ffb6c62abf28637636fe6114573950117fc92898 +b06a2106d031a45a494adec0881cb2f82275dff9dcdd2bc16807e76f3bec28a6734edd3d54f0be8199799a78cd6228ad +af0a185391bbe2315eb97feac98ad6dd2e5d931d012c621abd6e404a31cc188b286fef14871762190acf086482b2b5e2 +8e78ee8206506dd06eb7729e32fceda3bebd8924a64e4d8621c72e36758fda3d0001af42443851d6c0aea58562870b43 +a1ba52a569f0461aaf90b49b92be976c0e73ec4a2c884752ee52ffb62dd137770c985123d405dfb5de70692db454b54a +8d51b692fa1543c51f6b62b9acb8625ed94b746ef96c944ca02859a4133a5629da2e2ce84e111a7af8d9a5b836401c64 +a7a20d45044cf6492e0531d0b8b26ffbae6232fa05a96ed7f06bdb64c2b0f5ca7ec59d5477038096a02579e633c7a3ff +84df867b98c53c1fcd4620fef133ee18849c78d3809d6aca0fb6f50ff993a053a455993f216c42ab6090fa5356b8d564 +a7227c439f14c48e2577d5713c97a5205feb69acb0b449152842e278fa71e8046adfab468089c8b2288af1fc51fa945b +855189b3a105670779997690876dfaa512b4a25a24931a912c2f0f1936971d2882fb4d9f0b3d9daba77eaf660e9d05d5 +b5696bd6706de51c502f40385f87f43040a5abf99df705d6aac74d88c913b8ecf7a99a63d7a37d9bdf3a941b9e432ff5 +ab997beb0d6df9c98d5b49864ef0b41a2a2f407e1687dfd6089959757ba30ed02228940b0e841afe6911990c74d536c4 +b36b65f85546ebfdbe98823d5555144f96b4ab39279facd19c0de3b8919f105ba0315a0784dce4344b1bc62d8bb4a5a3 +b8371f0e4450788720ac5e0f6cd3ecc5413d33895083b2c168d961ec2b5c3de411a4cc0712481cbe8df8c2fa1a7af006 +98325d8026b810a8b7a114171ae59a57e8bbc9848e7c3df992efc523621729fd8c9f52114ce01d7730541a1ada6f1df1 +8d0e76dbd37806259486cd9a31bc8b2306c2b95452dc395546a1042d1d17863ef7a74c636b782e214d3aa0e8d717f94a +a4e15ead76da0214d702c859fb4a8accdcdad75ed08b865842bd203391ec4cba2dcc916455e685f662923b96ee0c023f +8618190972086ebb0c4c1b4a6c94421a13f378bc961cc8267a301de7390c5e73c3333864b3b7696d81148f9d4843fd02 +85369d6cc7342e1aa15b59141517d8db8baaaeb7ab9670f3ba3905353948d575923d283b7e5a05b13a30e7baf1208a86 +87c51ef42233c24a6da901f28c9a075d9ba3c625687c387ad6757b72ca6b5a8885e6902a3082da7281611728b1e45f26 +aa6348a4f71927a3106ad0ea8b02fc8d8c65531e4ab0bd0a17243e66f35afe252e40ab8eef9f13ae55a72566ffdaff5c +96a3bc976e9d03765cc3fee275fa05b4a84c94fed6b767e23ca689394501e96f56f7a97cffddc579a6abff632bf153be +97dbf96c6176379fdb2b888be4e757b2bca54e74124bd068d3fa1dbd82a011bbeb75079da38e0cd22a761fe208ecad9b +b70cf0a1d14089a4129ec4e295313863a59da8c7e26bf74cc0e704ed7f0ee4d7760090d0ddf7728180f1bf2c5ac64955 +882d664714cc0ffe53cbc9bef21f23f3649824f423c4dbad1f893d22c4687ab29583688699efc4d5101aa08b0c3e267a +80ecb7cc963e677ccaddbe3320831dd6ee41209acf4ed41b16dc4817121a3d86a1aac9c4db3d8c08a55d28257088af32 +a25ba667d832b145f9ce18c3f9b1bd00737aa36db020e1b99752c8ef7d27c6c448982bd8d352e1b6df266b8d8358a8d5 +83734841c13dee12759d40bdd209b277e743b0d08cc0dd1e0b7afd2d65bfa640400eefcf6be4a52e463e5b3d885eeac6 +848d16505b04804afc773aebabb51b36fd8aacfbb0e09b36c0d5d57df3c0a3b92f33e7d5ad0a7006ec46ebb91df42b8c +909a8d793f599e33bb9f1dc4792a507a97169c87cd5c087310bc05f30afcd247470b4b56dec59894c0fb1d48d39bb54e +8e558a8559df84a1ba8b244ece667f858095c50bb33a5381e60fcc6ba586b69693566d8819b4246a27287f16846c1dfa +84d6b69729f5aaa000cd710c2352087592cfbdf20d5e1166977e195818e593fa1a50d1e04566be23163a2523dc1612f1 +9536d262b7a42125d89f4f32b407d737ba8d9242acfc99d965913ab3e043dcac9f7072a43708553562cac4cba841df30 +9598548923ca119d6a15fd10861596601dd1dedbcccca97bb208cdc1153cf82991ea8cc17686fbaa867921065265970c +b87f2d4af6d026e4d2836bc3d390a4a18e98a6e386282ce96744603bab74974272e97ac2da281afa21885e2cbb3a8001 +991ece62bf07d1a348dd22191868372904b9f8cf065ae7aa4e44fd24a53faf6d851842e35fb472895963aa1992894918 +a8c53dea4c665b30e51d22ca6bc1bc78aaf172b0a48e64a1d4b93439b053877ec26cb5221c55efd64fa841bbf7d5aff4 +93487ec939ed8e740f15335b58617c3f917f72d07b7a369befd479ae2554d04deb240d4a14394b26192efae4d2f4f35d +a44793ab4035443f8f2968a40e043b4555960193ffa3358d22112093aadfe2c136587e4139ffd46d91ed4107f61ea5e0 +b13fe033da5f0d227c75927d3dacb06dbaf3e1322f9d5c7c009de75cdcba5e308232838785ab69a70f0bedea755e003f +970a29b075faccd0700fe60d1f726bdebf82d2cc8252f4a84543ebd3b16f91be42a75c9719a39c4096139f0f31393d58 +a4c3eb1f7160f8216fc176fb244df53008ff32f2892363d85254002e66e2de21ccfe1f3b1047589abee50f29b9d507e3 +8c552885eab04ba40922a8f0c3c38c96089c95ff1405258d3f1efe8d179e39e1295cbf67677894c607ae986e4e6b1fb0 +b3671746fa7f848c4e2ae6946894defadd815230b906b419143523cc0597bc1d6c0a4c1e09d49b66b4a2c11cde3a4de3 +937a249a95813a5e2ef428e355efd202e15a37d73e56cfb7e57ea9f943f2ce5ca8026f2f1fd25bf164ba89d07077d858 +83646bdf6053a04aa9e2f112499769e5bd5d0d10f2e13db3ca89bd45c0b3b7a2d752b7d137fb3909f9c62b78166c9339 +b4eac4b91e763666696811b7ed45e97fd78310377ebea1674b58a2250973f80492ac35110ed1240cd9bb2d17493d708c +82db43a99bc6573e9d92a3fd6635dbbb249ac66ba53099c3c0c8c8080b121dd8243cd5c6e36ba0a4d2525bae57f5c89c +a64d6a264a681b49d134c655d5fc7756127f1ee7c93d328820f32bca68869f53115c0d27fef35fe71f7bc4fdaed97348 +8739b7a9e2b4bc1831e7f04517771bc7cde683a5e74e052542517f8375a2f64e53e0d5ac925ef722327e7bb195b4d1d9 +8f337cdd29918a2493515ebb5cf702bbe8ecb23b53c6d18920cc22f519e276ca9b991d3313e2d38ae17ae8bdfa4f8b7e +b0edeab9850e193a61f138ef2739fc42ceec98f25e7e8403bfd5fa34a7bc956b9d0898250d18a69fa4625a9b3d6129da +a9920f26fe0a6d51044e623665d998745c9eca5bce12051198b88a77d728c8238f97d4196f26e43b24f8841500b998d0 +86e655d61502b979eeeeb6f9a7e1d0074f936451d0a1b0d2fa4fb3225b439a3770767b649256fe481361f481a8dbc276 +84d3b32fa62096831cc3bf013488a9f3f481dfe293ae209ed19585a03f7db8d961a7a9dd0db82bd7f62d612707575d9c +81c827826ec9346995ffccf62a241e3b2d32f7357acd1b1f8f7a7dbc97022d3eb51b8a1230e23ce0b401d2e535e8cd78 +94a1e40c151191c5b055b21e86f32e69cbc751dcbdf759a48580951834b96a1eed75914c0d19a38aefd21fb6c8d43d0c +ab890222b44bc21b71f7c75e15b6c6e16bb03371acce4f8d4353ff3b8fcd42a14026589c5ed19555a3e15e4d18bfc3a3 +accb0be851e93c6c8cc64724cdb86887eea284194b10e7a43c90528ed97e9ec71ca69c6fac13899530593756dd49eab2 +b630220aa9e1829c233331413ee28c5efe94ea8ea08d0c6bfd781955078b43a4f92915257187d8526873e6c919c6a1de +add389a4d358c585f1274b73f6c3c45b58ef8df11f9d11221f620e241bf3579fba07427b288c0c682885a700cc1fa28d +a9fe6ca8bf2961a3386e8b8dcecc29c0567b5c0b3bcf3b0f9169f88e372b80151af883871fc5229815f94f43a6f5b2b0 +ad839ae003b92b37ea431fa35998b46a0afc3f9c0dd54c3b3bf7a262467b13ff3c323ada1c1ae02ac7716528bdf39e3e +9356d3fd0edcbbb65713c0f2a214394f831b26f792124b08c5f26e7f734b8711a87b7c4623408da6a091c9aef1f6af3c +896b25b083c35ac67f0af3784a6a82435b0e27433d4d74cd6d1eafe11e6827827799490fb1c77c11de25f0d75f14e047 +8bfa019391c9627e8e5f05c213db625f0f1e51ec68816455f876c7e55b8f17a4f13e5aae9e3fb9e1cf920b1402ee2b40 +8ba3a6faa6a860a8f3ce1e884aa8769ceded86380a86520ab177ab83043d380a4f535fe13884346c5e51bee68da6ab41 +a8292d0844084e4e3bb7af92b1989f841a46640288c5b220fecfad063ee94e86e13d3d08038ec2ac82f41c96a3bfe14d +8229bb030b2fc566e11fd33c7eab7a1bb7b49fed872ea1f815004f7398cb03b85ea14e310ec19e1f23e0bdaf60f8f76c +8cfbf869ade3ec551562ff7f63c2745cc3a1f4d4dc853a0cd42dd5f6fe54228f86195ea8fe217643b32e9f513f34a545 +ac52a3c8d3270ddfe1b5630159da9290a5ccf9ccbdef43b58fc0a191a6c03b8a5974cf6e2bbc7bd98d4a40a3581482d7 +ab13decb9e2669e33a7049b8eca3ca327c40dea15ad6e0e7fa63ed506db1d258bc36ac88b35f65cae0984e937eb6575d +b5e748eb1a7a1e274ff0cc56311c198f2c076fe4b7e73e5f80396fe85358549df906584e6bb2c8195b3e2be7736850a5 +b5cb911325d8f963c41f691a60c37831c7d3bbd92736efa33d1f77a22b3fde7f283127256c2f47e197571e6fe0b46149 +8a01dc6ed1b55f26427a014faa347130738b191a06b800e32042a46c13f60b49534520214359d68eb2e170c31e2b8672 +a72fa874866e19b2efb8e069328362bf7921ec375e3bcd6b1619384c3f7ee980f6cf686f3544e9374ff54b4d17a1629c +8db21092f7c5f110fba63650b119e82f4b42a997095d65f08f8237b02dd66fdf959f788df2c35124db1dbd330a235671 +8c65d50433d9954fe28a09fa7ba91a70a590fe7ba6b3060f5e4be0f6cef860b9897fa935fb4ebc42133524eb071dd169 +b4614058e8fa21138fc5e4592623e78b8982ed72aa35ee4391b164f00c68d277fa9f9eba2eeefc890b4e86eba5124591 +ab2ad3a1bce2fbd55ca6b7c23786171fe1440a97d99d6df4d80d07dd56ac2d7203c294b32fc9e10a6c259381a73f24a1 +812ae3315fdc18774a8da3713a4679e8ed10b9405edc548c00cacbe25a587d32040566676f135e4723c5dc25df5a22e9 +a464b75f95d01e5655b54730334f443c8ff27c3cb79ec7af4b2f9da3c2039c609908cd128572e1fd0552eb597e8cef8d +a0db3172e93ca5138fe419e1c49a1925140999f6eff7c593e5681951ee0ec1c7e454c851782cbd2b8c9bc90d466e90e0 +806db23ba7d00b87d544eed926b3443f5f9c60da6b41b1c489fba8f73593b6e3b46ebfcab671ee009396cd77d5e68aa1 +8bfdf2c0044cc80260994e1c0374588b6653947b178e8b312be5c2a05e05767e98ea15077278506aee7df4fee1aaf89e +827f6558c16841b5592ff089c9c31e31eb03097623524394813a2e4093ad2d3f8f845504e2af92195aaa8a1679d8d692 +925c4f8eab2531135cd71a4ec88e7035b5eea34ba9d799c5898856080256b4a15ed1a746e002552e2a86c9c157e22e83 +a9f9a368f0e0b24d00a35b325964c85b69533013f9c2cfad9708be5fb87ff455210f8cb8d2ce3ba58ca3f27495552899 +8ac0d3bebc1cae534024187e7c71f8927ba8fcc6a1926cb61c2b6c8f26bb7831019e635a376146c29872a506784a4aaa +97c577be2cbbfdb37ad754fae9df2ada5fc5889869efc7e18a13f8e502fbf3f4067a509efbd46fd990ab47ce9a70f5a8 +935e7d82bca19f16614aa43b4a3474e4d20d064e4bfdf1cea2909e5c9ab72cfe3e54dc50030e41ee84f3588cebc524e9 +941aafc08f7c0d94cebfbb1f0aad5202c02e6e37f2c12614f57e727efa275f3926348f567107ee6d8914dd71e6060271 +af0fbc1ba05b4b5b63399686df3619968be5d40073de0313cbf5f913d3d4b518d4c249cdd2176468ccaa36040a484f58 +a0c414f23f46ca6d69ce74c6f8a00c036cb0edd098af0c1a7d39c802b52cfb2d5dbdf93fb0295453d4646e2af7954d45 +909cf39e11b3875bb63b39687ae1b5d1f5a15445e39bf164a0b14691b4ddb39a8e4363f584ef42213616abc4785b5d66 +a92bac085d1194fbd1c88299f07a061d0bdd3f980b663e81e6254dbb288bf11478c0ee880e28e01560f12c5ccb3c0103 +841705cd5cd76b943e2b7c5e845b9dd3c8defe8ef67e93078d6d5e67ade33ad4b0fd413bc196f93b0a4073c855cd97d4 +8e7eb8364f384a9161e81d3f1d52ceca9b65536ae49cc35b48c3e2236322ba4ae9973e0840802d9fa4f4d82ea833544f +aed3ab927548bc8bec31467ba80689c71a168e34f50dcb6892f19a33a099f5aa6b3f9cb79f5c0699e837b9a8c7f27efe +b8fbf7696210a36e20edabd77839f4dfdf50d6d015cdf81d587f90284a9bcef7d2a1ff520728d7cc69a4843d6c20dedd +a9d533769ce6830211c884ae50a82a7bf259b44ac71f9fb11f0296fdb3981e6b4c1753fe744647b247ebc433a5a61436 +8b4bdf90d33360b7f428c71cde0a49fb733badba8c726876945f58c620ce7768ae0e98fc8c31fa59d8955a4823336bb1 +808d42238e440e6571c59e52a35ae32547d502dc24fd1759d8ea70a7231a95859baf30b490a4ba55fa2f3aaa11204597 +85594701f1d2fee6dc1956bc44c7b31db93bdeec2f3a7d622c1a08b26994760773e3d57521a44cfd7e407ac3fd430429 +a66de045ce7173043a6825e9dc440ac957e2efb6df0a337f4f8003eb0c719d873a52e6eba3cb0d69d977ca37d9187674 +87a1c6a1fdff993fa51efa5c3ba034c079c0928a7d599b906336af7c2dcab9721ceaf3108c646490af9dff9a754f54b3 +926424223e462ceb75aed7c22ade8a7911a903b7e5dd4bc49746ddce8657f4616325cd12667d4393ac52cdd866396d0e +b5dc96106593b42b30f06f0b0a1e0c1aafc70432e31807252d3674f0b1ea5e58eac8424879d655c9488d85a879a3e572 +997ca0987735cc716507cb0124b1d266d218b40c9d8e0ecbf26a1d65719c82a637ce7e8be4b4815d307df717bde7c72a +92994d3f57a569b7760324bb5ae4e8e14e1633d175dab06aa57b8e391540e05f662fdc08b8830f489a063f59b689a688 +a8087fcc6aa4642cb998bea11facfe87eb33b90a9aa428ab86a4124ad032fc7d2e57795311a54ec9f55cc120ebe42df1 +a9bd7d1de6c0706052ca0b362e2e70e8c8f70f1f026ea189b4f87a08ce810297ebfe781cc8004430776c54c1a05ae90c +856d33282e8a8e33a3d237fb0a0cbabaf77ba9edf2fa35a831fdafcadf620561846aa6cbb6bdc5e681118e1245834165 +9524a7aa8e97a31a6958439c5f3339b19370f03e86b89b1d02d87e4887309dbbe9a3a8d2befd3b7ed5143c8da7e0a8ad +824fdf433e090f8acbd258ac7429b21f36f9f3b337c6d0b71d1416a5c88a767883e255b2888b7c906dd2e9560c4af24c +88c7fee662ca7844f42ed5527996b35723abffd0d22d4ca203b9452c639a5066031207a5ae763dbc0865b3299d19b1ec +919dca5c5595082c221d5ab3a5bc230f45da7f6dec4eb389371e142c1b9c6a2c919074842479c2844b72c0d806170c0c +b939be8175715e55a684578d8be3ceff3087f60fa875fff48e52a6e6e9979c955efef8ff67cfa2b79499ea23778e33b0 +873b6db725e7397d11bc9bed9ac4468e36619135be686790a79bc6ed4249058f1387c9a802ea86499f692cf635851066 +aeae06db3ec47e9e5647323fa02fac44e06e59b885ad8506bf71b184ab3895510c82f78b6b22a5d978e8218e7f761e9f +b99c0a8359c72ab88448bae45d4bf98797a26bca48b0d4460cd6cf65a4e8c3dd823970ac3eb774ae5d0cea4e7fadf33e +8f10c8ec41cdfb986a1647463076a533e6b0eec08520c1562401b36bb063ac972aa6b28a0b6ce717254e35940b900e3c +a106d9be199636d7add43b942290269351578500d8245d4aae4c083954e4f27f64740a3138a66230391f2d0e6043a8de +a469997908244578e8909ff57cffc070f1dbd86f0098df3cfeb46b7a085cfecc93dc69ee7cad90ff1dc5a34d50fe580c +a4ef087bea9c20eb0afc0ee4caba7a9d29dfa872137828c721391273e402fb6714afc80c40e98bbd8276d3836bffa080 +b07a013f73cd5b98dae0d0f9c1c0f35bff8a9f019975c4e1499e9bee736ca6fcd504f9bc32df1655ff333062382cff04 +b0a77188673e87cc83348c4cc5db1eecf6b5184e236220c8eeed7585e4b928db849944a76ec60ef7708ef6dac02d5592 +b1284b37e59b529f0084c0dacf0af6c0b91fc0f387bf649a8c74819debf606f7b07fc3e572500016fb145ec2b24e9f17 +97b20b5b4d6b9129da185adfbf0d3d0b0faeba5b9715f10299e48ea0521709a8296a9264ce77c275a59c012b50b6519a +b9d37e946fae5e4d65c1fbfacc8a62e445a1c9d0f882e60cca649125af303b3b23af53c81d7bac544fb7fcfc7a314665 +8e5acaac379f4bb0127efbef26180f91ff60e4c525bc9b798fc50dfaf4fe8a5aa84f18f3d3cfb8baead7d1e0499af753 +b0c0b8ab1235bf1cda43d4152e71efc1a06c548edb964eb4afceb201c8af24240bf8ab5cae30a08604e77432b0a5faf0 +8cc28d75d5c8d062d649cbc218e31c4d327e067e6dbd737ec0a35c91db44fbbd0d40ec424f5ed79814add16947417572 +95ae6219e9fd47efaa9cb088753df06bc101405ba50a179d7c9f7c85679e182d3033f35b00dbba71fdcd186cd775c52e +b5d28fa09f186ebc5aa37453c9b4d9474a7997b8ae92748ecb940c14868792292ac7d10ade01e2f8069242b308cf97e5 +8c922a0faa14cc6b7221f302df3342f38fc8521ec6c653f2587890192732c6da289777a6cd310747ea7b7d104af95995 +b9ad5f660b65230de54de535d4c0fcae5bc6b59db21dea5500fdc12eea4470fb8ea003690fdd16d052523418d5e01e8c +a39a9dd41a0ff78c82979483731f1cd68d3921c3e9965869662c22e02dde3877802e180ba93f06e7346f96d9fa9261d2 +8b32875977ec372c583b24234c27ed73aef00cdff61eb3c3776e073afbdeade548de9497c32ec6d703ff8ad0a5cb7fe4 +9644cbe755a5642fe9d26cfecf170d3164f1848c2c2e271d5b6574a01755f3980b3fc870b98cf8528fef6ecef4210c16 +81ea9d1fdd9dd66d60f40ce0712764b99da9448ae0b300f8324e1c52f154e472a086dda840cb2e0b9813dc8ce8afd4b5 +906aaa4a7a7cdf01909c5cfbc7ded2abc4b869213cbf7c922d4171a4f2e637e56f17020b852ad339d83b8ac92f111666 +939b5f11acbdeff998f2a080393033c9b9d8d5c70912ea651c53815c572d36ee822a98d6dfffb2e339f29201264f2cf4 +aba4898bf1ccea9b9e2df1ff19001e05891581659c1cbbde7ee76c349c7fc7857261d9785823c9463a8aea3f40e86b38 +83ca1a56b8a0be4820bdb5a9346357c68f9772e43f0b887729a50d2eb2a326bbcede676c8bf2e51d7c89bbd8fdb778a6 +94e86e9fe6addfe2c3ee3a547267ed921f4230d877a85bb4442c2d9350c2fa9a9c54e6fe662de82d1a2407e4ab1691c2 +a0cc3bdef671a59d77c6984338b023fa2b431b32e9ed2abe80484d73edc6540979d6f10812ecc06d4d0c5d4eaca7183c +b5343413c1b5776b55ea3c7cdd1f3af1f6bd802ea95effe3f2b91a523817719d2ecc3f8d5f3cc2623ace7e35f99ca967 +92085d1ed0ed28d8cabe3e7ff1905ed52c7ceb1eac5503760c52fb5ee3a726aba7c90b483c032acc3f166b083d7ec370 +8ec679520455275cd957fca8122724d287db5df7d29f1702a322879b127bff215e5b71d9c191901465d19c86c8d8d404 +b65eb2c63d8a30332eb24ee8a0c70156fc89325ebbb38bacac7cf3f8636ad8a472d81ccca80423772abc00192d886d8a +a9fe1c060b974bee4d590f2873b28635b61bfcf614e61ff88b1be3eee4320f4874e21e8d666d8ac8c9aba672efc6ecae +b3fe2a9a389c006a831dea7e777062df84b5c2803f9574d7fbe10b7e1c125817986af8b6454d6be9d931a5ac94cfe963 +95418ad13b734b6f0d33822d9912c4c49b558f68d08c1b34a0127fcfa666bcae8e6fda8832d2c75bb9170794a20e4d7c +a9a7df761e7f18b79494bf429572140c8c6e9d456c4d4e336184f3f51525a65eb9582bea1e601bdb6ef8150b7ca736a5 +a0de03b1e75edf7998c8c1ac69b4a1544a6fa675a1941950297917366682e5644a4bda9cdeedfaf9473d7fccd9080b0c +a61838af8d95c95edf32663a68f007d95167bf6e41b0c784a30b22d8300cfdd5703bd6d16e86396638f6db6ae7e42a85 +8866d62084d905c145ff2d41025299d8b702ac1814a7dec4e277412c161bc9a62fed735536789cb43c88693c6b423882 +91da22c378c81497fe363e7f695c0268443abee50f8a6625b8a41e865638a643f07b157ee566de09ba09846934b4e2d7 +941d21dd57c9496aa68f0c0c05507405fdd413acb59bc668ce7e92e1936c68ec4b065c3c30123319884149e88228f0b2 +a77af9b094bc26966ddf2bf9e1520c898194a5ccb694915950dadc204facbe3066d3d89f50972642d76b14884cfbaa21 +8e76162932346869f4618bde744647f7ab52ab498ad654bdf2a4feeb986ac6e51370841e5acbb589e38b6e7142bb3049 +b60979ace17d6937ece72e4f015da4657a443dd01cebc7143ef11c09e42d4aa8855999a65a79e2ea0067f31c9fc2ab0f +b3e2ffdd5ee6fd110b982fd4fad4b93d0fca65478f986d086eeccb0804960bfaa1919afa743c2239973ea65091fe57d2 +8ce0ce05e7d7160d44574011da687454dbd3c8b8290aa671731b066e2c82f8cf2d63cb8e932d78c6122ec610e44660e6 +ab005dd8d297045c39e2f72fb1c48edb501ccf3575d3d04b9817b3afee3f0bb0f3f53f64bda37d1d9cde545aae999bae +95bd7edb4c4cd60e3cb8a72558845a3cce6bb7032ccdf33d5a49ebb6ddf203bc3c79e7b7e550735d2d75b04c8b2441e8 +889953ee256206284094e4735dbbb17975bafc7c3cb94c9fbfee4c3e653857bfd49e818f64a47567f721b98411a3b454 +b188423e707640ab0e75a061e0b62830cde8afab8e1ad3dae30db69ffae4e2fc005bababbdcbd7213b918ed4f70e0c14 +a97e0fafe011abd70d4f99a0b36638b3d6e7354284588f17a88970ed48f348f88392779e9a038c6cbc9208d998485072 +87db11014a91cb9b63e8dfaa82cdebca98272d89eb445ee1e3ff9dbaf2b3fad1a03b888cffc128e4fe208ed0dddece0f +aad2e40364edd905d66ea4ac9d51f9640d6fda9a54957d26ba233809851529b32c85660fa401dbee3679ec54fa6dd966 +863e99336ca6edf03a5a259e59a2d0f308206e8a2fb320cfc0be06057366df8e0f94b33a28f574092736b3c5ada84270 +b34bcc56a057589f34939a1adc51de4ff6a9f4fee9c7fa9aa131e28d0cf0759a0c871b640162acdfbf91f3f1b59a3703 +935dd28f2896092995c5eff1618e5b6efe7a40178888d7826da9b0503c2d6e68a28e7fac1a334e166d0205f0695ef614 +b842cd5f8f5de5ca6c68cb4a5c1d7b451984930eb4cc18fd0934d52fdc9c3d2d451b1c395594d73bc3451432bfba653f +9014537885ce2debad736bc1926b25fdab9f69b216bf024f589c49dc7e6478c71d595c3647c9f65ff980b14f4bb2283b +8e827ccca1dd4cd21707140d10703177d722be0bbe5cac578db26f1ef8ad2909103af3c601a53795435b27bf95d0c9ed +8a0b8ad4d466c09d4f1e9167410dbe2edc6e0e6229d4b3036d30f85eb6a333a18b1c968f6ca6d6889bb08fecde017ef4 +9241ee66c0191b06266332dc9161dede384c4bb4e116dbd0890f3c3790ec5566da4568243665c4725b718ac0f6b5c179 +aeb4d5fad81d2b505d47958a08262b6f1b1de9373c2c9ba6362594194dea3e002ab03b8cbb43f867be83065d3d370f19 +8781bc83bb73f7760628629fe19e4714b494dbed444c4e4e4729b7f6a8d12ee347841a199888794c2234f51fa26fc2b9 +b58864f0acd1c2afa29367e637cbde1968d18589245d9936c9a489c6c495f54f0113ecdcbe4680ac085dd3c397c4d0c3 +94a24284afaeead61e70f3e30f87248d76e9726759445ca18cdb9360586c60cc9f0ec1c397f9675083e0b56459784e2e +aed358853f2b54dcbddf865e1816c2e89be12e940e1abfa661e2ee63ffc24a8c8096be2072fa83556482c0d89e975124 +b95374e6b4fc0765708e370bc881e271abf2e35c08b056a03b847e089831ef4fe3124b9c5849d9c276eb2e35b3daf264 +b834cdbcfb24c8f84bfa4c552e7fadc0028a140952fd69ed13a516e1314a4cd35d4b954a77d51a1b93e1f5d657d0315d +8fb6d09d23bfa90e7443753d45a918d91d75d8e12ec7d016c0dfe94e5c592ba6aaf483d2f16108d190822d955ad9cdc3 +aa315cd3c60247a6ad4b04f26c5404c2713b95972843e4b87b5a36a89f201667d70f0adf20757ebe1de1b29ae27dda50 +a116862dca409db8beff5b1ccd6301cdd0c92ca29a3d6d20eb8b87f25965f42699ca66974dd1a355200157476b998f3b +b4c2f5fe173c4dc8311b60d04a65ce1be87f070ac42e13cd19c6559a2931c6ee104859cc2520edebbc66a13dc7d30693 +8d4a02bf99b2260c334e7d81775c5cf582b00b0c982ce7745e5a90624919028278f5e9b098573bad5515ce7fa92a80c8 +8543493bf564ce6d97bd23be9bff1aba08bd5821ca834f311a26c9139c92a48f0c2d9dfe645afa95fec07d675d1fd53b +9344239d13fde08f98cb48f1f87d34cf6abe8faecd0b682955382a975e6eed64e863fa19043290c0736261622e00045c +aa49d0518f343005ca72b9e6c7dcaa97225ce6bb8b908ebbe7b1a22884ff8bfb090890364e325a0d414ad180b8f161d1 +907d7fd3e009355ab326847c4a2431f688627faa698c13c03ffdd476ecf988678407f029b8543a475dcb3dafdf2e7a9c +845f1f10c6c5dad2adc7935f5cd2e2b32f169a99091d4f1b05babe7317b9b1cdce29b5e62f947dc621b9acbfe517a258 +8f3be8e3b380ea6cdf9e9c237f5e88fd5a357e5ded80ea1fc2019810814de82501273b4da38916881125b6fa0cfd4459 +b9c7f487c089bf1d20c822e579628db91ed9c82d6ca652983aa16d98b4270c4da19757f216a71b9c13ddee3e6e43705f +8ba2d8c88ad2b872db104ea8ddbb006ec2f3749fd0e19298a804bb3a5d94de19285cc7fb19fee58a66f7851d1a66c39f +9375ecd3ed16786fe161af5d5c908f56eeb467a144d3bbddfc767e90065b7c94fc53431adebecba2b6c9b5821184d36e +a49e069bfadb1e2e8bff6a4286872e2a9765d62f0eaa4fcb0e5af4bbbed8be3510fb19849125a40a8a81d1e33e81c3eb +9522cc66757b386aa6b88619525c8ce47a5c346d590bb3647d12f991e6c65c3ab3c0cfc28f0726b6756c892eae1672be +a9a0f1f51ff877406fa83a807aeb17b92a283879f447b8a2159653db577848cc451cbadd01f70441e351e9ed433c18bc +8ff7533dcff6be8714df573e33f82cf8e9f2bcaaa43e939c4759d52b754e502717950de4b4252fb904560fc31dce94a4 +959724671e265a28d67c29d95210e97b894b360da55e4cf16e6682e7912491ed8ca14bfaa4dce9c25a25b16af580494f +92566730c3002f4046c737032487d0833c971e775de59fe02d9835c9858e2e3bc37f157424a69764596c625c482a2219 +a84b47ceff13ed9c3e5e9cdf6739a66d3e7c2bd8a6ba318fefb1a9aecf653bb2981da6733ddb33c4b0a4523acc429d23 +b4ddf571317e44f859386d6140828a42cf94994e2f1dcbcc9777f4eebbfc64fc1e160b49379acc27c4672b8e41835c5d +8ab95c94072b853d1603fdd0a43b30db617d13c1d1255b99075198e1947bfa5f59aed2b1147548a1b5e986cd9173d15c +89511f2eab33894fd4b3753d24249f410ff7263052c1fef6166fc63a79816656b0d24c529e45ccce6be28de6e375d916 +a0866160ca63d4f2be1b4ea050dac6b59db554e2ebb4e5b592859d8df339b46fd7cb89aaed0951c3ee540aee982c238a +8fcc5cbba1b94970f5ff2eb1922322f5b0aa7d918d4b380c9e7abfd57afd8b247c346bff7b87af82efbce3052511cd1b +99aeb2a5e846b0a2874cca02c66ed40d5569eb65ab2495bc3f964a092e91e1517941f2688e79f8cca49cd3674c4e06dc +b7a096dc3bad5ca49bee94efd884aa3ff5615cf3825cf95fbe0ce132e35f46581d6482fa82666c7ef5f1643eaee8f1ca +94393b1da6eaac2ffd186b7725eca582f1ddc8cdd916004657f8a564a7c588175cb443fc6943b39029f5bbe0add3fad8 +884b85fe012ccbcd849cb68c3ad832d83b3ef1c40c3954ffdc97f103b1ed582c801e1a41d9950f6bddc1d11f19d5ec76 +b00061c00131eded8305a7ce76362163deb33596569afb46fe499a7c9d7a0734c084d336b38d168024c2bb42b58e7660 +a439153ac8e6ca037381e3240e7ba08d056c83d7090f16ed538df25901835e09e27de2073646e7d7f3c65056af6e4ce7 +830fc9ca099097d1f38b90e6843dc86f702be9d20bdacc3e52cae659dc41df5b8d2c970effa6f83a5229b0244a86fe22 +b81ea2ffaaff2bb00dd59a9ab825ba5eed4db0d8ac9c8ed1a632ce8f086328a1cddd045fbe1ace289083c1325881b7e7 +b51ea03c58daf2db32c99b9c4789b183365168cb5019c72c4cc91ac30b5fb7311d3db76e6fa41b7cd4a8c81e2f6cdc94 +a4170b2c6d09ca5beb08318730419b6f19215ce6c631c854116f904be3bc30dd85a80c946a8ab054d3e307afaa3f8fbc +897cc42ff28971ff54d2a55dd6b35cfb8610ac902f3c06e3a5cea0e0a257e870c471236a8e84709211c742a09c5601a6 +a18f2e98d389dace36641621488664ecbb422088ab03b74e67009b8b8acacaaa24fdcf42093935f355207d934adc52a8 +92adcfb678cc2ba19c866f3f2b988fdcb4610567f3ab436cc0cb9acaf5a88414848d71133ebdbec1983e38e6190f1b5f +a86d43c2ce01b366330d3b36b3ca85f000c3548b8297e48478da1ee7d70d8576d4650cba7852ed125c0d7cb6109aa7f3 +8ed31ceed9445437d7732dce78a762d72ff32a7636bfb3fd7974b7ae15db414d8184a1766915244355deb354fbc5803b +9268f70032584f416e92225d65af9ea18c466ebc7ae30952d56a4e36fd9ea811dde0a126da9220ba3c596ec54d8a335e +9433b99ee94f2d3fbdd63b163a2bdf440379334c52308bd24537f7defd807145a062ff255a50d119a7f29f4b85d250e3 +90ce664f5e4628a02278f5cf5060d1a34f123854634b1870906e5723ac9afd044d48289be283b267d45fcbf3f4656aaf +aaf21c4d59378bb835d42ae5c5e5ab7a3c8c36a59e75997989313197752b79a472d866a23683b329ea69b048b87fa13e +b83c0589b304cec9ede549fde54f8a7c2a468c6657da8c02169a6351605261202610b2055c639b9ed2d5b8c401fb8f56 +9370f326ea0f170c2c05fe2c5a49189f20aec93b6b18a5572a818cd4c2a6adb359e68975557b349fb54f065d572f4c92 +ac3232fa5ce6f03fca238bef1ce902432a90b8afce1c85457a6bee5571c033d4bceefafc863af04d4e85ac72a4d94d51 +80d9ea168ff821b22c30e93e4c7960ce3ad3c1e6deeebedd342a36d01bd942419b187e2f382dbfd8caa34cca08d06a48 +a387a3c61676fb3381eefa2a45d82625635a666e999aba30e3b037ec9e040f414f9e1ad9652abd3bcad63f95d85038db +a1b229fe32121e0b391b0f6e0180670b9dc89d79f7337de4c77ea7ad0073e9593846f06797c20e923092a08263204416 +92164a9d841a2b828cedf2511213268b698520f8d1285852186644e9a0c97512cafa4bfbe29af892c929ebccd102e998 +82ee2fa56308a67c7db4fd7ef539b5a9f26a1c2cc36da8c3206ba4b08258fbb3cec6fe5cdbd111433fb1ba2a1e275927 +8c77bfe9e191f190a49d46f05600603fa42345592539b82923388d72392404e0b29a493a15e75e8b068dddcd444c2928 +80b927f93ccf79dcf5c5b20bcf5a7d91d7a17bc0401bb7cc9b53a6797feac31026eb114257621f5a64a52876e4474cc1 +b6b68b6501c37804d4833d5a063dd108a46310b1400549074e3cac84acc6d88f73948b7ad48d686de89c1ec043ae8c1a +ab3da00f9bdc13e3f77624f58a3a18fc3728956f84b5b549d62f1033ae4b300538e53896e2d943f160618e05af265117 +b6830e87233b8eace65327fdc764159645b75d2fd4024bf8f313b2dd5f45617d7ecfb4a0b53ccafb5429815a9a1adde6 +b9251cfe32a6dc0440615aadcd98b6b1b46e3f4e44324e8f5142912b597ee3526bea2431e2b0282bb58f71be5b63f65e +af8d70711e81cdddfb39e67a1b76643292652584c1ce7ce4feb1641431ad596e75c9120e85f1a341e7a4da920a9cdd94 +98cd4e996594e89495c078bfd52a4586b932c50a449a7c8dfdd16043ca4cda94dafbaa8ad1b44249c99bbcc52152506e +b9fc6d1c24f48404a4a64fbe3e43342738797905db46e4132aee5f086aaa4c704918ad508aaefa455cfe1b36572e6242 +a365e871d30ba9291cedaba1be7b04e968905d003e9e1af7e3b55c5eb048818ae5b913514fb08b24fb4fbdccbb35d0b8 +93bf99510971ea9af9f1e364f1234c898380677c8e8de9b0dd24432760164e46c787bc9ec42a7ad450500706cf247b2d +b872f825a5b6e7b9c7a9ddfeded3516f0b1449acc9b4fd29fc6eba162051c17416a31e5be6d3563f424d28e65bab8b8f +b06b780e5a5e8eb4f4c9dc040f749cf9709c8a4c9ef15e925f442b696e41e5095db0778a6c73bcd329b265f2c6955c8b +848f1a981f5fc6cd9180cdddb8d032ad32cdfa614fc750d690dbae36cc0cd355cbf1574af9b3ffc8b878f1b2fafb9544 +a03f48cbff3e9e8a3a655578051a5ae37567433093ac500ed0021c6250a51b767afac9bdb194ee1e3eac38a08c0eaf45 +b5be78ce638ff8c4aa84352b536628231d3f7558c5be3bf010b28feac3022e64691fa672f358c8b663904aebe24a54ed +a9d4da70ff676fa55d1728ba6ab03b471fa38b08854d99e985d88c2d050102d8ccffbe1c90249a5607fa7520b15fe791 +8fe9f7092ffb0b69862c8e972fb1ecf54308c96d41354ed0569638bb0364f1749838d6d32051fff1599112978c6e229c +ae6083e95f37770ecae0df1e010456f165d96cfe9a7278c85c15cffd61034081ce5723e25e2bede719dc9341ec8ed481 +a260891891103089a7afbd9081ea116cfd596fd1015f5b65e10b0961eb37fab7d09c69b7ce4be8bf35e4131848fb3fe4 +8d729fa32f6eb9fd2f6a140bef34e8299a2f3111bffd0fe463aa8622c9d98bfd31a1df3f3e87cd5abc52a595f96b970e +a30ec6047ae4bc7da4daa7f4c28c93aedb1112cfe240e681d07e1a183782c9ff6783ac077c155af23c69643b712a533f +ac830726544bfe7b5467339e5114c1a75f2a2a8d89453ce86115e6a789387e23551cd64620ead6283dfa4538eb313d86 +8445c135b7a48068d8ed3e011c6d818cfe462b445095e2fbf940301e50ded23f272d799eea47683fc027430ce14613ef +95785411715c9ae9d8293ce16a693a2aa83e3cb1b4aa9f76333d0da2bf00c55f65e21e42e50e6c5772ce213dd7b4f7a0 +b273b024fa18b7568c0d1c4d2f0c4e79ec509dafac8c5951f14192d63ddbcf2d8a7512c1c1b615cc38fa3e336618e0c5 +a78b9d3ea4b6a90572eb27956f411f1d105fdb577ee2ffeec9f221da9b45db84bfe866af1f29597220c75e0c37a628d8 +a4be2bf058c36699c41513c4d667681ce161a437c09d81383244fc55e1c44e8b1363439d0cce90a3e44581fb31d49493 +b6eef13040f17dd4eba22aaf284d2f988a4a0c4605db44b8d2f4bf9567ac794550b543cc513c5f3e2820242dd704152e +87eb00489071fa95d008c5244b88e317a3454652dcb1c441213aa16b28cd3ecaa9b22fec0bdd483c1df71c37119100b1 +92d388acdcb49793afca329cd06e645544d2269234e8b0b27d2818c809c21726bc9cf725651b951e358a63c83dedee24 +ae27e219277a73030da27ab5603c72c8bd81b6224b7e488d7193806a41343dff2456132274991a4722fdb0ef265d04cd +97583e08ecb82bbc27c0c8476d710389fa9ffbead5c43001bd36c1b018f29faa98de778644883e51870b69c5ffb558b5 +90a799a8ce73387599babf6b7da12767c0591cadd36c20a7990e7c05ea1aa2b9645654ec65308ee008816623a2757a6a +a1b47841a0a2b06efd9ab8c111309cc5fc9e1d5896b3e42ed531f6057e5ade8977c29831ce08dbda40348386b1dcc06d +b92b8ef59bbddb50c9457691bc023d63dfcc54e0fd88bd5d27a09e0d98ac290fc90e6a8f6b88492043bf7c87fac8f3e4 +a9d6240b07d62e22ec8ab9b1f6007c975a77b7320f02504fc7c468b4ee9cfcfd945456ff0128bc0ef2174d9e09333f8d +8e96534c94693226dc32bca79a595ca6de503af635f802e86442c67e77564829756961d9b701187fe91318da515bf0e6 +b6ba290623cd8dd5c2f50931c0045d1cfb0c30877bc8fe58cbc3ff61ee8da100045a39153916efa1936f4aee0892b473 +b43baa7717fac02d4294f5b3bb5e58a65b3557747e3188b482410388daac7a9c177f762d943fd5dcf871273921213da8 +b9cf00f8fb5e2ef2b836659fece15e735060b2ea39b8e901d3dcbdcf612be8bf82d013833718c04cd46ffaa70b85f42e +8017d0c57419e414cbba504368723e751ef990cc6f05dad7b3c2de6360adc774ad95512875ab8337d110bf39a42026fa +ae7401048b838c0dcd4b26bb6c56d79d51964a0daba780970b6c97daee4ea45854ea0ac0e4139b3fe60dac189f84df65 +887b237b0cd0f816b749b21db0b40072f9145f7896c36916296973f9e6990ede110f14e5976c906d08987c9836cca57f +a88c3d5770148aee59930561ca1223aceb2c832fb5417e188dca935905301fc4c6c2c9270bc1dff7add490a125eb81c6 +b6cf9b02c0cd91895ad209e38c54039523f137b5848b9d3ad33ae43af6c20c98434952db375fe378de7866f2d0e8b18a +84ef3d322ff580c8ad584b1fe4fe346c60866eb6a56e982ba2cf3b021ecb1fdb75ecc6c29747adda86d9264430b3f816 +a0561c27224baf0927ad144cb71e31e54a064c598373fcf0d66aebf98ab7af1d8e2f343f77baefff69a6da750a219e11 +aa5cc43f5b8162b016f5e1b61214c0c9d15b1078911c650b75e6cdfb49b85ee04c6739f5b1687d15908444f691f732de +ad4ac099b935589c7b8fdfdf3db332b7b82bb948e13a5beb121ebd7db81a87d278024a1434bcf0115c54ca5109585c3d +8a00466abf3f109a1dcd19e643b603d3af23d42794ef8ca2514dd507ecea44a031ac6dbc18bd02f99701168b25c1791e +b00b5900dfad79645f8bee4e5adc7b84eb22e5b1e67df77ccb505b7fc044a6c08a8ea5faca662414eb945f874f884cea +950e204e5f17112250b22ea6bb8423baf522fc0af494366f18fe0f949f51d6e6812074a80875cf1ed9c8e7420058d541 +91e5cbf8bb1a1d50c81608c9727b414d0dd2fb467ebc92f100882a3772e54f94979cfdf8e373fdef7c7fcdd60fec9e00 +a093f6a857b8caaff80599c2e89c962b415ecbaa70d8fd973155fa976a284c6b29a855f5f7a3521134d00d2972755188 +b4d55a3551b00da54cc010f80d99ddd2544bde9219a3173dfaadf3848edc7e4056ab532fb75ac26f5f7141e724267663 +a03ea050fc9b011d1b04041b5765d6f6453a93a1819cd9bd6328637d0b428f08526466912895dcc2e3008ee58822e9a7 +99b12b3665e473d01bc6985844f8994fb65cb15745024fb7af518398c4a37ff215da8f054e8fdf3286984ae36a73ca5e +9972c7e7a7fb12e15f78d55abcaf322c11249cd44a08f62c95288f34f66b51f146302bce750ff4d591707075d9123bd2 +a64b4a6d72354e596d87cda213c4fc2814009461570ccb27d455bbe131f8d948421a71925425b546d8cf63d5458cd64b +91c215c73b195795ede2228b7ed1f6e37892e0c6b0f4a0b5a16c57aa1100c84df9239054a173b6110d6c2b7f4bf1ce52 +88807198910ec1303480f76a3683870246a995e36adaeadc29c22f0bdba8152fe705bd070b75de657b04934f7d0ccf80 +b37c0026c7b32eb02cacac5b55cb5fe784b8e48b2945c64d3037af83ece556a117f0ff053a5968c2f5fa230e291c1238 +94c768384ce212bc2387e91ce8b45e4ff120987e42472888a317abc9dcdf3563b62e7a61c8e98d7cdcbe272167d91fc6 +a10c2564936e967a390cb14ef6e8f8b04ea9ece5214a38837eda09e79e0c7970b1f83adf017c10efd6faa8b7ffa2c567 +a5085eed3a95f9d4b1269182ea1e0d719b7809bf5009096557a0674bde4201b0ddc1f0f16a908fc468846b3721748ce3 +87468eb620b79a0a455a259a6b4dfbc297d0d53336537b771254dd956b145dc816b195b7002647ea218552e345818a3f +ace2b77ffb87366af0a9cb5d27d6fc4a14323dbbf1643f5f3c4559306330d86461bb008894054394cbfaefeaa0bc2745 +b27f56e840a54fbd793f0b7a7631aa4cee64b5947e4382b2dfb5eb1790270288884c2a19afebe5dc0c6ef335d4531c1c +876e438633931f7f895062ee16c4b9d10428875f7bc79a8e156a64d379a77a2c45bf5430c5ab94330f03da352f1e9006 +a2512a252587d200d2092b44c914df54e04ff8bcef36bf631f84bde0cf5a732e3dc7f00f662842cfd74b0b0f7f24180e +827f1bc8f54a35b7a4bd8154f79bcc055e45faed2e74adf7cf21cca95df44d96899e847bd70ead6bb27b9c0ed97bbd8b +a0c92cf5a9ed843714f3aea9fe7b880f622d0b4a3bf66de291d1b745279accf6ba35097849691370f41732ba64b5966b +a63f5c1e222775658421c487b1256b52626c6f79cb55a9b7deb2352622cedffb08502042d622eb3b02c97f9c09f9c957 +8cc093d52651e65fb390e186db6cc4de559176af4624d1c44cb9b0e836832419dacac7b8db0627b96288977b738d785d +aa7b6a17dfcec146134562d32a12f7bd7fe9522e300859202a02939e69dbd345ed7ff164a184296268f9984f9312e8fc +8ac76721f0d2b679f023d06cbd28c85ae5f4b43c614867ccee88651d4101d4fd352dbdb65bf36bfc3ebc0109e4b0c6f9 +8d350f7c05fc0dcd9a1170748846fb1f5d39453e4cb31e6d1457bed287d96fc393b2ecc53793ca729906a33e59c6834a +b9913510dfc5056d7ec5309f0b631d1ec53e3a776412ada9aefdaf033c90da9a49fdde6719e7c76340e86599b1f0eec2 +94955626bf4ce87612c5cfffcf73bf1c46a4c11a736602b9ba066328dc52ad6d51e6d4f53453d4ed55a51e0aad810271 +b0fcab384fd4016b2f1e53f1aafd160ae3b1a8865cd6c155d7073ecc1664e05b1d8bca1def39c158c7086c4e1103345e +827de3f03edfbde08570b72de6662c8bfa499b066a0a27ebad9b481c273097d17a5a0a67f01553da5392ec3f149b2a78 +ab7940384c25e9027c55c40df20bd2a0d479a165ced9b1046958353cd69015eeb1e44ed2fd64e407805ba42df10fc7bf +8ad456f6ff8cd58bd57567d931f923d0c99141978511b17e03cab7390a72b9f62498b2893e1b05c7c22dd274e9a31919 +ac75399e999effe564672db426faa17a839e57c5ef735985c70cd559a377adec23928382767b55ed5a52f7b11b54b756 +b17f975a00b817299ac7af5f2024ea820351805df58b43724393bfb3920a8cd747a3bbd4b8286e795521489db3657168 +a2bed800a6d95501674d9ee866e7314063407231491d794f8cf57d5be020452729c1c7cefd8c50dc1540181f5caab248 +9743f5473171271ffdd3cc59a3ae50545901a7b45cd4bc3570db487865f3b73c0595bebabbfe79268809ee1862e86e4a +b7eab77c2d4687b60d9d7b04e842b3880c7940140012583898d39fcc22d9b9b0a9be2c2e3788b3e6f30319b39c338f09 +8e2b8f797a436a1b661140e9569dcf3e1eea0a77c7ff2bc4ff0f3e49af04ed2de95e255df8765f1d0927fb456a9926b1 +8aefea201d4a1f4ff98ffce94e540bb313f2d4dfe7e9db484a41f13fc316ed02b282e1acc9bc6f56cad2dc2e393a44c9 +b950c17c0e5ca6607d182144aa7556bb0efe24c68f06d79d6413a973b493bfdf04fd147a4f1ab03033a32004cc3ea66f +b7b8dcbb179a07165f2dc6aa829fad09f582a71b05c3e3ea0396bf9e6fe73076f47035c031c2101e8e38e0d597eadd30 +a9d77ed89c77ec1bf8335d08d41c3c94dcca9fd1c54f22837b4e54506b212aa38d7440126c80648ab7723ff18e65ed72 +a819d6dfd4aef70e52b8402fe5d135f8082d40eb7d3bb5c4d7997395b621e2bb10682a1bad2c9caa33dd818550fc3ec6 +8f6ee34128fac8bbf13ce2d68b2bb363eb4fd65b297075f88e1446ddeac242500eeb4ef0735e105882ff5ba8c44c139b +b4440e48255c1644bcecf3a1e9958f1ec4901cb5b1122ee5b56ffd02cad1c29c4266999dbb85aa2605c1b125490074d4 +a43304a067bede5f347775d5811cf65a6380a8d552a652a0063580b5c5ef12a0867a39c7912fa219e184f4538eba1251 +a891ad67a790089ffc9f6d53e6a3d63d3556f5f693e0cd8a7d0131db06fd4520e719cfcc3934f0a8f62a95f90840f1d4 +aea6df8e9bb871081aa0fc5a9bafb00be7d54012c5baf653791907d5042a326aeee966fd9012a582cc16695f5baf7042 +8ffa2660dc52ed1cd4eff67d6a84a8404f358a5f713d04328922269bee1e75e9d49afeec0c8ad751620f22352a438e25 +87ec6108e2d63b06abed350f8b363b7489d642486f879a6c3aa90e5b0f335efc2ff2834eef9353951a42136f8e6a1b32 +865619436076c2760d9e87ddc905023c6de0a8d56eef12c98a98c87837f2ca3f27fd26a2ad752252dbcbe2b9f1d5a032 +980437dce55964293cb315c650c5586ffd97e7a944a83f6618af31c9d92c37b53ca7a21bb5bc557c151b9a9e217e7098 +95d128fc369df4ad8316b72aea0ca363cbc7b0620d6d7bb18f7076a8717a6a46956ff140948b0cc4f6d2ce33b5c10054 +8c7212d4a67b9ec70ebbca04358ad2d36494618d2859609163526d7b3acc2fc935ca98519380f55e6550f70a9bc76862 +893a2968819401bf355e85eee0f0ed0406a6d4a7d7f172d0017420f71e00bb0ba984f6020999a3cdf874d3cd8ebcd371 +9103c1af82dece25d87274e89ea0acd7e68c2921c4af3d8d7c82ab0ed9990a5811231b5b06113e7fa43a6bd492b4564f +99cfd87a94eab7d35466caa4ed7d7bb45e5c932b2ec094258fb14bf205659f83c209b83b2f2c9ccb175974b2a33e7746 +874b6b93e4ee61be3f00c32dd84c897ccd6855c4b6251eb0953b4023634490ed17753cd3223472873cbc6095b2945075 +84a32c0dc4ea60d33aac3e03e70d6d639cc9c4cc435c539eff915017be3b7bdaba33349562a87746291ebe9bc5671f24 +a7057b24208928ad67914e653f5ac1792c417f413d9176ba635502c3f9c688f7e2ee81800d7e3dc0a340c464da2fd9c5 +a03fb9ed8286aacfa69fbd5d953bec591c2ae4153400983d5dbb6cd9ea37fff46ca9e5cceb9d117f73e9992a6c055ad2 +863b2de04e89936c9a4a2b40380f42f20aefbae18d03750fd816c658aee9c4a03df7b12121f795c85d01f415baaeaa59 +8526eb9bd31790fe8292360d7a4c3eed23be23dd6b8b8f01d2309dbfdc0cfd33ad1568ddd7f8a610f3f85a9dfafc6a92 +b46ab8c5091a493d6d4d60490c40aa27950574a338ea5bbc045be3a114af87bdcb160a8c80435a9b7ad815f3cb56a3f3 +aeadc47b41a8d8b4176629557646202f868b1d728b2dda58a347d937e7ffc8303f20d26d6c00b34c851b8aeec547885d +aebb19fc424d72c1f1822aa7adc744cd0ef7e55727186f8df8771c784925058c248406ebeeaf3c1a9ee005a26e9a10c6 +8ff96e81c1a4a2ab1b4476c21018fae0a67e92129ee36120cae8699f2d7e57e891f5c624902cb1b845b944926a605cc3 +8251b8d2c43fadcaa049a9e7aff838dae4fb32884018d58d46403ac5f3beb5c518bfd45f03b8abb710369186075eb71c +a8b2a64f865f51a5e5e86a66455c093407933d9d255d6b61e1fd81ffafc9538d73caaf342338a66ba8ee166372a3d105 +aad915f31c6ba7fdc04e2aaac62e84ef434b7ee76a325f07dc430d12c84081999720181067b87d792efd0117d7ee1eab +a13db3bb60389883fd41d565c54fb5180d9c47ce2fe7a169ae96e01d17495f7f4fa928d7e556e7c74319c4c25d653eb2 +a4491b0198459b3f552855d680a59214eb74e6a4d6c5fa3b309887dc50ebea2ecf6d26c040550f7dc478b452481466fb +8f017f13d4b1e3f0c087843582b52d5f8d13240912254d826dd11f8703a99a2f3166dfbdfdffd9a3492979d77524276b +96c3d5dcd032660d50d7cd9db2914f117240a63439966162b10c8f1f3cf74bc83b0f15451a43b31dbd85e4a7ce0e4bb1 +b479ec4bb79573d32e0ec93b92bdd7ec8c26ddb5a2d3865e7d4209d119fd3499eaac527615ffac78c440e60ef3867ae0 +b2c49c4a33aa94b52b6410b599e81ff15490aafa7e43c8031c865a84e4676354a9c81eb4e7b8be6825fdcefd1e317d44 +906dc51d6a90c089b6704b47592805578a6eed106608eeb276832f127e1b8e858b72e448edcbefb497d152447e0e68ff +b0e81c63b764d7dfbe3f3fddc9905aef50f3633e5d6a4af6b340495124abedcff5700dfd1577bbbed7b6bf97d02719cb +9304c64701e3b4ed6d146e48a881f7d83a17f58357cca0c073b2bb593afd2d94f6e2a7a1ec511d0a67ad6ff4c3be5937 +b6fdbd12ba05aa598d80b83f70a15ef90e5cba7e6e75fa038540ee741b644cd1f408a6cecfd2a891ef8d902de586c6b5 +b80557871a6521b1b3c74a1ba083ae055b575df607f1f7b04c867ba8c8c181ea68f8d90be6031f4d25002cca27c44da2 +aa7285b8e9712e06b091f64163f1266926a36607f9d624af9996856ed2aaf03a580cb22ce407d1ade436c28b44ca173f +8148d72b975238b51e6ea389e5486940d22641b48637d7dfadfa603a605bfc6d74a016480023945d0b85935e396aea5d +8a014933a6aea2684b5762af43dcf4bdbb633cd0428d42d71167a2b6fc563ece5e618bff22f1db2ddb69b845b9a2db19 +990d91740041db770d0e0eb9d9d97d826f09fd354b91c41e0716c29f8420e0e8aac0d575231efba12fe831091ec38d5a +9454d0d32e7e308ddec57cf2522fb1b67a2706e33fb3895e9e1f18284129ab4f4c0b7e51af25681d248d7832c05eb698 +a5bd434e75bac105cb3e329665a35bce6a12f71dd90c15165777d64d4c13a82bceedb9b48e762bd24034e0fc9fbe45f4 +b09e3b95e41800d4dc29c6ffdaab2cd611a0050347f6414f154a47ee20ee59bf8cf7181454169d479ebce1eb5c777c46 +b193e341d6a047d15eea33766d656d807b89393665a783a316e9ba10518e5515c8e0ade3d6e15641d917a8a172a5a635 +ade435ec0671b3621dde69e07ead596014f6e1daa1152707a8c18877a8b067bde2895dd47444ffa69db2bbef1f1d8816 +a7fd3d6d87522dfc56fb47aef9ce781a1597c56a8bbfd796baba907afdc872f753d732bfda1d3402aee6c4e0c189f52d +a298cb4f4218d0464b2fab393e512bbc477c3225aa449743299b2c3572f065bc3a42d07e29546167ed9e1b6b3b3a3af3 +a9ee57540e1fd9c27f4f0430d194b91401d0c642456c18527127d1f95e2dba41c2c86d1990432eb38a692fda058fafde +81d6c1a5f93c04e6d8e5a7e0678c1fc89a1c47a5c920bcd36180125c49fcf7c114866b90e90a165823560b19898a7c16 +a4b7a1ec9e93c899b9fd9aaf264c50e42c36c0788d68296a471f7a3447af4dbc81e4fa96070139941564083ec5b5b5a1 +b3364e327d381f46940c0e11e29f9d994efc6978bf37a32586636c0070b03e4e23d00650c1440f448809e1018ef9f6d8 +8056e0913a60155348300e3a62e28b5e30629a90f7dd4fe11289097076708110a1d70f7855601782a3cdc5bdb1ca9626 +b4980fd3ea17bac0ba9ee1c470b17e575bb52e83ebdd7d40c93f4f87bebeaff1c8a679f9d3d09d635f068d37d5bd28bd +905a9299e7e1853648e398901dfcd437aa575c826551f83520df62984f5679cb5f0ea86aa45ed3e18b67ddc0dfafe809 +ab99553bf31a84f2e0264eb34a08e13d8d15e2484aa9352354becf9a15999c76cc568d68274b70a65e49703fc23540d0 +a43681597bc574d2dae8964c9a8dc1a07613d7a1272bdcb818d98c85d44e16d744250c33f3b5e4d552d97396b55e601f +a54e5a31716fccb50245898c99865644405b8dc920ded7a11f3d19bdc255996054b268e16f2e40273f11480e7145f41e +8134f3ad5ef2ad4ba12a8a4e4d8508d91394d2bcdc38b7c8c8c0b0a820357ac9f79d286c65220f471eb1adca1d98fc68 +94e2f755e60471578ab2c1adb9e9cea28d4eec9b0e92e0140770bca7002c365fcabfe1e5fb4fe6cfe79a0413712aa3ef +ad48f8d0ce7eb3cc6e2a3086ad96f562e5bed98a360721492ae2e74dc158586e77ec8c35d5fd5927376301b7741bad2b +8614f0630bdd7fbad3a31f55afd9789f1c605dc85e7dc67e2edfd77f5105f878bb79beded6e9f0b109e38ea7da67e8d5 +9804c284c4c5e77dabb73f655b12181534ca877c3e1e134aa3f47c23b7ec92277db34d2b0a5d38d2b69e5d1c3008a3e3 +a51b99c3088e473afdaa9e0a9f7e75a373530d3b04e44e1148da0726b95e9f5f0c7e571b2da000310817c36f84b19f7f +ac4ff909933b3b76c726b0a382157cdc74ab851a1ac6cef76953c6444441804cc43abb883363f416592e8f6cfbc4550b +ae7d915eb9fc928b65a29d6edbc75682d08584d0014f7bcf17d59118421ae07d26a02137d1e4de6938bcd1ab8ef48fad +852f7e453b1af89b754df6d11a40d5d41ea057376e8ecacd705aacd2f917457f4a093d6b9a8801837fa0f62986ad7149 +92c6bf5ada5d0c3d4dd8058483de36c215fa98edab9d75242f3eff9db07c734ad67337da6f0eefe23a487bf75a600dee +a2b42c09d0db615853763552a48d2e704542bbd786aae016eb58acbf6c0226c844f5fb31e428cb6450b9db855f8f2a6f +880cc07968266dbfdcfbc21815cd69e0eddfee239167ac693fb0413912d816f2578a74f7716eecd6deefa68c6eccd394 +b885b3ace736cd373e8098bf75ba66fa1c6943ca1bc4408cd98ac7074775c4478594f91154b8a743d9c697e1b29f5840 +a51ce78de512bd87bfa0835de819941dffbf18bec23221b61d8096fc9436af64e0693c335b54e7bfc763f287bdca2db6 +a3c76166a3bdb9b06ef696e57603b58871bc72883ee9d45171a30fe6e1d50e30bc9c51b4a0f5a7270e19a77b89733850 +acefc5c6f8a1e7c24d7b41e0fc7f6f3dc0ede6cf3115ffb9a6e54b1d954cbca9bda8ad7a084be9be245a1b8e9770d141 +b420ed079941842510e31cfad117fa11fb6b4f97dfbc6298cb840f27ebaceba23eeaf3f513bcffbf5e4aae946310182d +95c3bb5ef26c5ed2f035aa5d389c6b3c15a6705b9818a3fefaed28922158b35642b2e8e5a1a620fdad07e75ad4b43af4 +825149f9081ecf07a2a4e3e8b5d21bade86c1a882475d51c55ee909330b70c5a2ac63771c8600c6f38df716af61a3ea1 +873b935aae16d9f08adbc25353cee18af2f1b8d5f26dec6538d6bbddc515f2217ed7d235dcfea59ae61b428798b28637 +9294150843a2bedcedb3bb74c43eb28e759cf9499582c5430bccefb574a8ddd4f11f9929257ff4c153990f9970a2558f +b619563a811cc531da07f4f04e5c4c6423010ff9f8ed7e6ec9449162e3d501b269fb1c564c09c0429431879b0f45df02 +91b509b87eb09f007d839627514658c7341bc76d468920fe8a740a8cb96a7e7e631e0ea584a7e3dc1172266f641d0f5c +8b8aceace9a7b9b4317f1f01308c3904d7663856946afbcea141a1c615e21ccad06b71217413e832166e9dd915fbe098 +87b3b36e725833ea0b0f54753c3728c0dbc87c52d44d705ffc709f2d2394414c652d3283bab28dcce09799504996cee0 +b2670aad5691cbf308e4a6a77a075c4422e6cbe86fdba24e9f84a313e90b0696afb6a067eebb42ba2d10340d6a2f6e51 +876784a9aff3d54faa89b2bacd3ff5862f70195d0b2edc58e8d1068b3c9074c0da1cfa23671fe12f35e33b8a329c0ccd +8b48b9e758e8a8eae182f5cbec96f67d20cca6d3eee80a2d09208eb1d5d872e09ef23d0df8ebbb9b01c7449d0e3e3650 +b79303453100654c04a487bdcadc9e3578bc80930c489a7069a52e8ca1dba36c492c8c899ce025f8364599899baa287d +961b35a6111da54ece6494f24dacd5ea46181f55775b5f03df0e370c34a5046ac2b4082925855325bb42bc2a2c98381d +a31feb1be3f5a0247a1f7d487987eb622e34fca817832904c6ee3ee60277e5847945a6f6ea1ac24542c72e47bdf647df +a12a2aa3e7327e457e1aae30e9612715dd2cfed32892c1cd6dcda4e9a18203af8a44afb46d03b2eed89f6b9c5a2c0c23 +a08265a838e69a2ca2f80fead6ccf16f6366415b920c0b22ee359bcd8d4464ecf156f400a16a7918d52e6d733dd64211 +b723d6344e938d801cca1a00032af200e541d4471fd6cbd38fb9130daa83f6a1dffbbe7e67fc20f9577f884acd7594b2 +a6733d83ec78ba98e72ddd1e7ff79b7adb0e559e256760d0c590a986e742445e8cdf560d44b29439c26d87edd0b07c8c +a61c2c27d3f7b9ff4695a17afedf63818d4bfba390507e1f4d0d806ce8778d9418784430ce3d4199fd3bdbc2504d2af3 +8332f3b63a6dc985376e8b1b25eeae68be6160fbe40053ba7bcf6f073204f682da72321786e422d3482fd60c9e5aa034 +a280f44877583fbb6b860d500b1a3f572e3ee833ec8f06476b3d8002058e25964062feaa1e5bec1536d734a5cfa09145 +a4026a52d277fcea512440d2204f53047718ebfcae7b48ac57ea7f6bfbc5de9d7304db9a9a6cbb273612281049ddaec5 +95cdf69c831ab2fad6c2535ede9c07e663d2ddccc936b64e0843d2df2a7b1c31f1759c3c20f1e7a57b1c8f0dbb21b540 +95c96cec88806469c277ab567863c5209027cecc06c7012358e5f555689c0d9a5ffb219a464f086b45817e8536b86d2f +afe38d4684132a0f03d806a4c8df556bf589b25271fbc6fe2e1ed16de7962b341c5003755da758d0959d2e6499b06c68 +a9b77784fda64987f97c3a23c5e8f61b918be0f7c59ba285084116d60465c4a2aaafc8857eb16823282cc83143eb9126 +a830f05881ad3ce532a55685877f529d32a5dbe56cea57ffad52c4128ee0fad0eeaf0da4362b55075e77eda7babe70e5 +992b3ad190d6578033c13ed5abfee4ef49cbc492babb90061e3c51ee4b5790cdd4c8fc1abff1fa2c00183b6b64f0bbbe +b1015424d9364aeff75de191652dc66484fdbec3e98199a9eb9671ec57bec6a13ff4b38446e28e4d8aedb58dd619cd90 +a745304604075d60c9db36cada4063ac7558e7ec2835d7da8485e58d8422e817457b8da069f56511b02601289fbb8981 +a5ba4330bc5cb3dbe0486ddf995632a7260a46180a08f42ae51a2e47778142132463cc9f10021a9ad36986108fefa1a9 +b419e9fd4babcaf8180d5479db188bb3da232ae77a1c4ed65687c306e6262f8083070a9ac32220cddb3af2ec73114092 +a49e23dc5f3468f3bf3a0bb7e4a114a788b951ff6f23a3396ae9e12cbff0abd1240878a3d1892105413dbc38818e807c +b7ecc7b4831f650202987e85b86bc0053f40d983f252e9832ef503aea81c51221ce93279da4aa7466c026b2d2070e55d +96a8c35cb87f84fa84dcd6399cc2a0fd79cc9158ef4bdde4bae31a129616c8a9f2576cd19baa3f497ca34060979aed7d +8681b2c00aa62c2b519f664a95dcb8faef601a3b961bb4ce5d85a75030f40965e2983871d41ea394aee934e859581548 +85c229a07efa54a713d0790963a392400f55fbb1a43995a535dc6c929f20d6a65cf4efb434e0ad1cb61f689b8011a3bc +90856f7f3444e5ad44651c28e24cc085a5db4d2ffe79aa53228c26718cf53a6e44615f3c5cda5aa752d5f762c4623c66 +978999b7d8aa3f28a04076f74d11c41ef9c89fdfe514936c4238e0f13c38ec97e51a5c078ebc6409e517bfe7ccb42630 +a099914dd7ed934d8e0d363a648e9038eb7c1ec03fa04dbcaa40f7721c618c3ef947afef7a16b4d7ac8c12aa46637f03 +ab2a104fed3c83d16f2cda06878fa5f30c8c9411de71bfb67fd2fc9aa454dcbcf3d299d72f8cc12e919466a50fcf7426 +a4471d111db4418f56915689482f6144efc4664cfb0311727f36c864648d35734351becc48875df96f4abd3cfcf820f9 +83be11727cd30ea94ccc8fa31b09b81c9d6a9a5d3a4686af9da99587332fe78c1f94282f9755854bafd6033549afec91 +88020ff971dc1a01a9e993cd50a5d2131ffdcbb990c1a6aaa54b20d8f23f9546a70918ea57a21530dcc440c1509c24ad +ae24547623465e87905eaffa1fa5d52bb7c453a8dbd89614fa8819a2abcedaf455c2345099b7324ae36eb0ad7c8ef977 +b59b0c60997de1ee00b7c388bc7101d136c9803bf5437b1d589ba57c213f4f835a3e4125b54738e78abbc21b000f2016 +a584c434dfe194546526691b68fa968c831c31da42303a1d735d960901c74011d522246f37f299555416b8cf25c5a548 +80408ce3724f4837d4d52376d255e10f69eb8558399ae5ca6c11b78b98fe67d4b93157d2b9b639f1b5b64198bfe87713 +abb941e8d406c2606e0ddc35c113604fdd9d249eacc51cb64e2991e551b8639ce44d288cc92afa7a1e7fc599cfc84b22 +b223173f560cacb1c21dba0f1713839e348ad02cbfdef0626748604c86f89e0f4c919ed40b583343795bdd519ba952c8 +af1c70512ec3a19d98b8a1fc3ff7f7f5048a27d17d438d43f561974bbdd116fcd5d5c21040f3447af3f0266848d47a15 +8a44809568ebe50405bede19b4d2607199159b26a1b33e03d180e6840c5cf59d991a4fb150d111443235d75ecad085b7 +b06207cdca46b125a27b3221b5b50cf27af4c527dd7c80e2dbcebbb09778a96df3af67e50f07725239ce3583dad60660 +993352d9278814ec89b26a11c4a7c4941bf8f0e6781ae79559d14749ee5def672259792db4587f85f0100c7bb812f933 +9180b8a718b971fd27bc82c8582d19c4b4f012453e8c0ffeeeffe745581fc6c07875ab28be3af3fa3896d19f0c89ac5b +8b8e1263eb48d0fe304032dd5ea1f30e73f0121265f7458ba9054d3626894e8a5fef665340abd2ede9653045c2665938 +99a2beee4a10b7941c24b2092192faf52b819afd033e4a2de050fd6c7f56d364d0cf5f99764c3357cf32399e60fc5d74 +946a4aad7f8647ea60bee2c5fcdeb6f9a58fb2cfca70c4d10e458027a04846e13798c66506151be3df9454b1e417893f +a672a88847652d260b5472d6908d1d57e200f1e492d30dd1cecc441cdfc9b76e016d9bab560efd4d7f3c30801de884a9 +9414e1959c156cde1eb24e628395744db75fc24b9df4595350aaad0bc38e0246c9b4148f6443ef68b8e253a4a6bcf11c +9316e9e4ec5fab4f80d6540df0e3a4774db52f1d759d2e5b5bcd3d7b53597bb007eb1887cb7dc61f62497d51ffc8d996 +902d6d77bb49492c7a00bc4b70277bc28c8bf9888f4307bb017ac75a962decdedf3a4e2cf6c1ea9f9ba551f4610cbbd7 +b07025a18b0e32dd5e12ec6a85781aa3554329ea12c4cd0d3b2c22e43d777ef6f89876dd90a9c8fb097ddf61cf18adc5 +b355a849ad3227caa4476759137e813505ec523cbc2d4105bc7148a4630f9e81918d110479a2d5f5e4cd9ccec9d9d3e3 +b49532cfdf02ee760109881ad030b89c48ee3bb7f219ccafc13c93aead754d29bdafe345be54c482e9d5672bd4505080 +9477802410e263e4f938d57fa8f2a6cac7754c5d38505b73ee35ea3f057aad958cb9722ba6b7b3cfc4524e9ca93f9cdc +9148ea83b4436339580f3dbc9ba51509e9ab13c03063587a57e125432dd0915f5d2a8f456a68f8fff57d5f08c8f34d6e +b00b6b5392b1930b54352c02b1b3b4f6186d20bf21698689bbfc7d13e86538a4397b90e9d5c93fd2054640c4dbe52a4f +926a9702500441243cd446e7cbf15dde16400259726794694b1d9a40263a9fc9e12f7bcbf12a27cb9aaba9e2d5848ddc +a0c6155f42686cbe7684a1dc327100962e13bafcf3db97971fc116d9f5c0c8355377e3d70979cdbd58fd3ea52440901c +a277f899f99edb8791889d0817ea6a96c24a61acfda3ad8c3379e7c62b9d4facc4b965020b588651672fd261a77f1bfc +8f528cebb866b501f91afa50e995234bef5bf20bff13005de99cb51eaac7b4f0bf38580cfd0470de40f577ead5d9ba0f +963fc03a44e9d502cc1d23250efef44d299befd03b898d07ce63ca607bb474b5cf7c965a7b9b0f32198b04a8393821f7 +ab087438d0a51078c378bf4a93bd48ef933ff0f1fa68d02d4460820df564e6642a663b5e50a5fe509527d55cb510ae04 +b0592e1f2c54746bb076be0fa480e1c4bebc4225e1236bcda3b299aa3853e3afb401233bdbcfc4a007b0523a720fbf62 +851613517966de76c1c55a94dc4595f299398a9808f2d2f0a84330ba657ab1f357701d0895f658c18a44cb00547f6f57 +a2fe9a1dd251e72b0fe4db27be508bb55208f8f1616b13d8be288363ec722826b1a1fd729fc561c3369bf13950bf1fd6 +b896cb2bc2d0c77739853bc59b0f89b2e008ba1f701c9cbe3bef035f499e1baee8f0ff1e794854a48c320586a2dfc81a +a1b60f98e5e5106785a9b81a85423452ee9ef980fa7fa8464f4366e73f89c50435a0c37b2906052b8e58e212ebd366cf +a853b0ebd9609656636df2e6acd5d8839c0fda56f7bf9288a943b06f0b67901a32b95e016ca8bc99bd7b5eab31347e72 +b290fa4c1346963bd5225235e6bdf7c542174dab4c908ab483d1745b9b3a6015525e398e1761c90e4b49968d05e30eea +b0f65a33ad18f154f1351f07879a183ad62e5144ad9f3241c2d06533dad09cbb2253949daff1bb02d24d16a3569f7ef0 +a00db59b8d4218faf5aeafcd39231027324408f208ec1f54d55a1c41228b463b88304d909d16b718cfc784213917b71e +b8d695dd33dc2c3bc73d98248c535b2770ad7fa31aa726f0aa4b3299efb0295ba9b4a51c71d314a4a1bd5872307534d1 +b848057cca2ca837ee49c42b88422303e58ea7d2fc76535260eb5bd609255e430514e927cc188324faa8e657396d63ec +92677836061364685c2aaf0313fa32322746074ed5666fd5f142a7e8f87135f45cd10e78a17557a4067a51dfde890371 +a854b22c9056a3a24ab164a53e5c5cf388616c33e67d8ebb4590cb16b2e7d88b54b1393c93760d154208b5ca822dc68f +86fff174920388bfab841118fb076b2b0cdec3fdb6c3d9a476262f82689fb0ed3f1897f7be9dbf0932bb14d346815c63 +99661cf4c94a74e182752bcc4b98a8c2218a8f2765642025048e12e88ba776f14f7be73a2d79bd21a61def757f47f904 +8a8893144d771dca28760cba0f950a5d634195fd401ec8cf1145146286caffb0b1a6ba0c4c1828d0a5480ce49073c64c +938a59ae761359ee2688571e7b7d54692848eb5dde57ffc572b473001ea199786886f8c6346a226209484afb61d2e526 +923f68a6aa6616714cf077cf548aeb845bfdd78f2f6851d8148cba9e33a374017f2f3da186c39b82d14785a093313222 +ac923a93d7da7013e73ce8b4a2b14b8fd0cc93dc29d5de941a70285bdd19be4740fedfe0c56b046689252a3696e9c5bc +b49b32c76d4ec1a2c68d4989285a920a805993bc6fcce6dacd3d2ddae73373050a5c44ba8422a3781050682fa0ef6ba2 +8a367941c07c3bdca5712524a1411bad7945c7c48ffc7103b1d4dff2c25751b0624219d1ccde8c3f70c465f954be5445 +b838f029df455efb6c530d0e370bbbf7d87d61a9aea3d2fe5474c5fe0a39cf235ceecf9693c5c6c5820b1ba8f820bd31 +a8983b7c715eaac7f13a001d2abc462dfc1559dab4a6b554119c271aa8fe00ffcf6b6949a1121f324d6d26cb877bcbae +a2afb24ad95a6f14a6796315fbe0d8d7700d08f0cfaf7a2abe841f5f18d4fecf094406cbd54da7232a159f9c5b6e805e +87e8e95ad2d62f947b2766ff405a23f7a8afba14e7f718a691d95369c79955cdebe24c54662553c60a3f55e6322c0f6f +87c2cbcecb754e0cc96128e707e5c5005c9de07ffd899efa3437cadc23362f5a1d3fcdd30a1f5bdc72af3fb594398c2a +91afd6ee04f0496dc633db88b9370d41c428b04fd991002502da2e9a0ef051bcd7b760e860829a44fbe5539fa65f8525 +8c50e5d1a24515a9dd624fe08b12223a75ca55196f769f24748686315329b337efadca1c63f88bee0ac292dd0a587440 +8a07e8f912a38d94309f317c32068e87f68f51bdfa082d96026f5f5f8a2211621f8a3856dda8069386bf15fb2d28c18f +94ad1dbe341c44eeaf4dc133eed47d8dbfe752575e836c075745770a6679ff1f0e7883b6aa917462993a7f469d74cab5 +8745f8bd86c2bb30efa7efb7725489f2654f3e1ac4ea95bd7ad0f3cfa223055d06c187a16192d9d7bdaea7b050c6a324 +900d149c8d79418cda5955974c450a70845e02e5a4ecbcc584a3ca64d237df73987c303e3eeb79da1af83bf62d9e579f +8f652ab565f677fb1a7ba03b08004e3cda06b86c6f1b0b9ab932e0834acf1370abb2914c15b0d08327b5504e5990681c +9103097d088be1f75ab9d3da879106c2f597e2cc91ec31e73430647bdd5c33bcfd771530d5521e7e14df6acda44f38a6 +b0fec7791cfb0f96e60601e1aeced9a92446b61fedab832539d1d1037558612d78419efa87ff5f6b7aab8fd697d4d9de +b9d2945bdb188b98958854ba287eb0480ef614199c4235ce5f15fc670b8c5ffe8eeb120c09c53ea8a543a022e6a321ac +a9461bb7d5490973ebaa51afc0bb4a5e42acdccb80e2f939e88b77ac28a98870e103e1042899750f8667a8cc9123bae9 +a37fdf11d4bcb2aed74b9f460a30aa34afea93386fa4cdb690f0a71bc58f0b8df60bec56e7a24f225978b862626fa00e +a214420e183e03d531cf91661466ea2187d84b6e814b8b20b3730a9400a7d25cf23181bb85589ebc982cec414f5c2923 +ad09a45a698a6beb3e0915f540ef16e9af7087f53328972532d6b5dfe98ce4020555ece65c6cbad8bd6be8a4dfefe6fd +ab6742800b02728c92d806976764cb027413d6f86edd08ad8bb5922a2969ee9836878cd39db70db0bd9a2646862acc4f +974ca9305bd5ea1dc1755dff3b63e8bfe9f744321046c1395659bcea2a987b528e64d5aa96ac7b015650b2253b37888d +84eee9d6bce039c52c2ebc4fccc0ad70e20c82f47c558098da4be2f386a493cbc76adc795b5488c8d11b6518c2c4fab8 +875d7bda46efcb63944e1ccf760a20144df3b00d53282b781e95f12bfc8f8316dfe6492c2efbf796f1150e36e436e9df +b68a2208e0c587b5c31b5f6cb32d3e6058a9642e2d9855da4f85566e1412db528475892060bb932c55b3a80877ad7b4a +ba006368ecab5febb6ab348644d9b63de202293085ed468df8bc24d992ae8ce468470aa37f36a73630c789fb9c819b30 +90a196035150846cd2b482c7b17027471372a8ce7d914c4d82b6ea7fa705d8ed5817bd42d63886242585baf7d1397a1c +a223b4c85e0daa8434b015fd9170b5561fe676664b67064974a1e9325066ecf88fc81f97ab5011c59fad28cedd04b240 +82e8ec43139cf15c6bbeed484b62e06cded8a39b5ce0389e4cbe9c9e9c02f2f0275d8d8d4e8dfec8f69a191bef220408 +81a3fc07a7b68d92c6ee4b6d28f5653ee9ec85f7e2ee1c51c075c1b130a8c5097dc661cf10c5aff1c7114b1a6a19f11a +8ed2ef8331546d98819a5dd0e6c9f8cb2630d0847671314a28f277faf68da080b53891dd75c82cbcf7788b255490785d +acecabf84a6f9bbed6b2fc2e7e4b48f02ef2f15e597538a73aea8f98addc6badda15e4695a67ecdb505c1554e8f345ec +b8f51019b2aa575f8476e03dcadf86cc8391f007e5f922c2a36b2daa63f5a503646a468990cd5c65148d323942193051 +aaa595a84b403ec65729bc1c8055a94f874bf9adddc6c507b3e1f24f79d3ad359595a672b93aab3394db4e2d4a7d8970 +895144c55fcbd0f64d7dd69e6855cfb956e02b5658eadf0f026a70703f3643037268fdd673b0d21b288578a83c6338dd +a2e92ae6d0d237d1274259a8f99d4ea4912a299816350b876fba5ebc60b714490e198a916e1c38c6e020a792496fa23c +a45795fda3b5bb0ad1d3c628f6add5b2a4473a1414c1a232e80e70d1cfffd7f8a8d9861f8df2946999d7dbb56bf60113 +b6659bf7f6f2fef61c39923e8c23b8c70e9c903028d8f62516d16755cd3fba2fe41c285aa9432dc75ab08f8a1d8a81fc +a735609a6bc5bfd85e58234fc439ff1f58f1ff1dd966c5921d8b649e21f006bf2b8642ad8a75063c159aaf6935789293 +a3c622eb387c9d15e7bda2e3e84d007cb13a6d50d655c3f2f289758e49d3b37b9a35e4535d3cc53d8efd51f407281f19 +8afe147b53ad99220f5ef9d763bfc91f9c20caecbcf823564236fb0e6ede49414c57d71eec4772c8715cc65a81af0047 +b5f0203233cf71913951e9c9c4e10d9243e3e4a1f2cb235bf3f42009120ba96e04aa414c9938ea8873b63148478927e8 +93c52493361b458d196172d7ba982a90a4f79f03aa8008edc322950de3ce6acf4c3977807a2ffa9e924047e02072b229 +b9e72b805c8ac56503f4a86c82720afbd5c73654408a22a2ac0b2e5caccdfb0e20b59807433a6233bc97ae58cf14c70a +af0475779b5cee278cca14c82da2a9f9c8ef222eb885e8c50cca2315fea420de6e04146590ed0dd5a29c0e0812964df5 +b430ccab85690db02c2d0eb610f3197884ca12bc5f23c51e282bf3a6aa7e4a79222c3d8761454caf55d6c01a327595f9 +830032937418b26ee6da9b5206f3e24dc76acd98589e37937e963a8333e5430abd6ce3dd93ef4b8997bd41440eed75d6 +8820a6d73180f3fe255199f3f175c5eb770461ad5cfdde2fb11508041ed19b8c4ce66ad6ecebf7d7e836cc2318df47ca +aef1393e7d97278e77bbf52ef6e1c1d5db721ccf75fe753cf47a881fa034ca61eaa5098ee5a344c156d2b14ff9e284ad +8a4a26c07218948c1196c45d927ef4d2c42ade5e29fe7a91eaebe34a29900072ce5194cf28d51f746f4c4c649daf4396 +84011dc150b7177abdcb715efbd8c201f9cb39c36e6069af5c50a096021768ba40cef45b659c70915af209f904ede3b6 +b1bd90675411389bb66910b21a4bbb50edce5330850c5ab0b682393950124252766fc81f5ecfc72fb7184387238c402e +8dfdcd30583b696d2c7744655f79809f451a60c9ad5bf1226dc078b19f4585d7b3ef7fa9d54e1ac09520d95cbfd20928 +b351b4dc6d98f75b8e5a48eb7c6f6e4b78451991c9ba630e5a1b9874c15ac450cd409c1a024713bf2cf82dc400e025ef +a462b8bc97ac668b97b28b3ae24b9f5de60e098d7b23ecb600d2194cd35827fb79f77c3e50d358f5bd72ee83fef18fa0 +a183753265c5f7890270821880cce5f9b2965b115ba783c6dba9769536f57a04465d7da5049c7cf8b3fcf48146173c18 +a8a771b81ed0d09e0da4d79f990e58eabcd2be3a2680419502dd592783fe52f657fe55125b385c41d0ba3b9b9cf54a83 +a71ec577db46011689d073245e3b1c3222a9b1fe6aa5b83629adec5733dd48617ebea91346f0dd0e6cdaa86e4931b168 +a334b8b244f0d598a02da6ae0f918a7857a54dce928376c4c85df15f3b0f2ba3ac321296b8b7c9dd47d770daf16c8f8c +a29037f8ef925c417c90c4df4f9fb27fb977d04e2b3dd5e8547d33e92ab72e7a00f5461de21e28835319eae5db145eb7 +b91054108ae78b00e3298d667b913ebc44d8f26e531eae78a8fe26fdfb60271c97efb2dee5f47ef5a3c15c8228138927 +926c13efbe90604f6244be9315a34f72a1f8d1aab7572df431998949c378cddbf2fe393502c930fff614ff06ae98a0ce +995c758fd5600e6537089b1baa4fbe0376ab274ff3e82a17768b40df6f91c2e443411de9cafa1e65ea88fb8b87d504f4 +9245ba307a7a90847da75fca8d77ec03fdfc812c871e7a2529c56a0a79a6de16084258e7a9ac4ae8a3756f394336e21c +99e0cfa2bb57a7e624231317044c15e52196ecce020db567c8e8cb960354a0be9862ee0c128c60b44777e65ac315e59f +ad4f6b3d27bbbb744126601053c3dc98c07ff0eb0b38a898bd80dce778372846d67e5ab8fb34fb3ad0ef3f235d77ba7f +a0f12cae3722bbbca2e539eb9cc7614632a2aefe51410430070a12b5bc5314ecec5857b7ff8f41e9980cac23064f7c56 +b487f1bc59485848c98222fd3bc36c8c9bb3d2912e2911f4ceca32c840a7921477f9b1fe00877e05c96c75d3eecae061 +a6033db53925654e18ecb3ce715715c36165d7035db9397087ac3a0585e587998a53973d011ac6d48af439493029cee6 +a6b4d09cd01c70a3311fd131d3710ccf97bde3e7b80efd5a8c0eaeffeb48cca0f951ced905290267b115b06d46f2693b +a9dff1df0a8f4f218a98b6f818a693fb0d611fed0fc3143537cbd6578d479af13a653a8155e535548a2a0628ae24fa58 +a58e469f65d366b519f9a394cacb7edaddac214463b7b6d62c2dbc1316e11c6c5184ce45c16de2d77f990dcdd8b55430 +989e71734f8119103586dc9a3c5f5033ddc815a21018b34c1f876cdfc112efa868d5751bf6419323e4e59fa6a03ece1c +a2da00e05036c884369e04cf55f3de7d659cd5fa3f849092b2519dd263694efe0f051953d9d94b7e121f0aee8b6174d7 +968f3c029f57ee31c4e1adea89a7f92e28483af9a74f30fbdb995dc2d40e8e657dff8f8d340d4a92bf65f54440f2859f +932778df6f60ac1639c1453ef0cbd2bf67592759dcccb3e96dcc743ff01679e4c7dd0ef2b0833dda548d32cb4eba49e2 +a805a31139f8e0d6dae1ac87d454b23a3dc9fc653d4ca18d4f8ebab30fc189c16e73981c2cb7dd6f8c30454a5208109d +a9ba0991296caa2aaa4a1ceacfb205544c2a2ec97088eace1d84ee5e2767656a172f75d2f0c4e16a3640a0e0dec316e0 +b1e49055c968dced47ec95ae934cf45023836d180702e20e2df57e0f62fb85d7ac60d657ba3ae13b8560b67210449459 +a94e1da570a38809c71e37571066acabff7bf5632737c9ab6e4a32856924bf6211139ab3cedbf083850ff2d0e0c0fcfc +88ef1bb322000c5a5515b310c838c9af4c1cdbb32eab1c83ac3b2283191cd40e9573747d663763a28dad0d64adc13840 +a987ce205f923100df0fbd5a85f22c9b99b9b9cbe6ddfa8dfda1b8fe95b4f71ff01d6c5b64ca02eb24edb2b255a14ef0 +84fe8221a9e95d9178359918a108de4763ebfa7a6487facb9c963406882a08a9a93f492f8e77cf9e7ea41ae079c45993 +aa1cf3dc7c5dcfa15bbbc811a4bb6dbac4fba4f97fb1ed344ab60264d7051f6eef19ea9773441d89929ee942ed089319 +8f6a7d610d59d9f54689bbe6a41f92d9f6096cde919c1ab94c3c7fcecf0851423bc191e5612349e10f855121c0570f56 +b5af1fa7894428a53ea520f260f3dc3726da245026b6d5d240625380bfb9c7c186df0204bb604efac5e613a70af5106e +a5bce6055ff812e72ce105f147147c7d48d7a2313884dd1f488b1240ee320f13e8a33f5441953a8e7a3209f65b673ce1 +b9b55b4a1422677d95821e1d042ab81bbf0bf087496504021ec2e17e238c2ca6b44fb3b635a5c9eac0871a724b8d47c3 +941c38e533ce4a673a3830845b56786585e5fe49c427f2e5c279fc6db08530c8f91db3e6c7822ec6bb4f956940052d18 +a38e191d66c625f975313c7007bbe7431b5a06ed2da1290a7d5d0f2ec73770d476efd07b8e632de64597d47df175cbb0 +94ba76b667abf055621db4c4145d18743a368d951565632ed4e743dd50dd3333507c0c34f286a5c5fdbf38191a2255cd +a5ca38c60be5602f2bfa6e00c687ac96ac36d517145018ddbee6f12eb0faa63dd57909b9eeed26085fe5ac44e55d10ab +b00fea3b825e60c1ed1c5deb4b551aa65a340e5af36b17d5262c9cd2c508711e4dc50dc2521a2c16c7c901902266e64a +971b86fc4033485e235ccb0997a236206ba25c6859075edbcdf3c943116a5030b7f75ebca9753d863a522ba21a215a90 +b3b31f52370de246ee215400975b674f6da39b2f32514fe6bd54e747752eedca22bb840493b44a67df42a3639c5f901f +affbbfac9c1ba7cbfa1839d2ae271dd6149869b75790bf103230637da41857fc326ef3552ff31c15bda0694080198143 +a95d42aa7ef1962520845aa3688f2752d291926f7b0d73ea2ee24f0612c03b43f2b0fe3c9a9a99620ffc8d487b981bc2 +914a266065caf64985e8c5b1cb2e3f4e3fe94d7d085a1881b1fefa435afef4e1b39a98551d096a62e4f5cc1a7f0fdc2e +81a0b4a96e2b75bc1bf2dbd165d58d55cfd259000a35504d1ffb18bc346a3e6f07602c683723864ffb980f840836fd8d +91c1556631cddd4c00b65b67962b39e4a33429029d311c8acf73a18600e362304fb68bccb56fde40f49e95b7829e0b87 +8befbacc19e57f7c885d1b7a6028359eb3d80792fe13b92a8400df21ce48deb0bb60f2ddb50e3d74f39f85d7eab23adc +92f9458d674df6e990789690ec9ca73dacb67fc9255b58c417c555a8cc1208ace56e8e538f86ba0f3615573a0fbac00d +b4b1b3062512d6ae7417850c08c13f707d5838e43d48eb98dd4621baf62eee9e82348f80fe9b888a12874bfa538771f8 +a13c4a3ac642ede37d9c883f5319e748d2b938f708c9d779714108a449b343f7b71a6e3ef4080fee125b416762920273 +af44983d5fc8cceee0551ef934e6e653f2d3efa385e5c8a27a272463a6f333e290378cc307c2b664eb923c78994e706e +a389fd6c59fe2b4031cc244e22d3991e541bd203dd5b5e73a6159e72df1ab41d49994961500dcde7989e945213184778 +8d2141e4a17836c548de9598d7b298b03f0e6c73b7364979a411c464e0628e21cff6ac3d6decdba5d1c4909eff479761 +980b22ef53b7bdf188a3f14bc51b0dbfdf9c758826daa3cbc1e3986022406a8aa9a6a79e400567120b88c67faa35ce5f +a28882f0a055f96df3711de5d0aa69473e71245f4f3e9aa944e9d1fb166e02caa50832e46da6d3a03b4801735fd01b29 +8db106a37d7b88f5d995c126abb563934dd8de516af48e85695d02b1aea07f79217e3cdd03c6f5ca57421830186c772b +b5a7e50da0559a675c472f7dfaee456caab6695ab7870541b2be8c2b118c63752427184aad81f0e1afc61aef1f28c46f +9962118780e20fe291d10b64f28d09442a8e1b5cffd0f3dd68d980d0614050a626c616b44e9807fbee7accecae00686a +b38ddf33745e8d2ad6a991aefaf656a33c5f8cbe5d5b6b6fd03bd962153d8fd0e01b5f8f96d80ae53ab28d593ab1d4e7 +857dc12c0544ff2c0c703761d901aba636415dee45618aba2e3454ff9cbc634a85c8b05565e88520ff9be2d097c8b2b1 +a80d465c3f8cc63af6d74a6a5086b626c1cb4a8c0fee425964c3bd203d9d7094e299f81ce96d58afc20c8c9a029d9dae +89e1c8fbde8563763be483123a3ed702efac189c6d8ab4d16c85e74bbaf856048cc42d5d6e138633a38572ba5ec3f594 +893a594cf495535f6d216508f8d03c317dcf03446668cba688da90f52d0111ac83d76ad09bf5ea47056846585ee5c791 +aadbd8be0ae452f7f9450c7d2957598a20cbf10139a4023a78b4438172d62b18b0de39754dd2f8862dbd50a3a0815e53 +ae7d39670ecca3eb6db2095da2517a581b0e8853bdfef619b1fad9aacd443e7e6a40f18209fadd44038a55085c5fe8b2 +866ef241520eacb6331593cfcb206f7409d2f33d04542e6e52cba5447934e02d44c471f6c9a45963f9307e9809ab91d9 +b1a09911ad3864678f7be79a9c3c3eb5c84a0a45f8dcb52c67148f43439aeaaa9fd3ed3471276b7e588b49d6ebe3033a +add07b7f0dbb34049cd8feeb3c18da5944bf706871cfd9f14ff72f6c59ad217ebb1f0258b13b167851929387e4e34cfe +ae048892d5c328eefbdd4fba67d95901e3c14d974bfc0a1fc68155ca9f0d59e61d7ba17c6c9948b120cf35fd26e6fee9 +9185b4f3b7da0ddb4e0d0f09b8a9e0d6943a4611e43f13c3e2a767ed8592d31e0ba3ebe1914026a3627680274291f6e5 +a9c022d4e37b0802284ce3b7ee9258628ab4044f0db4de53d1c3efba9de19d15d65cc5e608dbe149c21c2af47d0b07b5 +b24dbd5852f8f24921a4e27013b6c3fa8885b973266cb839b9c388efad95821d5d746348179dcc07542bd0d0aefad1ce +b5fb4f279300876a539a27a441348764908bc0051ebd66dc51739807305e73db3d2f6f0f294ffb91b508ab150eaf8527 +ace50841e718265b290c3483ed4b0fdd1175338c5f1f7530ae9a0e75d5f80216f4de37536adcbc8d8c95982e88808cd0 +b19cadcde0f63bd1a9c24bd9c2806f53c14c0b9735bf351601498408ba503ddbd2037c891041cbba47f58b8c483f3b21 +b6061e63558d312eb891b97b39aa552fa218568d79ee26fe6dd5b864aea9e3216d8f2e2f3b093503be274766dac41426 +89730fdb2876ab6f0fe780d695f6e12090259027e789b819956d786e977518057e5d1d7f5ab24a3ae3d5d4c97773bd2b +b6fa841e81f9f2cad0163a02a63ae96dc341f7ae803b616efc6e1da2fbea551c1b96b11ad02c4afbdf6d0cc9f23da172 +8fb66187182629c861ddb6896d7ed3caf2ad050c3dba8ab8eb0d7a2c924c3d44c48d1a148f9e33fb1f061b86972f8d21 +86022ac339c1f84a7fa9e05358c1a5b316b4fc0b83dbe9c8c7225dc514f709d66490b539359b084ce776e301024345fa +b50b9c321468da950f01480bb62b6edafd42f83c0001d6e97f2bd523a1c49a0e8574fb66380ea28d23a7c4d54784f9f0 +a31c05f7032f30d1dac06678be64d0250a071fd655e557400e4a7f4c152be4d5c7aa32529baf3e5be7c4bd49820054f6 +b95ac0848cd322684772119f5b682d90a66bbf9dac411d9d86d2c34844bbd944dbaf8e47aa41380455abd51687931a78 +ae4a6a5ce9553b65a05f7935e61e496a4a0f6fd8203367a2c627394c9ce1e280750297b74cdc48fd1d9a31e93f97bef4 +a22daf35f6e9b05e52e0b07f7bd1dbbebd2c263033fb0e1b2c804e2d964e2f11bc0ece6aca6af079dd3a9939c9c80674 +902150e0cb1f16b9b59690db35281e28998ce275acb313900da8b2d8dfd29fa1795f8ca3ff820c31d0697de29df347c1 +b17b5104a5dc665cdd7d47e476153d715eb78c6e5199303e4b5445c21a7fa7cf85fe7cfd08d7570f4e84e579b005428c +a03f49b81c15433f121680aa02d734bb9e363af2156654a62bcb5b2ba2218398ccb0ff61104ea5d7df5b16ea18623b1e +802101abd5d3c88876e75a27ffc2f9ddcce75e6b24f23dba03e5201281a7bd5cc7530b6a003be92d225093ca17d3c3bb +a4d183f63c1b4521a6b52226fc19106158fc8ea402461a5cccdaa35fee93669df6a8661f45c1750cd01308149b7bf08e +8d17c22e0c8403b69736364d460b3014775c591032604413d20a5096a94d4030d7c50b9fe3240e31d0311efcf9816a47 +947225acfcce5992eab96276f668c3cbe5f298b90a59f2bb213be9997d8850919e8f496f182689b5cbd54084a7332482 +8df6f4ed216fc8d1905e06163ba1c90d336ab991a18564b0169623eb39b84e627fa267397da15d3ed754d1f3423bff07 +83480007a88f1a36dea464c32b849a3a999316044f12281e2e1c25f07d495f9b1710b4ba0d88e9560e72433addd50bc2 +b3019d6e591cf5b33eb972e49e06c6d0a82a73a75d78d383dd6f6a4269838289e6e07c245f54fed67f5c9bb0fd5e1c5f +92e8ce05e94927a9fb02debadb99cf30a26172b2705003a2c0c47b3d8002bf1060edb0f6a5750aad827c98a656b19199 +ac2aff801448dbbfc13cca7d603fd9c69e82100d997faf11f465323b97255504f10c0c77401e4d1890339d8b224f5803 +b0453d9903d08f508ee27e577445dc098baed6cde0ac984b42e0f0efed62760bd58d5816cf1e109d204607b7b175e30c +ae68dc4ba5067e825d46d2c7c67f1009ceb49d68e8d3e4c57f4bcd299eb2de3575d42ea45e8722f8f28497a6e14a1cfe +b22486c2f5b51d72335ce819bbafb7fa25eb1c28a378a658f13f9fc79cd20083a7e573248d911231b45a5cf23b561ca7 +89d1201d1dbd6921867341471488b4d2fd0fc773ae1d4d074c78ae2eb779a59b64c00452c2a0255826fca6b3d03be2b1 +a2998977c91c7a53dc6104f5bc0a5b675e5350f835e2f0af69825db8af4aeb68435bdbcc795f3dd1f55e1dd50bc0507f +b0be4937a925b3c05056ed621910d535ccabf5ab99fd3b9335080b0e51d9607d0fd36cb5781ff340018f6acfca4a9736 +aea145a0f6e0ba9df8e52e84bb9c9de2c2dc822f70d2724029b153eb68ee9c17de7d35063dcd6a39c37c59fdd12138f7 +91cb4545d7165ee8ffbc74c874baceca11fdebbc7387908d1a25877ca3c57f2c5def424dab24148826832f1e880bede0 +b3b579cb77573f19c571ad5eeeb21f65548d7dff9d298b8d7418c11f3e8cd3727c5b467f013cb87d6861cfaceee0d2e3 +b98a1eeec2b19fecc8378c876d73645aa52fb99e4819903735b2c7a885b242787a30d1269a04bfb8573d72d9bbc5f0f0 +940c1f01ed362bd588b950c27f8cc1d52276c71bb153d47f07ec85b038c11d9a8424b7904f424423e714454d5e80d1cd +aa343a8ecf09ce11599b8cf22f7279cf80f06dbf9f6d62cb05308dbbb39c46fd0a4a1240b032665fbb488a767379b91b +87c3ac72084aca5974599d3232e11d416348719e08443acaba2b328923af945031f86432e170dcdd103774ec92e988c9 +91d6486eb5e61d2b9a9e742c20ec974a47627c6096b3da56209c2b4e4757f007e793ebb63b2b246857c9839b64dc0233 +aebcd3257d295747dd6fc4ff910d839dd80c51c173ae59b8b2ec937747c2072fa85e3017f9060aa509af88dfc7529481 +b3075ba6668ca04eff19efbfa3356b92f0ab12632dcda99cf8c655f35b7928c304218e0f9799d68ef9f809a1492ff7db +93ba7468bb325639ec2abd4d55179c69fd04eaaf39fc5340709227bbaa4ad0a54ea8b480a1a3c8d44684e3be0f8d1980 +a6aef86c8c0d92839f38544d91b767c582568b391071228ff5a5a6b859c87bf4f81a7d926094a4ada1993ddbd677a920 +91dcd6d14207aa569194aa224d1e5037b999b69ade52843315ca61ba26abe9a76412c9e88259bc5cf5d7b95b97d9c3bc +b3b483d31c88f78d49bd065893bc1e3d2aa637e27dedb46d9a7d60be7660ce7a10aaaa7deead362284a52e6d14021178 +8e5730070acf8371461ef301cc4523e8e672aa0e3d945d438a0e0aa6bdf8cb9c685dcf38df429037b0c8aff3955c6f5b +b8c6d769890a8ee18dc4f9e917993315877c97549549b34785a92543cbeec96a08ae3a28d6e809c4aacd69de356c0012 +95ca86cd384eaceaa7c077c5615736ca31f36824bd6451a16142a1edc129fa42b50724aeed7c738f08d7b157f78b569e +94df609c6d71e8eee7ab74226e371ccc77e01738fe0ef1a6424435b4570fe1e5d15797b66ed0f64eb88d4a3a37631f0e +89057b9783212add6a0690d6bb99097b182738deff2bd9e147d7fd7d6c8eacb4c219923633e6309ad993c24572289901 +83a0f9f5f265c5a0e54defa87128240235e24498f20965009fef664f505a360b6fb4020f2742565dfc7746eb185bcec0 +91170da5306128931349bc3ed50d7df0e48a68b8cc8420975170723ac79d8773e4fa13c5f14dc6e3fafcad78379050b1 +b7178484d1b55f7e56a4cc250b6b2ec6040437d96bdfddfa7b35ed27435860f3855c2eb86c636f2911b012eb83b00db8 +ac0b00c4322d1e4208e09cd977b4e54d221133ff09551f75b32b0b55d0e2be80941dda26257b0e288c162e63c7e9cf68 +9690ed9e7e53ed37ff362930e4096b878b12234c332fd19d5d064824084245952eda9f979e0098110d6963e468cf513e +b6fa547bb0bb83e5c5be0ed462a8783fba119041c136a250045c09d0d2af330c604331e7de960df976ff76d67f8000cd +814603907c21463bcf4e59cfb43066dfe1a50344ae04ef03c87c0f61b30836c3f4dea0851d6fa358c620045b7f9214c8 +9495639e3939fad2a3df00a88603a5a180f3c3a0fe4d424c35060e2043e0921788003689887b1ed5be424d9a89bb18bb +aba4c02d8d57f2c92d5bc765885849e9ff8393d6554f5e5f3e907e5bfac041193a0d8716d7861104a4295d5a03c36b03 +8ead0b56c1ca49723f94a998ba113b9058059321da72d9e395a667e6a63d5a9dac0f5717cec343f021695e8ced1f72af +b43037f7e3852c34ed918c5854cd74e9d5799eeddfe457d4f93bb494801a064735e326a76e1f5e50a339844a2f4a8ec9 +99db8422bb7302199eb0ff3c3d08821f8c32f53a600c5b6fb43e41205d96adae72be5b460773d1280ad1acb806af9be8 +8a9be08eae0086c0f020838925984df345c5512ff32e37120b644512b1d9d4fecf0fd30639ca90fc6cf334a86770d536 +81b43614f1c28aa3713a309a88a782fb2bdfc4261dd52ddc204687791a40cf5fd6a263a8179388596582cccf0162efc2 +a9f3a8b76912deb61d966c75daf5ddb868702ebec91bd4033471c8e533183df548742a81a2671de5be63a502d827437d +902e2415077f063e638207dc7e14109652e42ab47caccd6204e2870115791c9defac5425fd360b37ac0f7bd8fe7011f8 +aa18e4fdc1381b59c18503ae6f6f2d6943445bd00dd7d4a2ad7e5adad7027f2263832690be30d456e6d772ad76f22350 +a348b40ba3ba7d81c5d4631f038186ebd5e5f314f1ea737259151b07c3cc8cf0c6ed4201e71bcc1c22fefda81a20cde6 +aa1306f7ac1acbfc47dc6f7a0cb6d03786cec8c8dc8060388ccda777bca24bdc634d03e53512c23dba79709ff64f8620 +818ccfe46e700567b7f3eb400e5a35f6a5e39b3db3aa8bc07f58ace35d9ae5a242faf8dbccd08d9a9175bbce15612155 +b7e3da2282b65dc8333592bb345a473f03bd6df69170055fec60222de9897184536bf22b9388b08160321144d0940279 +a4d976be0f0568f4e57de1460a1729129252b44c552a69fceec44e5b97c96c711763360d11f9e5bf6d86b4976bf40d69 +85d185f0397c24c2b875b09b6328a23b87982b84ee880f2677a22ff4c9a1ba9f0fea000bb3f7f66375a00d98ebafce17 +b4ccbb8c3a2606bd9b87ce022704663af71d418351575f3b350d294f4efc68c26f9a2ce49ff81e6ff29c3b63d746294e +93ffd3265fddb63724dfde261d1f9e22f15ecf39df28e4d89e9fea03221e8e88b5dd9b77628bacaa783c6f91802d47cc +b1fd0f8d7a01378e693da98d03a2d2fda6b099d03454b6f2b1fa6472ff6bb092751ce6290059826b74ac0361eab00e1e +a89f440c71c561641589796994dd2769616b9088766e983c873fae0716b95c386c8483ab8a4f367b6a68b72b7456dd32 +af4fe92b01d42d03dd5d1e7fa55e96d4bbcb7bf7d4c8c197acd16b3e0f3455807199f683dcd263d74547ef9c244b35cc +a8227f6e0a344dfe76bfbe7a1861be32c4f4bed587ccce09f9ce2cf481b2dda8ae4f566154bc663d15f962f2d41761bd +a7b361663f7495939ed7f518ba45ea9ff576c4e628995b7aea026480c17a71d63fc2c922319f0502eb7ef8f14a406882 +8ddcf382a9f39f75777160967c07012cfa89e67b19714a7191f0c68eaf263935e5504e1104aaabd0899348c972a8d3c6 +98c95b9f6f5c91f805fb185eedd06c6fc4457d37dd248d0be45a6a168a70031715165ea20606245cbdf8815dc0ac697f +805b44f96e001e5909834f70c09be3efcd3b43632bcac5b6b66b6d227a03a758e4b1768ce2a723045681a1d34562aaeb +b0e81b07cdc45b3dca60882676d9badb99f25c461b7efe56e3043b80100bb62d29e1873ae25eb83087273160ece72a55 +b0c53f0abe78ee86c7b78c82ae1f7c070bb0b9c45c563a8b3baa2c515d482d7507bb80771e60b38ac13f78b8af92b4a9 +a7838ef6696a9e4d2e5dfd581f6c8d6a700467e8fd4e85adabb5f7a56f514785dd4ab64f6f1b48366f7d94728359441b +88c76f7700a1d23c30366a1d8612a796da57b2500f97f88fdf2d76b045a9d24e7426a8ffa2f4e86d3046937a841dad58 +ad8964baf98c1f02e088d1d9fcb3af6b1dfa44cdfe0ed2eae684e7187c33d3a3c28c38e8f4e015f9c04d451ed6f85ff6 +90e9d00a098317ececaa9574da91fc149eda5b772dedb3e5a39636da6603aa007804fa86358550cfeff9be5a2cb7845e +a56ff4ddd73d9a6f5ab23bb77efa25977917df63571b269f6a999e1ad6681a88387fcc4ca3b26d57badf91b236503a29 +97ad839a6302c410a47e245df84c01fb9c4dfef86751af3f9340e86ff8fc3cd52fa5ff0b9a0bd1d9f453e02ca80658a6 +a4c8c44cbffa804129e123474854645107d1f0f463c45c30fd168848ebea94880f7c0c5a45183e9eb837f346270bdb35 +a72e53d0a1586d736e86427a93569f52edd2f42b01e78aee7e1961c2b63522423877ae3ac1227a2cf1e69f8e1ff15bc3 +8559f88a7ef13b4f09ac82ae458bbae6ab25671cfbf52dae7eac7280d6565dd3f0c3286aec1a56a8a16dc3b61d78ce47 +8221503f4cdbed550876c5dc118a3f2f17800c04e8be000266633c83777b039a432d576f3a36c8a01e8fd18289ebc10b +99bfbe5f3e46d4d898a578ba86ed26de7ed23914bd3bcdf3c791c0bcd49398a52419077354a5ab75cea63b6c871c6e96 +aa134416d8ff46f2acd866c1074af67566cfcf4e8be8d97329dfa0f603e1ff208488831ce5948ac8d75bfcba058ddcaa +b02609d65ebfe1fe8e52f21224a022ea4b5ea8c1bd6e7b9792eed8975fc387cdf9e3b419b8dd5bcce80703ab3a12a45f +a4f14798508698fa3852e5cac42a9db9797ecee7672a54988aa74037d334819aa7b2ac7b14efea6b81c509134a6b7ad2 +884f01afecbcb987cb3e7c489c43155c416ed41340f61ecb651d8cba884fb9274f6d9e7e4a46dd220253ae561614e44c +a05523c9e71dce1fe5307cc71bd721feb3e1a0f57a7d17c7d1c9fb080d44527b7dbaa1f817b1af1c0b4322e37bc4bb1e +8560aec176a4242b39f39433dd5a02d554248c9e49d3179530815f5031fee78ba9c71a35ceeb2b9d1f04c3617c13d8f0 +996aefd402748d8472477cae76d5a2b92e3f092fc834d5222ae50194dd884c9fb8b6ed8e5ccf8f6ed483ddbb4e80c747 +8fd09900320000cbabc40e16893e2fcf08815d288ec19345ad7b6bb22f7d78a52b6575a3ca1ca2f8bc252d2eafc928ec +939e51f73022bc5dc6862a0adf8fb8a3246b7bfb9943cbb4b27c73743926cc20f615a036c7e5b90c80840e7f1bfee0e7 +a0a6258700cadbb9e241f50766573bf9bdb7ad380b1079dc3afb4054363d838e177b869cad000314186936e40359b1f2 +972699a4131c8ed27a2d0e2104d54a65a7ff1c450ad9da3a325c662ab26869c21b0a84d0700b98c8b5f6ce3b746873d7 +a454c7fe870cb8aa6491eafbfb5f7872d6e696033f92e4991d057b59d70671f2acdabef533e229878b60c7fff8f748b1 +a167969477214201f09c79027b10221e4707662e0c0fde81a0f628249f2f8a859ce3d30a7dcc03b8ecca8f7828ad85c7 +8ff6b7265175beb8a63e1dbf18c9153fb2578c207c781282374f51b40d57a84fd2ef2ea2b9c6df4a54646788a62fd17f +a3d7ebeccde69d73d8b3e76af0da1a30884bb59729503ff0fb0c3bccf9221651b974a6e72ea33b7956fc3ae758226495 +b71ef144c9a98ce5935620cb86c1590bd4f48e5a2815d25c0cdb008fde628cf628c31450d3d4f67abbfeb16178a74cfd +b5e0a16d115134f4e2503990e3f2035ed66b9ccf767063fe6747870d97d73b10bc76ed668550cb82eedc9a2ca6f75524 +b30ffaaf94ee8cbc42aa2c413175b68afdb207dbf351fb20be3852cb7961b635c22838da97eaf43b103aff37e9e725cc +98aa7d52284f6c1f22e272fbddd8c8698cf8f5fbb702d5de96452141fafb559622815981e50b87a72c2b1190f59a7deb +81fbacda3905cfaf7780bb4850730c44166ed26a7c8d07197a5d4dcd969c09e94a0461638431476c16397dd7bdc449f9 +95e47021c1726eac2e5853f570d6225332c6e48e04c9738690d53e07c6b979283ebae31e2af1fc9c9b3e59f87e5195b1 +ac024a661ba568426bb8fce21780406537f518075c066276197300841e811860696f7588188bc01d90bace7bc73d56e3 +a4ebcaf668a888dd404988ab978594dee193dad2d0aec5cdc0ccaf4ec9a7a8228aa663db1da8ddc52ec8472178e40c32 +a20421b8eaf2199d93b083f2aff37fb662670bd18689d046ae976d1db1fedd2c2ff897985ecc6277b396db7da68bcb27 +8bc33d4b40197fd4d49d1de47489d10b90d9b346828f53a82256f3e9212b0cbc6930b895e879da9cec9fedf026aadb3e +aaafdd1bec8b757f55a0433eddc0a39f818591954fd4e982003437fcceb317423ad7ee74dbf17a2960380e7067a6b4e2 +aad34277ebaed81a6ec154d16736866f95832803af28aa5625bf0461a71d02b1faba02d9d9e002be51c8356425a56867 +976e9c8b150d08706079945bd0e84ab09a648ecc6f64ded9eb5329e57213149ae409ae93e8fbd8eda5b5c69f5212b883 +8097fae1653247d2aed4111533bc378171d6b2c6d09cbc7baa9b52f188d150d645941f46d19f7f5e27b7f073c1ebd079 +83905f93b250d3184eaba8ea7d727c4464b6bdb027e5cbe4f597d8b9dc741dcbea709630bd4fd59ce24023bec32fc0f3 +8095030b7045cff28f34271386e4752f9a9a0312f8df75de4f424366d78534be2b8e1720a19cb1f9a2d21105d790a225 +a7b7b73a6ae2ed1009c49960374b0790f93c74ee03b917642f33420498c188a169724945a975e5adec0a1e83e07fb1b2 +856a41c54df393b6660b7f6354572a4e71c8bfca9cabaffb3d4ef2632c015e7ee2bc10056f3eccb3dbed1ad17d939178 +a8f7a55cf04b38cd4e330394ee6589da3a07dc9673f74804fdf67b364e0b233f14aec42e783200a2e4666f7c5ff62490 +82c529f4e543c6bca60016dc93232c115b359eaee2798a9cf669a654b800aafe6ab4ba58ea8b9cdda2b371c8d62fa845 +8caab020c1baddce77a6794113ef1dfeafc5f5000f48e97f4351b588bf02f1f208101745463c480d37f588d5887e6d8c +8fa91b3cc400f48b77b6fd77f3b3fbfb3f10cdff408e1fd22d38f77e087b7683adad258804409ba099f1235b4b4d6fea +8aa02787663d6be9a35677d9d8188b725d5fcd770e61b11b64e3def8808ea5c71c0a9afd7f6630c48634546088fcd8e2 +b5635b7b972e195cab878b97dea62237c7f77eb57298538582a330b1082f6207a359f2923864630136d8b1f27c41b9aa +8257bb14583551a65975946980c714ecd6e5b629672bb950b9caacd886fbd22704bc9e3ba7d30778adab65dc74f0203a +ab5fe1cd12634bfa4e5c60d946e2005cbd38f1063ec9a5668994a2463c02449a0a185ef331bd86b68b6e23a8780cb3ba +a7d3487da56cda93570cc70215d438204f6a2709bfb5fda6c5df1e77e2efc80f4235c787e57fbf2c74aaff8cbb510a14 +b61cff7b4c49d010e133319fb828eb900f8a7e55114fc86b39c261a339c74f630e1a7d7e1350244ada566a0ff3d46c4b +8d4d1d55d321d278db7a85522ccceca09510374ca81d4d73e3bb5249ace7674b73900c35a531ec4fa6448fabf7ad00dc +966492248aee24f0f56c8cfca3c8ec6ba3b19abb69ae642041d4c3be8523d22c65c4dafcab4c58989ccc4e0bd2f77919 +b20c320a90cb220b86e1af651cdc1e21315cd215da69f6787e28157172f93fc8285dcd59b039c626ed8ca4633cba1a47 +aae9e6b22f018ceb5c0950210bb8182cb8cb61014b7e14581a09d36ebd1bbfebdb2b82afb7fdb0cf75e58a293d9c456d +875547fb67951ad37b02466b79f0c9b985ccbc500cfb431b17823457dc79fb9597ec42cd9f198e15523fcd88652e63a4 +92afce49773cb2e20fb21e4f86f18e0959ebb9c33361547ddb30454ee8e36b1e234019cbdca0e964cb292f7f77df6b90 +8af85343dfe1821464c76ba11c216cbef697b5afc69c4d821342e55afdac047081ec2e3f7b09fc14b518d9a23b78c003 +b7de4a1648fd63f3a918096ea669502af5357438e69dac77cb8102b6e6c15c76e033cfaa80dafc806e535ede5c1a20aa +ac80e9b545e8bd762951d96c9ce87f629d01ffcde07efc2ef7879ca011f1d0d8a745abf26c9d452541008871304fac00 +a4cf0f7ed724e481368016c38ea5816698a5f68eb21af4d3c422d2ba55f96a33e427c2aa40de1b56a7cfac7f7cf43ab0 +899b0a678bb2db2cae1b44e75a661284844ebcdd87abf308fedeb2e4dbe5c5920c07db4db7284a7af806a2382e8b111a +af0588a2a4afce2b1b13c1230816f59e8264177e774e4a341b289a101dcf6af813638fed14fb4d09cb45f35d5d032609 +a4b8df79e2be76e9f5fc5845f06fe745a724cf37c82fcdb72719b77bdebea3c0e763f37909373e3a94480cc5e875cba0 +83e42c46d88930c8f386b19fd999288f142d325e2ebc86a74907d6d77112cb0d449bc511c95422cc810574031a8cbba9 +b5e39534070de1e5f6e27efbdd3dc917d966c2a9b8cf2d893f964256e95e954330f2442027dc148c776d63a95bcde955 +958607569dc28c075e658cd4ae3927055c6bc456eef6212a6fea8205e48ed8777a8064f584cda38fe5639c371e2e7fba +812adf409fa63575113662966f5078a903212ffb65c9b0bbe62da0f13a133443a7062cb8fd70f5e5dd5559a32c26d2c8 +a679f673e5ce6a3cce7fa31f22ee3785e96bcb55e5a776e2dd3467bef7440e3555d1a9b87cb215e86ee9ed13a090344b +afedbb34508b159eb25eb2248d7fe328f86ef8c7d84c62d5b5607d74aae27cc2cc45ee148eb22153b09898a835c58df4 +b75505d4f6b67d31e665cfaf5e4acdb5838ae069166b7fbcd48937c0608a59e40a25302fcc1873d2e81c1782808c70f0 +b62515d539ec21a155d94fc00ea3c6b7e5f6636937bce18ed5b618c12257fb82571886287fd5d1da495296c663ebc512 +ab8e1a9446bbdd588d1690243b1549d230e6149c28f59662b66a8391a138d37ab594df38e7720fae53217e5c3573b5be +b31e8abf4212e03c3287bb2c0a153065a7290a16764a0bac8f112a72e632185a654bb4e88fdd6053e6c7515d9719fadb +b55165477fe15b6abd2d0f4fddaa9c411710dcc4dd712daba3d30e303c9a3ee5415c256f9dc917ecf18c725b4dbab059 +a0939d4f57cacaae549b78e87cc234de4ff6a35dc0d9cd5d7410abc30ebcd34c135e008651c756e5a9d2ca79c40ef42b +8cf10e50769f3443340844aad4d56ec790850fed5a41fcbd739abac4c3015f0a085a038fbe7fae9f5ad899cce5069f6b +924055e804d82a99ea4bb160041ea4dc14b568abf379010bc1922fde5d664718c31d103b8b807e3a1ae809390e708c73 +8ec0f9d26f71b0f2e60a179e4fd1778452e2ffb129d50815e5d7c7cb9415fa69ae5890578086e8ef6bfde35ad2a74661 +98c7f12b15ec4426b59f737f73bf5faea4572340f4550b7590dfb7f7ffedb2372e3e555977c63946d579544c53210ad0 +8a935f7a955c78f69d66f18eee0092e5e833fa621781c9581058e219af4d7ceee48b84e472e159dda6199715fb2f9acf +b78d4219f95a2dbfaa7d0c8a610c57c358754f4f43c2af312ab0fe8f10a5f0177e475332fb8fd23604e474fc2abeb051 +8d086a14803392b7318c28f1039a17e3cfdcece8abcaca3657ec3d0ac330842098a85c0212f889fabb296dfb133ce9aa +a53249f417aac82f2c2a50c244ce21d3e08a5e5a8bd33bec2a5ab0d6cd17793e34a17edfa3690899244ce201e2fb9986 +8619b0264f9182867a1425be514dc4f1ababc1093138a728a28bd7e4ecc99b9faaff68c23792264bc6e4dce5f52a5c52 +8c171edbbbde551ec19e31b2091eb6956107dd9b1f853e1df23bff3c10a3469ac77a58335eee2b79112502e8e163f3de +a9d19ec40f0ca07c238e9337c6d6a319190bdba2db76fb63902f3fb459aeeb50a1ac30db5b25ee1b4201f3ca7164a7f4 +b9c6ec14b1581a03520b8d2c1fbbc31fb8ceaef2c0f1a0d0080b6b96e18442f1734bea7ef7b635d787c691de4765d469 +8cb437beb4cfa013096f40ccc169a713dc17afee6daa229a398e45fd5c0645a9ad2795c3f0cd439531a7151945d7064d +a6e8740cc509126e146775157c2eb278003e5bb6c48465c160ed27888ca803fa12eee1f6a8dd7f444f571664ed87fdc1 +b75c1fecc85b2732e96b3f23aefb491dbd0206a21d682aee0225838dc057d7ed3b576176353e8e90ae55663f79e986e4 +ad8d249b0aea9597b08358bce6c77c1fd552ef3fbc197d6a1cfe44e5e6f89b628b12a6fb04d5dcfcbacc51f46e4ae7bb +b998b2269932cbd58d04b8e898d373ac4bb1a62e8567484f4f83e224061bc0f212459f1daae95abdbc63816ae6486a55 +827988ef6c1101cddc96b98f4a30365ff08eea2471dd949d2c0a9b35c3bbfa8c07054ad1f4c88c8fbf829b20bb5a9a4f +8692e638dd60babf7d9f2f2d2ce58e0ac689e1326d88311416357298c6a2bffbfebf55d5253563e7b3fbbf5072264146 +a685d75b91aea04dbc14ab3c1b1588e6de96dae414c8e37b8388766029631b28dd860688079b12d09cd27f2c5af11adf +b57eced93eec3371c56679c259b34ac0992286be4f4ff9489d81cf9712403509932e47404ddd86f89d7c1c3b6391b28c +a1c8b4e42ebcbd8927669a97f1b72e236fb19249325659e72be7ddaaa1d9e81ca2abb643295d41a8c04a2c01f9c0efd7 +877c33de20d4ed31674a671ba3e8f01a316581e32503136a70c9c15bf0b7cb7b1cba6cd4eb641fad165fb3c3c6c235fd +a2a469d84ec478da40838f775d11ad38f6596eb41caa139cc190d6a10b5108c09febae34ffdafac92271d2e73c143693 +972f817caedb254055d52e963ed28c206848b6c4cfdb69dbc961c891f8458eaf582a6d4403ce1177d87bc2ea410ef60a +accbd739e138007422f28536381decc54bb6bd71d93edf3890e54f9ef339f83d2821697d1a4ac1f5a98175f9a9ecb9b5 +8940f8772e05389f823b62b3adc3ed541f91647f0318d7a0d3f293aeeb421013de0d0a3664ea53dd24e5fbe02d7efef6 +8ecce20f3ef6212edef07ec4d6183fda8e0e8cad2c6ccd0b325e75c425ee1faba00b5c26b4d95204238931598d78f49d +97cc72c36335bd008afbed34a3b0c7225933faba87f7916d0a6d2161e6f82e0cdcda7959573a366f638ca75d30e9dab1 +9105f5de8699b5bdb6bd3bb6cc1992d1eac23929c29837985f83b22efdda92af64d9c574aa9640475087201bbbe5fd73 +8ffb33c4f6d05c413b9647eb6933526a350ed2e4278ca2ecc06b0e8026d8dbe829c476a40e45a6df63a633090a3f82ef +8bfc6421fdc9c2d2aaa68d2a69b1a2728c25b84944cc3e6a57ff0c94bfd210d1cbf4ff3f06702d2a8257024d8be7de63 +a80e1dc1dddfb41a70220939b96dc6935e00b32fb8be5dff4eed1f1c650002ff95e4af481c43292e3827363b7ec4768a +96f714ebd54617198bd636ba7f7a7f8995a61db20962f2165078d9ed8ee764d5946ef3cbdc7ebf8435bb8d5dd4c1deac +8cdb0890e33144d66391d2ae73f5c71f5a861f72bc93bff6cc399fc25dd1f9e17d8772592b44593429718784802ac377 +8ccf9a7f80800ee770b92add734ed45a73ecc31e2af0e04364eefc6056a8223834c7c0dc9dfc52495bdec6e74ce69994 +aa0875f423bd68b5f10ba978ddb79d3b96ec093bfbac9ff366323193e339ed7c4578760fb60f60e93598bdf1e5cc4995 +a9214f523957b59c7a4cb61a40251ad72aba0b57573163b0dc0f33e41d2df483fb9a1b85a5e7c080e9376c866790f8cb +b6224b605028c6673a536cc8ff9aeb94e7a22e686fda82cf16068d326469172f511219b68b2b3affb7933af0c1f80d07 +b6d58968d8a017c6a34e24c2c09852f736515a2c50f37232ac6b43a38f8faa7572cc31dade543b594b61b5761c4781d0 +8a97cefe5120020c38deeb861d394404e6c993c6cbd5989b6c9ebffe24f46ad11b4ba6348e2991cbf3949c28cfc3c99d +95bf046f8c3a9c0ce2634be4de3713024daec3fc4083e808903b25ce3ac971145af90686b451efcc72f6b22df0216667 +a6a4e2f71b8fa28801f553231eff2794c0f10d12e7e414276995e21195abc9c2983a8997e41af41e78d19ff6fbb2680b +8e5e62a7ca9c2f58ebaab63db2ff1fb1ff0877ae94b7f5e2897f273f684ae639dff44cc65718f78a9c894787602ab26a +8542784383eec4f565fcb8b9fc2ad8d7a644267d8d7612a0f476fc8df3aff458897a38003d506d24142ad18f93554f2b +b7db68ba4616ea072b37925ec4fb39096358c2832cc6d35169e032326b2d6614479f765ae98913c267105b84afcb9bf2 +8b31dbb9457d23d416c47542c786e07a489af35c4a87dadb8ee91bea5ac4a5315e65625d78dad2cf8f9561af31b45390 +a8545a1d91ac17257732033d89e6b7111db8242e9c6ebb0213a88906d5ef407a2c6fdb444e29504b06368b6efb4f4839 +b1bd85d29ebb28ccfb05779aad8674906b267c2bf8cdb1f9a0591dd621b53a4ee9f2942687ee3476740c0b4a7621a3ae +a2b54534e152e46c50d91fff03ae9cd019ff7cd9f4168b2fe7ac08ef8c3bbc134cadd3f9d6bd33d20ae476c2a8596c8a +b19b571ff4ae3e9f5d95acda133c455e72c9ea9973cae360732859836c0341c4c29ab039224dc5bc3deb824e031675d8 +940b5f80478648bac025a30f3efeb47023ce20ee98be833948a248bca6979f206bb28fc0f17b90acf3bb4abd3d14d731 +8f106b40588586ac11629b96d57808ad2808915d89539409c97414aded90b4ff23286a692608230a52bff696055ba5d6 +ae6bda03aa10da3d2abbc66d764ca6c8d0993e7304a1bdd413eb9622f3ca1913baa6da1e9f4f9e6cf847f14f44d6924d +a18e7796054a340ef826c4d6b5a117b80927afaf2ebd547794c400204ae2caf277692e2eabb55bc2f620763c9e9da66d +8d2d25180dc2c65a4844d3e66819ccfcf48858f0cc89e1c77553b463ec0f7feb9a4002ce26bc618d1142549b9850f232 +863f413a394de42cc8166c1c75d513b91d545fff1de6b359037a742c70b008d34bf8e587afa2d62c844d0c6f0ea753e7 +83cd0cf62d63475e7fcad18a2e74108499cdbf28af2113cfe005e3b5887794422da450b1944d0a986eb7e1f4c3b18f25 +b4f8b350a6d88fea5ab2e44715a292efb12eb52df738c9b2393da3f1ddee68d0a75b476733ccf93642154bceb208f2b8 +b3f52aaa4cd4221cb9fc45936cc67fd3864bf6d26bf3dd86aa85aa55ecfc05f5e392ecce5e7cf9406b4b1c4fce0398c8 +b33137084422fb643123f40a6df2b498065e65230fc65dc31791c330e898c51c3a65ff738930f32c63d78f3c9315f85b +91452bfa75019363976bb7337fe3a73f1c10f01637428c135536b0cdc7da5ce558dae3dfc792aa55022292600814a8ef +ad6ba94c787cd4361ca642c20793ea44f1f127d4de0bb4a77c7fbfebae0fcadbf28e2cb6f0c12c12a07324ec8c19761d +890aa6248b17f1501b0f869c556be7bf2b1d31a176f9978bb97ab7a6bd4138eed32467951c5ef1871944b7f620542f43 +82111db2052194ee7dd22ff1eafffac0443cf969d3762cceae046c9a11561c0fdce9c0711f88ac01d1bed165f8a7cee3 +b1527b71df2b42b55832f72e772a466e0fa05743aacc7814f4414e4bcc8d42a4010c9e0fd940e6f254cafedff3cd6543 +922370fa49903679fc565f09c16a5917f8125e72acfeb060fcdbadbd1644eb9f4016229756019c93c6d609cda5d5d174 +aa4c7d98a96cab138d2a53d4aee8ebff6ef903e3b629a92519608d88b3bbd94de5522291a1097e6acf830270e64c8ee1 +b3dc21608a389a72d3a752883a382baaafc61ecc44083b832610a237f6a2363f24195acce529eb4aed4ef0e27a12b66e +94619f5de05e07b32291e1d7ab1d8b7337a2235e49d4fb5f3055f090a65e932e829efa95db886b32b153bdd05a53ec8c +ade1e92722c2ffa85865d2426fb3d1654a16477d3abf580cfc45ea4b92d5668afc9d09275d3b79283e13e6b39e47424d +b7201589de7bed094911dd62fcd25c459a8e327ac447b69f541cdba30233063e5ddffad0b67e9c3e34adcffedfd0e13d +809d325310f862d6549e7cb40f7e5fc9b7544bd751dd28c4f363c724a0378c0e2adcb5e42ec8f912f5f49f18f3365c07 +a79c20aa533de7a5d671c99eb9eb454803ba54dd4f2efa3c8fec1a38f8308e9905c71e9282955225f686146388506ff6 +a85eeacb5e8fc9f3ed06a3fe2dc3108ab9f8c5877b148c73cf26e4e979bf5795edbe2e63a8d452565fd1176ed40402b2 +97ef55662f8a1ec0842b22ee21391227540adf7708f491436044f3a2eb18c471525e78e1e14fa292507c99d74d7437c6 +93110d64ed5886f3d16ce83b11425576a3a7a9bb831cd0de3f9a0b0f2270a730d68136b4ef7ff035ede004358f419b5c +ac9ed0a071517f0ae4f61ce95916a90ba9a77a3f84b0ec50ef7298acdcd44d1b94525d191c39d6bd1bb68f4471428760 +98abd6a02c7690f5a339adf292b8c9368dfc12e0f8069cf26a5e0ce54b4441638f5c66ea735142f3c28e00a0024267e6 +b51efb73ba6d44146f047d69b19c0722227a7748b0e8f644d0fc9551324cf034c041a2378c56ce8b58d06038fb8a78de +8f115af274ef75c1662b588b0896b97d71f8d67986ae846792702c4742ab855952865ce236b27e2321967ce36ff93357 +b3c4548f14d58b3ab03c222da09e4381a0afe47a72d18d50a94e0008797f78e39e99990e5b4757be62310d400746e35a +a9b1883bd5f31f909b8b1b6dcb48c1c60ed20aa7374b3ffa7f5b2ed036599b5bef33289d23c80a5e6420d191723b92f7 +85d38dffd99487ae5bb41ab4a44d80a46157bbbe8ef9497e68f061721f74e4da513ccc3422936b059575975f6787c936 +adf870fcb96e972c033ab7a35d28ae79ee795f82bc49c3bd69138f0e338103118d5529c53f2d72a9c0d947bf7d312af2 +ab4c7a44e2d9446c6ff303eb49aef0e367a58b22cc3bb27b4e69b55d1d9ee639c9234148d2ee95f9ca8079b1457d5a75 +a386420b738aba2d7145eb4cba6d643d96bda3f2ca55bb11980b318d43b289d55a108f4bc23a9606fb0bccdeb3b3bb30 +847020e0a440d9c4109773ecca5d8268b44d523389993b1f5e60e541187f7c597d79ebd6e318871815e26c96b4a4dbb1 +a530aa7e5ca86fcd1bec4b072b55cc793781f38a666c2033b510a69e110eeabb54c7d8cbcb9c61fee531a6f635ffa972 +87364a5ea1d270632a44269d686b2402da737948dac27f51b7a97af80b66728b0256547a5103d2227005541ca4b7ed04 +8816fc6e16ea277de93a6d793d0eb5c15e9e93eb958c5ef30adaf8241805adeb4da8ce19c3c2167f971f61e0b361077d +8836a72d301c42510367181bb091e4be377777aed57b73c29ef2ce1d475feedd7e0f31676284d9a94f6db01cc4de81a2 +b0d9d8b7116156d9dde138d28aa05a33e61f8a85839c1e9071ccd517b46a5b4b53acb32c2edd7150c15bc1b4bd8db9e3 +ae931b6eaeda790ba7f1cd674e53dc87f6306ff44951fa0df88d506316a5da240df9794ccbd7215a6470e6b31c5ea193 +8c6d5bdf87bd7f645419d7c6444e244fe054d437ed1ba0c122fde7800603a5fadc061e5b836cb22a6cfb2b466f20f013 +90d530c6d0cb654999fa771b8d11d723f54b8a8233d1052dc1e839ea6e314fbed3697084601f3e9bbb71d2b4eaa596df +b0d341a1422588c983f767b1ed36c18b141774f67ef6a43cff8e18b73a009da10fc12120938b8bba27f225bdfd3138f9 +a131b56f9537f460d304e9a1dd75702ace8abd68cb45419695cb8dee76998139058336c87b7afd6239dc20d7f8f940cc +aa6c51fa28975f709329adee1bbd35d49c6b878041841a94465e8218338e4371f5cb6c17f44a63ac93644bf28f15d20f +88440fb584a99ebd7f9ea04aaf622f6e44e2b43bbb49fb5de548d24a238dc8f26c8da2ccf03dd43102bda9f16623f609 +9777b8695b790e702159a4a750d5e7ff865425b95fa0a3c15495af385b91c90c00a6bd01d1b77bffe8c47d01baae846f +8b9d764ece7799079e63c7f01690c8eff00896a26a0d095773dea7a35967a8c40db7a6a74692f0118bf0460c26739af4 +85808c65c485520609c9e61fa1bb67b28f4611d3608a9f7a5030ee61c3aa3c7e7dc17fff48af76b4aecee2cb0dbd22ac +ad2783a76f5b3db008ef5f7e67391fda4e7e36abde6b3b089fc4835b5c339370287935af6bd53998bed4e399eda1136d +96f18ec03ae47c205cc4242ca58e2eff185c9dca86d5158817e2e5dc2207ab84aadda78725f8dc080a231efdc093b940 +97de1ab6c6cc646ae60cf7b86df73b9cf56cc0cd1f31b966951ebf79fc153531af55ca643b20b773daa7cab784b832f7 +870ba266a9bfa86ef644b1ef025a0f1b7609a60de170fe9508de8fd53170c0b48adb37f19397ee8019b041ce29a16576 +ad990e888d279ac4e8db90619d663d5ae027f994a3992c2fbc7d262b5990ae8a243e19157f3565671d1cb0de17fe6e55 +8d9d5adcdd94c5ba3be4d9a7428133b42e485f040a28d16ee2384758e87d35528f7f9868de9bd23d1a42a594ce50a567 +85a33ed75d514ece6ad78440e42f7fcdb59b6f4cff821188236d20edae9050b3a042ce9bc7d2054296e133d033e45022 +92afd2f49a124aaba90de59be85ff269457f982b54c91b06650c1b8055f9b4b0640fd378df02a00e4fc91f7d226ab980 +8c0ee09ec64bd831e544785e3d65418fe83ed9c920d9bb4d0bf6dd162c1264eb9d6652d2def0722e223915615931581c +8369bedfa17b24e9ad48ebd9c5afea4b66b3296d5770e09b00446c5b0a8a373d39d300780c01dcc1c6752792bccf5fd0 +8b9e960782576a59b2eb2250d346030daa50bbbec114e95cdb9e4b1ba18c3d34525ae388f859708131984976ca439d94 +b682bface862008fea2b5a07812ca6a28a58fd151a1d54c708fc2f8572916e0d678a9cb8dc1c10c0470025c8a605249e +a38d5e189bea540a824b36815fc41e3750760a52be0862c4cac68214febdc1a754fb194a7415a8fb7f96f6836196d82a +b9e7fbda650f18c7eb8b40e42cc42273a7298e65e8be524292369581861075c55299ce69309710e5b843cb884de171bd +b6657e5e31b3193874a1bace08f42faccbd3c502fb73ad87d15d18a1b6c2a146f1baa929e6f517db390a5a47b66c0acf +ae15487312f84ed6265e4c28327d24a8a0f4d2d17d4a5b7c29b974139cf93223435aaebe3af918f5b4bb20911799715f +8bb4608beb06bc394e1a70739b872ce5a2a3ffc98c7547bf2698c893ca399d6c13686f6663f483894bccaabc3b9c56ad +b58ac36bc6847077584308d952c5f3663e3001af5ecf2e19cb162e1c58bd6c49510205d453cffc876ca1dc6b8e04a578 +924f65ced61266a79a671ffb49b300f0ea44c50a0b4e3b02064faa99fcc3e4f6061ea8f38168ab118c5d47bd7804590e +8d67d43b8a06b0ff4fafd7f0483fa9ed1a9e3e658a03fb49d9d9b74e2e24858dc1bed065c12392037b467f255d4e5643 +b4d4f87813125a6b355e4519a81657fa97c43a6115817b819a6caf4823f1d6a1169683fd68f8d025cdfa40ebf3069acb +a7fd4d2c8e7b59b8eed3d4332ae94b77a89a2616347402f880bc81bde072220131e6dbec8a605be3a1c760b775375879 +8d4a7d8fa6f55a30df37bcf74952e2fa4fd6676a2e4606185cf154bdd84643fd01619f8fb8813a564f72e3f574f8ce30 +8086fb88e6260e9a9c42e9560fde76315ff5e5680ec7140f2a18438f15bc2cc7d7d43bfb5880b180b738c20a834e6134 +916c4c54721de03934fee6f43de50bb04c81f6f8dd4f6781e159e71c40c60408aa54251d457369d133d4ba3ed7c12cb4 +902e5bf468f11ed9954e2a4a595c27e34abe512f1d6dc08bbca1c2441063f9af3dc5a8075ab910a10ff6c05c1c644a35 +a1302953015e164bf4c15f7d4d35e3633425a78294406b861675667eec77765ff88472306531e5d3a4ec0a2ff0dd6a9e +87874461df3c9aa6c0fa91325576c0590f367075f2f0ecfeb34afe162c04c14f8ce9d608c37ac1adc8b9985bc036e366 +84b50a8a61d3cc609bfb0417348133e698fe09a6d37357ce3358de189efcf35773d78c57635c2d26c3542b13cc371752 +acaed2cff8633d12c1d12bb7270c54d65b0b0733ab084fd47f81d0a6e1e9b6f300e615e79538239e6160c566d8bb8d29 +889e6a0e136372ca4bac90d1ab220d4e1cad425a710e8cdd48b400b73bb8137291ceb36a39440fa84305783b1d42c72f +90952e5becec45b2b73719c228429a2c364991cf1d5a9d6845ae5b38018c2626f4308daa322cab1c72e0f6c621bb2b35 +8f5a97a801b6e9dcd66ccb80d337562c96f7914e7169e8ff0fda71534054c64bf2a9493bb830623d612cfe998789be65 +84f3df8b9847dcf1d63ca470dc623154898f83c25a6983e9b78c6d2d90a97bf5e622445be835f32c1e55e6a0a562ea78 +91d12095cd7a88e7f57f254f02fdb1a1ab18984871dead2f107404bcf8069fe68258c4e6f6ebd2477bddf738135400bb +b771a28bc04baef68604d4723791d3712f82b5e4fe316d7adc2fc01b935d8e644c06d59b83bcb542afc40ebafbee0683 +872f6341476e387604a7e93ae6d6117e72d164e38ebc2b825bc6df4fcce815004d7516423c190c1575946b5de438c08d +90d6b4aa7d40a020cdcd04e8b016d041795961a8e532a0e1f4041252131089114a251791bf57794cadb7d636342f5d1c +899023ba6096a181448d927fed7a0fe858be4eac4082a42e30b3050ee065278d72fa9b9d5ce3bc1372d4cbd30a2f2976 +a28f176571e1a9124f95973f414d5bdbf5794d41c3839d8b917100902ac4e2171eb940431236cec93928a60a77ede793 +838dbe5bcd29c4e465d02350270fa0036cd46f8730b13d91e77afb7f5ed16525d0021d3b2ae173a76c378516a903e0cb +8e105d012dd3f5d20f0f1c4a7e7f09f0fdd74ce554c3032e48da8cce0a77260d7d47a454851387770f5c256fa29bcb88 +8f4df0f9feeb7a487e1d138d13ea961459a6402fd8f8cabb226a92249a0d04ded5971f3242b9f90d08da5ff66da28af6 +ad1cfda4f2122a20935aa32fb17c536a3653a18617a65c6836700b5537122af5a8206befe9eaea781c1244c43778e7f1 +832c6f01d6571964ea383292efc8c8fa11e61c0634a25fa180737cc7ab57bc77f25e614aac9a2a03d98f27b3c1c29de2 +903f89cc13ec6685ac7728521898781fecb300e9094ef913d530bf875c18bcc3ceed7ed51e7b482d45619ab4b025c2e9 +a03c474bb915aad94f171e8d96f46abb2a19c9470601f4c915512ec8b9e743c3938450a2a5b077b4618b9df8809e1dc1 +83536c8456f306045a5f38ae4be2e350878fa7e164ea408d467f8c3bc4c2ee396bd5868008c089183868e4dfad7aa50b +88f26b4ea1b236cb326cd7ad7e2517ec8c4919598691474fe15d09cabcfc37a8d8b1b818f4d112432ee3a716b0f37871 +a44324e3fe96e9c12b40ded4f0f3397c8c7ee8ff5e96441118d8a6bfad712d3ac990b2a6a23231a8f691491ac1fd480f +b0de4693b4b9f932191a21ee88629964878680152a82996c0019ffc39f8d9369bbe2fe5844b68d6d9589ace54af947e4 +8e5d8ba948aea5fd26035351a960e87f0d23efddd8e13236cc8e4545a3dda2e9a85e6521efb8577e03772d3637d213d9 +93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556 +8731176363ad7658a2862426ee47a5dce9434216cef60e6045fa57c40bb3ce1e78dac4510ae40f1f31db5967022ced32 +b10c9a96745722c85bdb1a693100104d560433d45b9ac4add54c7646a7310d8e9b3ca9abd1039d473ae768a18e489845 +a2ac374dfbb464bf850b4a2caf15b112634a6428e8395f9c9243baefd2452b4b4c61b0cb2836d8eae2d57d4900bf407e +b69fe3ded0c4f5d44a09a0e0f398221b6d1bf5dbb8bc4e338b93c64f1a3cac1e4b5f73c2b8117158030ec03787f4b452 +8852cdbaf7d0447a8c6f211b4830711b3b5c105c0f316e3a6a18dcfbb9be08bd6f4e5c8ae0c3692da08a2dfa532f9d5c +93bbf6d7432a7d98ade3f94b57bf9f4da9bc221a180a370b113066dd42601bb9e09edd79e2e6e04e00423399339eebda +a80941c391f1eeafc1451c59e4775d6a383946ff22997aeaadf806542ba451d3b0f0c6864eeba954174a296efe2c1550 +a045fe2bb011c2a2f71a0181a8f457a3078470fb74c628eab8b59aef69ffd0d649723bf74d6885af3f028bc5a104fb39 +b9d8c35911009c4c8cad64692139bf3fc16b78f5a19980790cb6a7aea650a25df4231a4437ae0c351676a7e42c16134f +94c79501ded0cfcbab99e1841abe4a00a0252b3870e20774c3da16c982d74c501916ec28304e71194845be6e3113c7ab +900a66418b082a24c6348d8644ddb1817df5b25cb33044a519ef47cc8e1f7f1e38d2465b7b96d32ed472d2d17f8414c6 +b26f45d393b8b2fcb29bdbb16323dc7f4b81c09618519ab3a39f8ee5bd148d0d9f3c0b5dfab55b5ce14a1cb9206d777b +aa1a87735fc493a80a96a9a57ca40a6d9c32702bfcaa9869ce1a116ae65d69cefe2f3e79a12454b4590353e96f8912b4 +a922b188d3d0b69b4e4ea2a2aa076566962844637da12c0832105d7b31dea4a309eee15d12b7a336be3ea36fcbd3e3b7 +8f3841fcf4105131d8c4d9885e6e11a46c448226401cf99356c291fadb864da9fa9d30f3a73c327f23f9fd99a11d633e +9791d1183fae270e226379af6c497e7da803ea854bb20afa74b253239b744c15f670ee808f708ede873e78d79a626c9a +a4cad52e3369491ada61bf28ada9e85de4516d21c882e5f1cd845bea9c06e0b2887b0c5527fcff6fc28acd3c04f0a796 +b9ac86a900899603452bd11a7892a9bfed8054970bfcbeaa8c9d1930db891169e38d6977f5258c25734f96c8462eee3b +a3a154c28e5580656a859f4efc2f5ebfa7eaa84ca40e3f134fa7865e8581586db74992dbfa4036aa252fba103773ddde +95cc2a0c1885a029e094f5d737e3ecf4d26b99036453a8773c77e360101f9f98676ee246f6f732a377a996702d55691f +842651bbe99720438d8d4b0218feb60481280c05beb17750e9ca0d8c0599a60f873b7fbdcc7d8835ba9a6d57b16eec03 +81ee54699da98f5620307893dcea8f64670609fa20e5622265d66283adeac122d458b3308c5898e6c57c298db2c8b24f +b97868b0b2bc98032d68352a535a1b341b9ff3c7af4e3a7f3ebc82d3419daa1b5859d6aedc39994939623c7cd878bd9b +b60325cd5d36461d07ef253d826f37f9ee6474a760f2fff80f9873d01fd2b57711543cdc8d7afa1c350aa753c2e33dea +8c205326c11d25a46717b780c639d89714c7736c974ae71287e3f4b02e6605ac2d9b4928967b1684f12be040b7bf2dd3 +95a392d82db51e26ade6c2ccd3396d7e40aff68fa570b5951466580d6e56dda51775dce5cf3a74a7f28c3cb2eb551c4d +8f2cc8071eb56dffb70bda6dd433b556221dc8bba21c53353c865f00e7d4d86c9e39f119ea9a8a12ef583e9a55d9a6b6 +9449a71af9672aaf8856896d7e3d788b22991a7103f75b08c0abbcc2bfe60fda4ed8ce502cea4511ff0ea52a93e81222 +857090ab9fdb7d59632d068f3cc8cf27e61f0d8322d30e6b38e780a1f05227199b4cd746aac1311c36c659ef20931f28 +98a891f4973e7d9aaf9ac70854608d4f7493dffc7e0987d7be9dd6029f6ea5636d24ef3a83205615ca1ff403750058e1 +a486e1365bbc278dd66a2a25d258dc82f46b911103cb16aab3945b9c95ae87b386313a12b566df5b22322ede0afe25ad +a9a1eb399ed95d396dccd8d1ac718043446f8b979ec62bdce51c617c97a312f01376ab7fb87d27034e5f5570797b3c33 +b7abc3858d7a74bb446218d2f5a037e0fae11871ed9caf44b29b69c500c1fa1dcfad64c9cdccc9d80d5e584f06213deb +8cfb09fe2e202faa4cebad932b1d35f5ca204e1c2a0c740a57812ac9a6792130d1312aabd9e9d4c58ca168bfebd4c177 +a90a305c2cd0f184787c6be596fa67f436afd1f9b93f30e875f817ac2aae8bdd2e6e656f6be809467e6b3ad84adb86b1 +80a9ef993c2b009ae172cc8f7ec036f5734cf4f4dfa06a7db4d54725e7fbfae5e3bc6f22687bdbb6961939d6f0c87537 +848ade1901931e72b955d7db1893f07003e1708ff5d93174bac5930b9a732640f0578839203e9b77eb27965c700032d3 +93fdf4697609c5ae9c33b9ca2f5f1af44abeb2b98dc4fdf732cf7388de086f410730dc384d9b7a7f447bb009653c8381 +89ce3fb805aea618b5715c0d22a9f46da696b6fa86794f56fdf1d44155a33d42daf1920bcbe36cbacf3cf4c92df9cbc7 +829ce2c342cf82aa469c65f724f308f7a750bd1494adc264609cd790c8718b8b25b5cab5858cf4ee2f8f651d569eea67 +af2f0cee7bf413204be8b9df59b9e4991bc9009e0d6dbe6815181df0ec2ca93ab8f4f3135b1c14d8f53d74bff0bd6f27 +b87998cecf7b88cde93d1779f10a521edd5574a2fbd240102978639ec57433ba08cdb53849038a329cebbe74657268d2 +a64542a1261a6ed3d720c2c3a802303aad8c4c110c95d0f12e05c1065e66f42da494792b6bfc5b9272363f3b1d457f58 +86a6fd042e4f282fadf07a4bfee03fc96a3aea49f7a00f52bf249a20f1ec892326855410e61f37fbb27d9305eb2fc713 +967ea5bc403b6db269682f7fd0df90659350d7e1aa66bc4fab4c9dfcd75ed0bba4b52f1cebc5f34dc8ba810793727629 +a52990f9f3b8616ce3cdc2c74cd195029e6a969753dcf2d1630438700e7d6ebde36538532b3525ac516f5f2ce9dd27a3 +a64f7ff870bab4a8bf0d4ef6f5c744e9bf1021ed08b4c80903c7ad318e80ba1817c3180cc45cb5a1cae1170f0241655f +b00f706fa4de1f663f021e8ad3d155e84ce6084a409374b6e6cd0f924a0a0b51bebaaaf1d228c77233a73b0a5a0df0e9 +8b882cc3bff3e42babdb96df95fb780faded84887a0a9bab896bef371cdcf169d909f5658649e93006aa3c6e1146d62e +9332663ef1d1dcf805c3d0e4ce7a07d9863fb1731172e766b3cde030bf81682cc011e26b773fb9c68e0477b4ae2cfb79 +a8aa8151348dbd4ef40aaeb699b71b4c4bfd3218560c120d85036d14f678f6736f0ec68e80ce1459d3d35feccc575164 +a16cd8b729768f51881c213434aa28301fa78fcb554ddd5f9012ee1e4eae7b5cb3dd88d269d53146dea92d10790faf0b +86844f0ef9d37142faf3b1e196e44fbe280a3ba4189aa05c356778cb9e3b388a2bff95eed305ada8769935c9974e4c57 +ae2eec6b328fccf3b47bcdac32901ac2744a51beb410b04c81dea34dee4912b619466a4f5e2780d87ecefaebbe77b46d +915df4c38d301c8a4eb2dc5b1ba0ffaad67cbb177e0a80095614e9c711f4ef24a4cef133f9d982a63d2a943ba6c8669d +ae6a2a4dedfc2d1811711a8946991fede972fdf2a389b282471280737536ffc0ac3a6d885b1f8bda0366eb0b229b9979 +a9b628c63d08b8aba6b1317f6e91c34b2382a6c85376e8ef2410a463c6796740ae936fc4e9e0737cb9455d1daa287bd8 +848e30bf7edf2546670b390d5cf9ab71f98fcb6add3c0b582cb34996c26a446dee5d1bde4fdcde4fc80c10936e117b29 +907d6096c7c8c087d1808dd995d5d2b9169b3768c3f433475b50c2e2bd4b082f4d543afd8b0b0ddffa9c66222a72d51d +a59970a2493b07339124d763ac9d793c60a03354539ecbcf6035bc43d1ea6e35718202ae6d7060b7d388f483d971573c +b9cfef2af9681b2318f119d8611ff6d9485a68d8044581b1959ab1840cbca576dbb53eec17863d2149966e9feb21122f +ad47271806161f61d3afa45cdfe2babceef5e90031a21779f83dc8562e6076680525b4970b2f11fe9b2b23c382768323 +8e425a99b71677b04fe044625d338811fbb8ee32368a424f6ab2381c52e86ee7a6cecedf777dc97181519d41c351bc22 +86b55b54d7adefc12954a9252ee23ae83efe8b5b4b9a7dc307904413e5d69868c7087a818b2833f9b004213d629be8ad +a14fda6b93923dd11e564ae4457a66f397741527166e0b16a8eb91c6701c244fd1c4b63f9dd3515193ec88fa6c266b35 +a9b17c36ae6cd85a0ed7f6cabc5b47dc8f80ced605db327c47826476dc1fb8f8669aa7a7dc679fbd4ee3d8e8b4bd6a6f +82a0829469c1458d959c821148f15dacae9ea94bf56c59a6ab2d4dd8b3d16d73e313b5a3912a6c1f131d73a8f06730c4 +b22d56d549a53eaef549595924bdb621ff807aa4513feedf3fdcbf7ba8b6b9cfa4481c2f67fc642db397a6b794a8b63a +974c59c24392e2cb9294006cbe3c52163e255f3bd0c2b457bdc68a6338e6d5b6f87f716854492f8d880a6b896ccf757c +b70d247ba7cad97c50b57f526c2ba915786e926a94e8f8c3eebc2e1be6f4255411b9670e382060049c8f4184302c40b2 +ad80201fe75ef21c3ddbd98cf23591e0d7a3ba1036dfe77785c32f44755a212c31f0ceb0a0b6f5ee9b6dc81f358d30c3 +8c656e841f9bb90b9a42d425251f3fdbc022a604d75f5845f479ed4be23e02aaf9e6e56cde351dd7449c50574818a199 +8b88dd3fa209d3063b7c5b058f7249ee9900fbc2287d16da61a0704a0a1d71e45d9c96e1cda7fdf9654534ec44558b22 +961da00cc8750bd84d253c08f011970ae1b1158ad6778e8ed943d547bceaf52d6d5a212a7de3bf2706688c4389b827d2 +a5dd379922549a956033e3d51a986a4b1508e575042b8eaa1df007aa77cf0b8c2ab23212f9c075702788fa9c53696133 +ac8fcfde3a349d1e93fc8cf450814e842005c545c4844c0401bc80e6b96cdb77f29285a14455e167c191d4f312e866cd +ac63d79c799783a8466617030c59dd5a8f92ee6c5204676fd8d881ce5f7f8663bdbeb0379e480ea9b6340ab0dc88e574 +805874fde19ce359041ae2bd52a39e2841acabfd31f965792f2737d7137f36d4e4722ede8340d8c95afa6af278af8acb +8d2f323a228aa8ba7b7dc1399138f9e6b41df1a16a7069003ab8104b8b68506a45141bc5fe66acf430e23e13a545190b +a1610c721a2d9af882bb6b39bea97cff1527a3aea041d25934de080214ae77c959e79957164440686d15ab301e897d4d +aba16d29a47fc36f12b654fde513896723e2c700c4190f11b26aa4011da57737ad717daa02794aa3246e4ae5f0b0cc3a +a406db2f15fdd135f346cc4846623c47edd195e80ba8c7cb447332095314d565e4040694ca924696bb5ee7f8996ea0ba +8b30e2cd9b47d75ba57b83630e40f832249af6c058d4f490416562af451993eec46f3e1f90bc4d389e4c06abd1b32a46 +aacf9eb7036e248e209adbfc3dd7ce386569ea9b312caa4b240726549db3c68c4f1c8cbf8ed5ea9ea60c7e57c9df3b8e +b20fcac63bf6f5ee638a42d7f89be847f348c085ddcbec3fa318f4323592d136c230495f188ef2022aa355cc2b0da6f9 +811eff750456a79ec1b1249d76d7c1547065b839d8d4aaad860f6d4528eb5b669473dcceeeea676cddbc3980b68461b7 +b52d14ae33f4ab422f953392ae76a19c618cc31afc96290bd3fe2fb44c954b5c92c4789f3f16e8793f2c0c1691ade444 +a7826dafeeba0db5b66c4dfcf2b17fd7b40507a5a53ac2e42942633a2cb30b95ba1739a6e9f3b7a0e0f1ec729bf274e2 +8acfd83ddf7c60dd7c8b20c706a3b972c65d336b8f9b3d907bdd8926ced271430479448100050b1ef17578a49c8fa616 +af0c69f65184bb06868029ad46f8465d75c36814c621ac20a5c0b06a900d59305584f5a6709683d9c0e4b6cd08d650a6 +b6cc8588191e00680ee6c3339bd0f0a17ad8fd7f4be57d5d7075bede0ea593a19e67f3d7c1a20114894ee5bfcab71063 +a82fd4f58635129dbb6cc3eb9391cf2d28400018b105fc41500fbbd12bd890b918f97d3d359c29dd3b4c4e34391dfab0 +92fc544ed65b4a3625cf03c41ddff7c039bc22d22c0d59dcc00efd5438401f2606adb125a1d5de294cca216ec8ac35a3 +906f67e4a32582b71f15940523c0c7ce370336935e2646bdaea16a06995256d25e99df57297e39d6c39535e180456407 +97510337ea5bbd5977287339197db55c60533b2ec35c94d0a460a416ae9f60e85cee39be82abeeacd5813cf54df05862 +87e6894643815c0ea48cb96c607266c5ee4f1f82ba5fe352fb77f9b6ed14bfc2b8e09e80a99ac9047dfcf62b2ae26795 +b6fd55dd156622ad7d5d51b7dde75e47bd052d4e542dd6449e72411f68275775c846dde301e84613312be8c7bce58b07 +b98461ac71f554b2f03a94e429b255af89eec917e208a8e60edf5fc43b65f1d17a20de3f31d2ce9f0cb573c25f2f4d98 +96f0dea40ca61cefbee41c4e1fe9a7d81fbe1f49bb153d083ab70f5d0488a1f717fd28cedcf6aa18d07cce2c62801898 +8d7c3ab310184f7dc34b6ce4684e4d29a31e77b09940448ea4daac730b7eb308063125d4dd229046cf11bfd521b771e0 +96f0564898fe96687918bbf0a6adead99cf72e3a35ea3347e124af9d006221f8e82e5a9d2fe80094d5e8d48e610f415e +ad50fcb92c2675a398cf07d4c40a579e44bf8d35f27cc330b57e54d5ea59f7d898af0f75dccfe3726e5471133d70f92b +828beed62020361689ae7481dd8f116902b522fb0c6c122678e7f949fdef70ead011e0e6bffd25678e388744e17cdb69 +8349decac1ca16599eee2efc95bcaabf67631107da1d34a2f917884bd70dfec9b4b08ab7bc4379d6c73b19c0b6e54fb8 +b2a6a2e50230c05613ace9e58bb2e98d94127f196f02d9dddc53c43fc68c184549ca12d713cb1b025d8260a41e947155 +94ff52181aadae832aed52fc3b7794536e2a31a21fc8be3ea312ca5c695750d37f08002f286b33f4023dba1e3253ecfa +a21d56153c7e5972ee9a319501be4faff199fdf09bb821ea9ce64aa815289676c00f105e6f00311b3a5b627091b0d0fc +a27a60d219f1f0c971db73a7f563b371b5c9fc3ed1f72883b2eac8a0df6698400c9954f4ca17d7e94e44bd4f95532afb +a2fc56fae99b1f18ba5e4fe838402164ce82f8a7f3193d0bbd360c2bac07c46f9330c4c7681ffb47074c6f81ee6e7ac6 +b748e530cd3afb96d879b83e89c9f1a444f54e55372ab1dcd46a0872f95ce8f49cf2363fc61be82259e04f555937ed16 +8bf8993e81080c7cbba1e14a798504af1e4950b2f186ab3335b771d6acaee4ffe92131ae9c53d74379d957cb6344d9cd +96774d0ef730d22d7ab6d9fb7f90b9ead44285219d076584a901960542756700a2a1603cdf72be4708b267200f6c36a9 +b47703c2ab17be1e823cc7bf3460db1d6760c0e33862c90ca058845b2ff234b0f9834ddba2efb2ee1770eb261e7d8ffd +84319e67c37a9581f8b09b5e4d4ae88d0a7fb4cbb6908971ab5be28070c3830f040b1de83ee663c573e0f2f6198640e4 +96811875fa83133e0b3c0e0290f9e0e28bca6178b77fdf5350eb19344d453dbd0d71e55a0ef749025a5a2ca0ad251e81 +81a423423e9438343879f2bfd7ee9f1c74ebebe7ce3cfffc8a11da6f040cc4145c3b527bd3cf63f9137e714dbcb474ef +b8c3535701ddbeec2db08e17a4fa99ba6752d32ece5331a0b8743676f421fcb14798afc7c783815484f14693d2f70db8 +81aee980c876949bf40782835eec8817d535f6f3f7e00bf402ddd61101fdcd60173961ae90a1cf7c5d060339a18c959d +87e67b928d97b62c49dac321ce6cb680233f3a394d4c9a899ac2e8db8ccd8e00418e66cdfd68691aa3cb8559723b580c +8eac204208d99a2b738648df96353bbb1b1065e33ee4f6bba174b540bbbd37d205855e1f1e69a6b7ff043ca377651126 +848e6e7a54ad64d18009300b93ea6f459ce855971dddb419b101f5ac4c159215626fadc20cc3b9ab1701d8f6dfaddd8b +88aa123d9e0cf309d46dddb6acf634b1ade3b090a2826d6e5e78669fa1220d6df9a6697d7778cd9b627db17eea846126 +9200c2a629b9144d88a61151b661b6c4256cc5dadfd1e59a8ce17a013c2d8f7e754aabe61663c3b30f1bc47784c1f8cf +b6e1a2827c3bdda91715b0e1b1f10dd363cef337e7c80cac1f34165fc0dea7c8b69747e310563db5818390146ce3e231 +92c333e694f89f0d306d54105b2a5dcc912dbe7654d9e733edab12e8537350815be472b063e56cfde5286df8922fdecb +a6fac04b6d86091158ebb286586ccfec2a95c9786e14d91a9c743f5f05546073e5e3cc717635a0c602cad8334e922346 +a581b4af77feebc1fb897d49b5b507c6ad513d8f09b273328efbb24ef0d91eb740d01b4d398f2738125dacfe550330cd +81c4860cccf76a34f8a2bc3f464b7bfd3e909e975cce0d28979f457738a56e60a4af8e68a3992cf273b5946e8d7f76e2 +8d1eaa09a3180d8af1cbaee673db5223363cc7229a69565f592fa38ba0f9d582cedf91e15dabd06ebbf2862fc0feba54 +9832f49b0147f4552402e54593cfa51f99540bffada12759b71fcb86734be8e500eea2d8b3d036710bdf04c901432de9 +8bdb0e8ec93b11e5718e8c13cb4f5de545d24829fd76161216340108098dfe5148ed25e3b57a89a516f09fa79043734d +ab96f06c4b9b0b2c0571740b24fca758e6976315053a7ecb20119150a9fa416db2d3a2e0f8168b390bb063f0c1caf785 +ab777f5c52acd62ecf4d1f168b9cc8e1a9b45d4ec6a8ff52c583e867c2239aba98d7d3af977289b367edce03d9c2dfb1 +a09d3ce5e748da84802436951acc3d3ea5d8ec1d6933505ed724d6b4b0d69973ab0930daec9c6606960f6e541e4a3ce2 +8ef94f7be4d85d5ad3d779a5cf4d7b2fc3e65c52fb8e1c3c112509a4af77a0b5be994f251e5e40fabeeb1f7d5615c22b +a7406a5bf5708d9e10922d3c5c45c03ef891b8d0d74ec9f28328a72be4cdc05b4f2703fa99366426659dfca25d007535 +b7f52709669bf92a2e070bfe740f422f0b7127392c5589c7f0af71bb5a8428697c762d3c0d74532899da24ea7d8695c2 +b9dfb0c8df84104dbf9239ccefa4672ef95ddabb8801b74997935d1b81a78a6a5669a3c553767ec19a1281f6e570f4ff +ae4d5c872156061ce9195ac640190d8d71dd406055ee43ffa6f9893eb24b870075b74c94d65bc1d5a07a6573282b5520 +afe6bd3eb72266d333f1807164900dcfa02a7eb5b1744bb3c86b34b3ee91e3f05e38fa52a50dc64eeb4bdb1dd62874b8 +948043cf1bc2ef3c01105f6a78dc06487f57548a3e6ef30e6ebc51c94b71e4bf3ff6d0058c72b6f3ecc37efd7c7fa8c0 +a22fd17c2f7ffe552bb0f23fa135584e8d2d8d75e3f742d94d04aded2a79e22a00dfe7acbb57d44e1cdb962fb22ae170 +8cd0f4e9e4fb4a37c02c1bde0f69359c43ab012eb662d346487be0c3758293f1ca560122b059b091fddce626383c3a8f +90499e45f5b9c81426f3d735a52a564cafbed72711d9279fdd88de8038e953bc48c57b58cba85c3b2e4ce56f1ddb0e11 +8c30e4c034c02958384564cac4f85022ef36ab5697a3d2feaf6bf105049675bbf23d01b4b6814711d3d9271abff04cac +81f7999e7eeea30f3e1075e6780bbf054f2fb6f27628a2afa4d41872a385b4216dd5f549da7ce6cf39049b2251f27fb7 +b36a7191f82fc39c283ffe53fc1f5a9a00b4c64eee7792a8443475da9a4d226cf257f226ea9d66e329af15d8f04984ec +aad4da528fdbb4db504f3041c747455baff5fcd459a2efd78f15bdf3aea0bdb808343e49df88fe7a7c8620009b7964a3 +99ebd8c6dd5dd299517fb6381cfc2a7f443e6e04a351440260dd7c2aee3f1d8ef06eb6c18820b394366ecdfd2a3ce264 +8873725b81871db72e4ec3643084b1cdce3cbf80b40b834b092767728605825c19b6847ad3dcf328438607e8f88b4410 +b008ee2f895daa6abd35bd39b6f7901ae4611a11a3271194e19da1cdcc7f1e1ea008fe5c5440e50d2c273784541ad9c5 +9036feafb4218d1f576ef89d0e99124e45dacaa6d816988e34d80f454d10e96809791d5b78f7fd65f569e90d4d7238c5 +92073c1d11b168e4fa50988b0288638b4868e48bbc668c5a6dddf5499875d53be23a285acb5e4bad60114f6cf6c556e9 +88c87dfcb8ba6cbfe7e1be081ccfadbd589301db2cb7c99f9ee5d7db90aa297ed1538d5a867678a763f2deede5fd219a +b42a562805c661a50f5dea63108002c0f27c0da113da6a9864c9feb5552225417c0356c4209e8e012d9bcc9d182c7611 +8e6317d00a504e3b79cd47feb4c60f9df186467fe9ca0f35b55c0364db30528f5ff071109dabb2fc80bb9cd4949f0c24 +b7b1ea6a88694f8d2f539e52a47466695e39e43a5eb9c6f23bca15305fe52939d8755cc3ac9d6725e60f82f994a3772f +a3cd55161befe795af93a38d33290fb642b8d80da8b786c6e6fb02d393ea308fbe87f486994039cbd7c7b390414594b6 +b416d2d45b44ead3b1424e92c73c2cf510801897b05d1724ff31cbd741920cd858282fb5d6040fe1f0aa97a65bc49424 +950ee01291754feace97c2e933e4681e7ddfbc4fcd079eb6ff830b0e481d929c93d0c7fb479c9939c28ca1945c40da09 +869bd916aee8d86efe362a49010382674825d49195b413b4b4018e88ce43fe091b475d0b863ff0ba2259400f280c2b23 +9782f38cd9c9d3385ec286ebbc7cba5b718d2e65a5890b0a5906b10a89dc8ed80d417d71d7c213bf52f2af1a1f513ea7 +91cd33bc2628d096269b23faf47ee15e14cb7fdc6a8e3a98b55e1031ea0b68d10ba30d97e660f7e967d24436d40fad73 +8becc978129cc96737034c577ae7225372dd855da8811ae4e46328e020c803833b5bdbc4a20a93270e2b8bd1a2feae52 +a36b1d8076783a9522476ce17f799d78008967728ce920531fdaf88303321bcaf97ecaa08e0c01f77bc32e53c5f09525 +b4720e744943f70467983aa34499e76de6d59aa6fadf86f6b787fdce32a2f5b535b55db38fe2da95825c51002cfe142d +91ad21fc502eda3945f6de874d1b6bf9a9a7711f4d61354f9e5634fc73f9c06ada848de15ab0a75811d3250be862827d +84f78e2ebf5fc077d78635f981712daf17e2475e14c2a96d187913006ad69e234746184a51a06ef510c9455b38acb0d7 +960aa7906e9a2f11db64a26b5892ac45f20d2ccb5480f4888d89973beb6fa0dfdc06d68d241ff5ffc7f1b82b1aac242d +a99365dcd1a00c66c9db6924b97c920f5c723380e823b250db85c07631b320ec4e92e586f7319e67a522a0578f7b6d6c +a25d92d7f70cf6a88ff317cfec071e13774516da664f5fac0d4ecaa65b8bf4eb87a64a4d5ef2bd97dfae98d388dbf5cc +a7af47cd0041295798f9779020a44653007444e8b4ef0712982b06d0dcdd434ec4e1f7c5f7a049326602cb605c9105b7 +aefe172eac5568369a05980931cc476bebd9dea573ba276d59b9d8c4420784299df5a910033b7e324a6c2dfc62e3ef05 +b69bc9d22ffa645baa55e3e02522e9892bb2daa7fff7c15846f13517d0799766883ee09ae0869df4139150c5b843ca8a +95a10856140e493354fdd12722c7fdded21b6a2ffbc78aa2697104af8ad0c8e2206f44b0bfee077ef3949d46bbf7c16b +891f2fcd2c47cbea36b7fa715968540c233313f05333f09d29aba23c193f462ed490dd4d00969656e89c53155fdfe710 +a6c33e18115e64e385c843dde34e8a228222795c7ca90bc2cc085705d609025f3351d9be61822c69035a49fb3e48f2d5 +b87fb12f12c0533b005adad0487f03393ff682e13575e3cb57280c3873b2c38ba96a63c49eef7a442753d26b7005230b +b905c02ba451bfd411c135036d92c27af3b0b1c9c2f1309d6948544a264b125f39dd41afeff4666b12146c545adc168a +8b29c513f43a78951cf742231cf5457a6d9d55edf45df5481a0f299a418d94effef561b15d2c1a01d1b8067e7153fda9 +b9941cccd51dc645920d2781c81a317e5a33cb7cf76427b60396735912cb6d2ca9292bb4d36b6392467d390d2c58d9f3 +a8546b627c76b6ef5c93c6a98538d8593dbe21cb7673fd383d5401b0c935eea0bdeeefeb1af6ad41bad8464fb87bbc48 +aa286b27de2812de63108a1aec29d171775b69538dc6198640ac1e96767c2b83a50391f49259195957d457b493b667c9 +a932fb229f641e9abbd8eb2bd874015d97b6658ab6d29769fc23b7db9e41dd4f850382d4c1f08af8f156c5937d524473 +a1412840fcc86e2aeec175526f2fb36e8b3b8d21a78412b7266daf81e51b3f68584ed8bd42a66a43afdd8c297b320520 +89c78be9efb624c97ebca4fe04c7704fa52311d183ffd87737f76b7dadc187c12c982bd8e9ed7cd8beb48cdaafd2fd01 +a3f5ddec412a5bec0ce15e3bcb41c6214c2b05d4e9135a0d33c8e50a78eaba71e0a5a6ea8b45854dec5c2ed300971fc2 +9721f9cec7a68b7758e3887548790de49fa6a442d0396739efa20c2f50352a7f91d300867556d11a703866def2d5f7b5 +a23764e140a87e5991573521af039630dd28128bf56eed2edbed130fd4278e090b60cf5a1dca9de2910603d44b9f6d45 +a1a6494a994215e48ab55c70efa8ffdddce6e92403c38ae7e8dd2f8288cad460c6c7db526bbdf578e96ca04d9fe12797 +b1705ea4cb7e074efe0405fc7b8ee2ec789af0426142f3ec81241cacd4f7edcd88e39435e4e4d8e7b1df64f3880d6613 +85595d061d677116089a6064418b93eb44ff79e68d12bd9625078d3bbc440a60d0b02944eff6054433ee34710ae6fbb4 +9978d5e30bedb7526734f9a1febd973a70bfa20890490e7cc6f2f9328feab1e24f991285dbc3711d892514e2d7d005ad +af30243c66ea43b9f87a061f947f7bce745f09194f6e95f379c7582b9fead920e5d6957eaf05c12ae1282ada4670652f +a1930efb473f88001e47aa0b2b2a7566848cccf295792e4544096ecd14ee5d7927c173a8576b405bfa2eec551cd67eb5 +b0446d1c590ee5a45f7e22d269c044f3848c97aec1d226b44bfd0e94d9729c28a38bccddc3a1006cc5fe4e3c24f001f2 +b8a8380172df3d84b06176df916cf557966d4f2f716d3e9437e415d75b646810f79f2b2b71d857181b7fc944018883a3 +a563afec25b7817bfa26e19dc9908bc00aa8fc3d19be7d6de23648701659009d10e3e4486c28e9c6b13d48231ae29ac5 +a5a8e80579de886fb7d6408f542791876885947b27ad6fa99a8a26e381f052598d7b4e647b0115d4b5c64297e00ce28e +8f87afcc7ad33c51ac719bade3cd92da671a37a82c14446b0a2073f4a0a23085e2c8d31913ed2d0be928f053297de8f6 +a43c455ce377e0bc434386c53c752880687e017b2f5ae7f8a15c044895b242dffde4c92fb8f8bb50b18470b17351b156 +8368f8b12a5bceb1dba25adb3a2e9c7dc9b1a77a1f328e5a693f5aec195cd1e06b0fe9476b554c1c25dac6c4a5b640a3 +919878b27f3671fc78396f11531c032f3e2bd132d04cc234fa4858676b15fb1db3051c0b1db9b4fc49038216f11321ce +b48cd67fb7f1242696c1f877da4bdf188eac676cd0e561fbac1a537f7b8229aff5a043922441d603a26aae56a15faee4 +a3e0fdfd4d29ea996517a16f0370b54787fefe543c2fe73bfc6f9e560c1fd30dad8409859e2d7fa2d44316f24746c712 +8bb156ade8faf149df7bea02c140c7e392a4742ae6d0394d880a849127943e6f26312033336d3b9fdc0092d71b5efe87 +8845e5d5cc555ca3e0523244300f2c8d7e4d02aaebcb5bd749d791208856c209a6f84dd99fd55968c9f0ab5f82916707 +a3e90bb5c97b07789c2f32dff1aec61d0a2220928202f5ad5355ae71f8249237799d6c8a22602e32e572cb12eabe0c17 +b150bcc391884c996149dc3779ce71f15dda63a759ee9cc05871f5a8379dcb62b047098922c0f26c7bd04deb394c33f9 +95cd4ad88d51f0f2efcfd0c2df802fe252bb9704d1afbf9c26a248df22d55da87bdfaf41d7bc6e5df38bd848f0b13f42 +a05a49a31e91dff6a52ac8b9c2cfdd646a43f0d488253f9e3cfbce52f26667166bbb9b608fc358763a65cbf066cd6d05 +a59c3c1227fdd7c2e81f5e11ef5c406da44662987bac33caed72314081e2eed66055d38137e01b2268e58ec85dd986c0 +b7020ec3bd73a99861f0f1d88cf5a19abab1cbe14b7de77c9868398c84bb8e18dbbe9831838a96b6d6ca06e82451c67b +98d1ff2525e9718ee59a21d8900621636fcd873d9a564b8dceb4be80a194a0148daf1232742730b3341514b2e5a5436c +886d97b635975fc638c1b6afc493e5998ca139edba131b75b65cfe5a8e814f11bb678e0eeee5e6e5cd913ad3f2fefdfc +8fb9fd928d38d5d813b671c924edd56601dd7163b686c13f158645c2f869d9250f3859aa5463a39258c90fef0f41190a +aac35e1cd655c94dec3580bb3800bd9c2946c4a9856f7d725af15fbea6a2d8ca51c8ad2772abed60ee0e3fb9cb24046b +b8d71fa0fa05ac9e443c9b4929df9e7f09a919be679692682e614d24227e04894bfc14a5c73a62fb927fedff4a0e4aa7 +a45a19f11fbbb531a704badbb813ed8088ab827c884ee4e4ebf363fa1132ff7cfa9d28be9c85b143e4f7cdbc94e7cf1a +82b54703a4f295f5471b255ab59dce00f0fe90c9fb6e06b9ee48b15c91d43f4e2ef4a96c3118aeb03b08767be58181bb +8283264c8e6d2a36558f0d145c18576b6600ff45ff99cc93eca54b6c6422993cf392668633e5df396b9331e873d457e5 +8c549c03131ead601bc30eb6b9537b5d3beb7472f5bb1bcbbfd1e9f3704477f7840ab3ab7f7dc13bbbbcdff886a462d4 +afbb0c520ac1b5486513587700ad53e314cb74bfbc12e0b5fbdcfdaac36d342e8b59856196a0d84a25cff6e6e1d17e76 +89e4c22ffb51f2829061b3c7c1983c5c750cad158e3a825d46f7cf875677da5d63f653d8a297022b5db5845c9271b32b +afb27a86c4c2373088c96b9adf4433f2ebfc78ac5c526e9f0510670b6e4e5e0057c0a4f75b185e1a30331b9e805c1c15 +a18e16b57445f88730fc5d3567bf5a176861dc14c7a08ed2996fe80eed27a0e7628501bcb78a1727c5e9ac55f29c12c4 +93d61bf88b192d6825cf4e1120af1c17aa0f994d158b405e25437eaeefae049f7b721a206e7cc8a04fdc29d3c42580a1 +a99f2995a2e3ed2fd1228d64166112038de2f516410aa439f4c507044e2017ea388604e2d0f7121256fadf7fbe7023d1 +914fd91cffc23c32f1c6d0e98bf660925090d873367d543034654389916f65f552e445b0300b71b61b721a72e9a5983c +b42a578a7787b71f924e7def425d849c1c777156b1d4170a8ee7709a4a914e816935131afd9a0412c4cb952957b20828 +82fb30590e84b9e45db1ec475a39971cf554dc01bcc7050bc89265740725c02e2be5a972168c5170c86ae83e5b0ad2c0 +b14f8d8e1e93a84976289e0cf0dfa6f3a1809e98da16ee5c4932d0e1ed6bf8a07697fdd4dd86a3df84fb0003353cdcc0 +85d7a2f4bda31aa2cb208b771fe03291a4ebdaf6f1dc944c27775af5caec412584c1f45bc741fca2a6a85acb3f26ad7d +af02e56ce886ff2253bc0a68faad76f25ead84b2144e5364f3fb9b648f03a50ee9dc0b2c33ebacf7c61e9e43201ef9ef +87e025558c8a0b0abd06dfc350016847ea5ced7af2d135a5c9eec9324a4858c4b21510fb0992ec52a73447f24945058e +80fff0bafcd058118f5e7a4d4f1ae0912efeb281d2cbe4d34ba8945cc3dbe5d8baf47fb077343b90b8d895c90b297aca +b6edcf3a40e7b1c3c0148f47a263cd819e585a51ef31c2e35a29ce6f04c53e413f743034c0d998d9c00a08ba00166f31 +abb87ed86098c0c70a76e557262a494ff51a30fb193f1c1a32f8e35eafa34a43fcc07aa93a3b7a077d9e35afa07b1a3d +a280214cd3bb0fb7ecd2d8bcf518cbd9078417f2b91d2533ec2717563f090fb84f2a5fcfdbbeb2a2a1f8a71cc5aa5941 +a63083ca7238ea2b57d15a475963cf1d4f550d8cd76db290014a0461b90351f1f26a67d674c837b0b773b330c7c3d534 +a8fa39064cb585ece5263e2f42f430206476bf261bd50f18d2b694889bd79d04d56410664cecad62690e5c5a20b3f6ff +85ba52ce9d700a5dcf6c5b00559acbe599d671ce5512467ff4b6179d7fad550567ce2a9c126a50964e3096458ea87920 +b913501e1008f076e5eac6d883105174f88b248e1c9801e568fefaffa1558e4909364fc6d9512aa4d125cbd7cc895f05 +8eb33b5266c8f2ed4725a6ad147a322e44c9264cf261c933cbbe230a43d47fca0f29ec39756b20561dabafadd5796494 +850ebc8b661a04318c9db5a0515066e6454fa73865aa4908767a837857ecd717387f614acb614a88e075d4edc53a2f5a +a08d6b92d866270f29f4ce23a3f5d99b36b1e241a01271ede02817c8ec3f552a5c562db400766c07b104a331835c0c64 +8131804c89bb3e74e9718bfc4afa547c1005ff676bd4db9604335032b203390cfa54478d45c6c78d1fe31a436ed4be9f +9106d94f23cc1eacec8316f16d6f0a1cc160967c886f51981fdb9f3f12ee1182407d2bb24e5b873de58cb1a3ee915a6b +a13806bfc3eae7a7000c9d9f1bd25e10218d4e67f59ae798b145b098bca3edad2b1040e3fc1e6310e612fb8818f459ac +8c69fbca502046cb5f6db99900a47b34117aef3f4b241690cdb3b84ca2a2fc7833e149361995dc41fa78892525bce746 +852c473150c91912d58ecb05769222fa18312800c3f56605ad29eec9e2d8667b0b81c379048d3d29100ed2773bb1f3c5 +b1767f6074426a00e01095dbb1795beb4e4050c6411792cbad6537bc444c3165d1058bafd1487451f9c5ddd209e0ae7e +80c600a5fe99354ce59ff0f84c760923dc8ff66a30bf47dc0a086181785ceb01f9b951c4e66df800ea6d705e8bc47055 +b5cf19002fbc88a0764865b82afcb4d64a50196ea361e5c71dff7de084f4dcbbc34ec94a45cc9e0247bd51da565981aa +93e67a254ea8ce25e112d93cc927fadaa814152a2c4ec7d9a56eaa1ed47aec99b7e9916b02e64452cc724a6641729bbb +ace70b32491bda18eee4a4d041c3bc9effae9340fe7e6c2f5ad975ee0874c17f1a7da7c96bd85fccff9312c518fac6e9 +ab4cfa02065017dd7f1aadc66f2c92f78f0f11b8597c03a5d69d82cb2eaf95a4476a836ac102908f137662472c8d914b +a40b8cd8deb8ae503d20364d64cab7c2801b7728a9646ed19c65edea6a842756a2f636283494299584ad57f4bb12cd0b +8594e11d5fc2396bcd9dbf5509ce4816dbb2b7305168021c426171fb444d111da5a152d6835ad8034542277011c26c0e +8024de98c26b4c994a66628dc304bb737f4b6859c86ded552c5abb81fd4c6c2e19d5a30beed398a694b9b2fdea1dd06a +8843f5872f33f54df8d0e06166c1857d733995f67bc54abb8dfa94ad92407cf0179bc91b0a50bbb56cdc2b350d950329 +b8bab44c7dd53ef9edf497dcb228e2a41282c90f00ba052fc52d57e87b5c8ab132d227af1fcdff9a12713d1f980bcaae +982b4d7b29aff22d527fd82d2a52601d95549bfb000429bb20789ed45e5abf1f4b7416c7b7c4b79431eb3574b29be658 +8eb1f571b6a1878e11e8c1c757e0bc084bab5e82e897ca9be9b7f4b47b91679a8190bf0fc8f799d9b487da5442415857 +a6e74b588e5af935c8b243e888582ef7718f8714569dd4992920740227518305eb35fab674d21a5551cca44b3e511ef2 +a30fc2f3a4cb4f50566e82307de73cd7bd8fe2c1184e9293c136a9b9e926a018d57c6e4f308c95b9eb8299e94d90a2a1 +a50c5869ca5d2b40722c056a32f918d47e0b65ca9d7863ca7d2fb4a7b64fe523fe9365cf0573733ceaadebf20b48fff8 +83bbdd32c04d17581418cf360749c7a169b55d54f2427390defd9f751f100897b2d800ce6636c5bbc046c47508d60c8c +a82904bdf614de5d8deaff688c8a5e7ac5b3431687acbcda8fa53960b7c417a39c8b2e462d7af91ce6d79260f412db8e +a4362e31ff4b05d278b033cf5eebea20de01714ae16d4115d04c1da4754269873afc8171a6f56c5104bfd7b0db93c3e7 +b5b8daa63a3735581e74a021b684a1038cea77168fdb7fdf83c670c2cfabcfc3ab2fc7359069b5f9048188351aef26b5 +b48d723894b7782d96ac8433c48faca1bdfa5238019c451a7f47d958097cce3ae599b876cf274269236b9d6ff8b6d7ca +98ffff6a61a3a6205c7820a91ca2e7176fab5dba02bc194c4d14942ac421cb254183c705506ab279e4f8db066f941c6c +ae7db24731da2eaa6efc4f7fcba2ecc26940ddd68038dce43acf2cee15b72dc4ef42a7bfdd32946d1ed78786dd7696b3 +a656db14f1de9a7eb84f6301b4acb2fbf78bfe867f48a270e416c974ab92821eb4df1cb881b2d600cfed0034ac784641 +aa315f8ecba85a5535e9a49e558b15f39520fce5d4bf43131bfbf2e2c9dfccc829074f9083e8d49f405fb221d0bc4c3c +90bffba5d9ff40a62f6c8e9fc402d5b95f6077ed58d030c93e321b8081b77d6b8dac3f63a92a7ddc01585cf2c127d66c +abdd733a36e0e0f05a570d0504e73801bf9b5a25ff2c78786f8b805704997acb2e6069af342538c581144d53149fa6d3 +b4a723bb19e8c18a01bd449b1bb3440ddb2017f10bb153da27deb7a6a60e9bb37619d6d5435fbb1ba617687838e01dd0 +870016b4678bab3375516db0187a2108b2e840bae4d264b9f4f27dbbc7cc9cac1d7dc582d7a04d6fd1ed588238e5e513 +80d33d2e20e8fc170aa3cb4f69fffb72aeafb3b5bb4ea0bc79ab55da14142ca19b2d8b617a6b24d537366e3b49cb67c3 +a7ee76aec273aaae03b3b87015789289551969fb175c11557da3ab77e39ab49d24634726f92affae9f4d24003050d974 +8415ea4ab69d779ebd42d0fe0c6aef531d6a465a5739e429b1fcf433ec45aa8296c527e965a20f0ec9f340c9273ea3cf +8c7662520794e8b4405d0b33b5cac839784bc86a5868766c06cbc1fa306dbe334978177417b31baf90ce7b0052a29c56 +902b2abecc053a3dbdea9897ee21e74821f3a1b98b2d560a514a35799f4680322550fd3a728d4f6d64e1de98033c32b8 +a05e84ed9ecab8d508d670c39f2db61ad6e08d2795ec32a3c9d0d3737ef3801618f4fc2a95f90ec2f068606131e076c5 +8b9208ff4d5af0c2e3f53c9375da666773ac57197dfabb0d25b1c8d0588ba7f3c15ee9661bb001297f322ea2fbf6928b +a3c827741b34a03254d4451b5ab74a96f2b9f7fb069e2f5adaf54fd97cc7a4d516d378db5ca07da87d8566d6eef13726 +8509d8a3f4a0ed378e0a1e28ea02f6bf1d7f6c819c6c2f5297c7df54c895b848f841653e32ba2a2c22c2ff739571acb8 +a0ce988b7d3c40b4e496aa83a09e4b5472a2d98679622f32bea23e6d607bc7de1a5374fb162bce0549a67dad948519be +aa8a3dd12bd60e3d2e05f9c683cdcb8eab17fc59134815f8d197681b1bcf65108cba63ac5c58ee632b1e5ed6bba5d474 +8b955f1d894b3aefd883fb4b65f14cd37fc2b9db77db79273f1700bef9973bf3fd123897ea2b7989f50003733f8f7f21 +ac79c00ddac47f5daf8d9418d798d8af89fc6f1682e7e451f71ea3a405b0d36af35388dd2a332af790bc83ca7b819328 +a0d44dd2a4438b809522b130d0938c3fe7c5c46379365dbd1810a170a9aa5818e1c783470dd5d0b6d4ac7edbb7330910 +a30b69e39ad43dd540a43c521f05b51b5f1b9c4eed54b8162374ae11eac25da4f5756e7b70ce9f3c92c2eeceee7431ed +ac43220b762c299c7951222ea19761ab938bf38e4972deef58ed84f4f9c68c230647cf7506d7cbfc08562fcca55f0485 +b28233b46a8fb424cfa386a845a3b5399d8489ceb83c8f3e05c22c934798d639c93718b7b68ab3ce24c5358339e41cbb +ac30d50ee8ce59a10d4b37a3a35e62cdb2273e5e52232e202ca7d7b8d09d28958ee667fae41a7bb6cdc6fe8f6e6c9c85 +b199842d9141ad169f35cc7ff782b274cbaa645fdb727761e0a89edbf0d781a15f8218b4bf4eead326f2903dd88a9cc1 +85e018c7ddcad34bb8285a737c578bf741ccd547e68c734bdb3808380e12c5d4ef60fc896b497a87d443ff9abd063b38 +8c856e6ba4a815bdb891e1276f93545b7072f6cb1a9aa6aa5cf240976f29f4dee01878638500a6bf1daf677b96b54343 +b8a47555fa8710534150e1a3f13eab33666017be6b41005397afa647ea49708565f2b86b77ad4964d140d9ced6b4d585 +8cd1f1db1b2f4c85a3f46211599caf512d5439e2d8e184663d7d50166fd3008f0e9253272f898d81007988435f715881 +b1f34b14612c973a3eceb716dc102b82ab18afef9de7630172c2780776679a7706a4874e1df3eaadf541fb009731807f +b25464af9cff883b55be2ff8daf610052c02df9a5e147a2cf4df6ce63edcdee6dc535c533590084cc177da85c5dc0baa +91c3c4b658b42d8d3448ae1415d4541d02379a40dc51e36a59bd6e7b9ba3ea51533f480c7c6e8405250ee9b96a466c29 +86dc027b95deb74c36a58a1333a03e63cb5ae22d3b29d114cfd2271badb05268c9d0c819a977f5e0c6014b00c1512e3a +ae0e6ff58eb5fa35da5107ebeacf222ab8f52a22bb1e13504247c1dfa65320f40d97b0e6b201cb6613476687cb2f0681 +8f13415d960b9d7a1d93ef28afc2223e926639b63bdefce0f85e945dfc81670a55df288893a0d8b3abe13c5708f82f91 +956f67ca49ad27c1e3a68c1faad5e7baf0160c459094bf6b7baf36b112de935fdfd79fa4a9ea87ea8de0ac07272969f4 +835e45e4a67df9fb51b645d37840b3a15c171d571a10b03a406dd69d3c2f22df3aa9c5cbe1e73f8d767ce01c4914ea9a +919b938e56d4b32e2667469d0bdccb95d9dda3341aa907683ee70a14bbbe623035014511c261f4f59b318b610ac90aa3 +96b48182121ccd9d689bf1dfdc228175564cd68dc904a99c808a7f0053a6f636c9d953e12198bdf2ea49ea92772f2e18 +ac5e5a941d567fa38fdbcfa8cf7f85bb304e3401c52d88752bcd516d1fa9bac4572534ea2205e38423c1df065990790f +ac0bd594fb85a8d4fc26d6df0fa81f11919401f1ecf9168b891ec7f061a2d9368af99f7fd8d9b43b2ce361e7b8482159 +83d92c69ca540d298fe80d8162a1c7af3fa9b49dfb69e85c1d136a3ec39fe419c9fa78e0bb6d96878771fbd37fe92e40 +b35443ae8aa66c763c2db9273f908552fe458e96696b90e41dd509c17a5c04ee178e3490d9c6ba2dc0b8f793c433c134 +923b2d25aa45b2e580ffd94cbb37dc8110f340f0f011217ee1bd81afb0714c0b1d5fb4db86006cdd2457563276f59c59 +96c9125d38fca1a61ac21257b696f8ac3dae78def50285e44d90ea293d591d1c58f703540a7e4e99e070afe4646bbe15 +b57946b2332077fbcdcb406b811779aefd54473b5559a163cd65cb8310679b7e2028aa55c12a1401fdcfcac0e6fae29a +845daedc5cf972883835d7e13c937b63753c2200324a3b8082a6c4abb4be06c5f7c629d4abe4bfaf1d80a1f073eb6ce6 +91a55dfd0efefcd03dc6dacc64ec93b8d296cb83c0ee72400a36f27246e7f2a60e73b7b70ba65819e9cfb73edb7bd297 +8874606b93266455fe8fdd25df9f8d2994e927460af06f2e97dd4d2d90db1e6b06d441b72c2e76504d753badca87fb37 +8ee99e6d231274ff9252c0f4e84549da173041299ad1230929c3e3d32399731c4f20a502b4a307642cac9306ccd49d3c +8836497714a525118e20849d6933bb8535fb6f72b96337d49e3133d936999c90a398a740f42e772353b5f1c63581df6d +a6916945e10628f7497a6cdc5e2de113d25f7ade3e41e74d3de48ccd4fce9f2fa9ab69645275002e6f49399b798c40af +9597706983107eb23883e0812e1a2c58af7f3499d50c6e29b455946cb9812fde1aa323d9ed30d1c0ffd455abe32303cd +a24ee89f7f515cc33bdbdb822e7d5c1877d337f3b2162303cfc2dae028011c3a267c5cb4194afa63a4856a6e1c213448 +8cd25315e4318801c2776824ae6e7d543cb85ed3bc2498ba5752df2e8142b37653cf9e60104d674be3aeb0a66912e97a +b5085ecbe793180b40dbeb879f4c976eaaccaca3a5246807dced5890e0ed24d35f3f86955e2460e14fb44ff5081c07ba +960188cc0b4f908633a6840963a6fa2205fc42c511c6c309685234911c5304ef4c304e3ae9c9c69daa2fb6a73560c256 +a32d0a70bf15d569b4cda5aebe3e41e03c28bf99cdd34ffa6c5d58a097f322772acca904b3a47addb6c7492a7126ebac +977f72d06ad72d4aa4765e0f1f9f4a3231d9f030501f320fe7714cc5d329d08112789fa918c60dd7fdb5837d56bb7fc6 +99fa038bb0470d45852bb871620d8d88520adb701712fcb1f278fed2882722b9e729e6cdce44c82caafad95e37d0e6f7 +b855e8f4fc7634ada07e83b6c719a1e37acb06394bc8c7dcab7747a8c54e5df3943915f021364bd019fdea103864e55f +88bc2cd7458532e98c596ef59ea2cf640d7cc31b4c33cef9ed065c078d1d4eb49677a67de8e6229cc17ea48bace8ee5a +aaa78a3feaa836d944d987d813f9b9741afb076e6aca1ffa42682ab06d46d66e0c07b8f40b9dbd63e75e81efa1ef7b08 +b7b080420cc4d808723b98b2a5b7b59c81e624ab568ecdfdeb8bf3aa151a581b6f56e983ef1b6f909661e25db40b0c69 +abee85c462ac9a2c58e54f06c91b3e5cd8c5f9ab5b5deb602b53763c54826ed6deb0d6db315a8d7ad88733407e8d35e2 +994d075c1527407547590df53e9d72dd31f037c763848d1662eebd4cefec93a24328c986802efa80e038cb760a5300f5 +ab8777640116dfb6678e8c7d5b36d01265dfb16321abbfc277da71556a34bb3be04bc4ae90124ed9c55386d2bfb3bda0 +967e3a828bc59409144463bcf883a3a276b5f24bf3cbfdd7a42343348cba91e00b46ac285835a9b91eef171202974204 +875a9f0c4ffe5bb1d8da5e3c8e41d0397aa6248422a628bd60bfae536a651417d4e8a7d2fb98e13f2dad3680f7bd86d3 +acaa330c3e8f95d46b1880126572b238dbb6d04484d2cd4f257ab9642d8c9fc7b212188b9c7ac9e0fd135c520d46b1bf +aceb762edbb0f0c43dfcdb01ea7a1ac5918ca3882b1e7ebc4373521742f1ed5250d8966b498c00b2b0f4d13212e6dd0b +81d072b4ad258b3646f52f399bced97c613b22e7ad76373453d80b1650c0ca87edb291a041f8253b649b6e5429bb4cff +980a47d27416ac39c7c3a0ebe50c492f8c776ea1de44d5159ac7d889b6d554357f0a77f0e5d9d0ff41aae4369eba1fc2 +8b4dfd5ef5573db1476d5e43aacfb5941e45d6297794508f29c454fe50ea622e6f068b28b3debe8635cf6036007de2e3 +a60831559d6305839515b68f8c3bc7abbd8212cc4083502e19dd682d56ca37c9780fc3ce4ec2eae81ab23b221452dc57 +951f6b2c1848ced9e8a2339c65918e00d3d22d3e59a0a660b1eca667d18f8430d737884e9805865ef3ed0fe1638a22d9 +b02e38fe790b492aa5e89257c4986c9033a8b67010fa2add9787de857d53759170fdd67715ca658220b4e14b0ca48124 +a51007e4346060746e6b0e4797fc08ef17f04a34fe24f307f6b6817edbb8ce2b176f40771d4ae8a60d6152cbebe62653 +a510005b05c0b305075b27b243c9d64bcdce85146b6ed0e75a3178b5ff9608213f08c8c9246f2ca6035a0c3e31619860 +aaff4ef27a7a23be3419d22197e13676d6e3810ceb06a9e920d38125745dc68a930f1741c9c2d9d5c875968e30f34ab5 +864522a9af9857de9814e61383bebad1ba9a881696925a0ea6bfc6eff520d42c506bbe5685a9946ed710e889765be4a0 +b63258c080d13f3b7d5b9f3ca9929f8982a6960bdb1b0f8676f4dca823971601672f15e653917bf5d3746bb220504913 +b51ce0cb10869121ae310c7159ee1f3e3a9f8ad498827f72c3d56864808c1f21fa2881788f19ece884d3f705cd7bd0c5 +95d9cecfc018c6ed510e441cf84c712d9909c778c16734706c93222257f64dcd2a9f1bd0b400ca271e22c9c487014274 +8beff4d7d0140b86380ff4842a9bda94c2d2be638e20ac68a4912cb47dbe01a261857536375208040c0554929ced1ddc +891ff49258749e2b57c1e9b8e04b12c77d79c3308b1fb615a081f2aacdfb4b39e32d53e069ed136fdbd43c53b87418fa +9625cad224e163d387738825982d1e40eeff35fe816d10d7541d15fdc4d3eee48009090f3faef4024b249205b0b28f72 +8f3947433d9bd01aa335895484b540a9025a19481a1c40b4f72dd676bfcf332713714fd4010bde936eaf9470fd239ed0 +a00ec2d67789a7054b53f0e858a8a232706ccc29a9f3e389df7455f1a51a2e75801fd78469a13dbc25d28399ae4c6182 +a3f65884506d4a62b8775a0ea0e3d78f5f46bc07910a93cd604022154eabdf1d73591e304d61edc869e91462951975e1 +a14eef4fd5dfac311713f0faa9a60415e3d30b95a4590cbf95f2033dffb4d16c02e7ceff3dcd42148a4e3bc49cce2dd4 +8afa11c0eef3c540e1e3460bc759bb2b6ea90743623f88e62950c94e370fe4fd01c22b6729beba4dcd4d581198d9358f +afb05548a69f0845ffcc5f5dc63e3cdb93cd270f5655173b9a950394b0583663f2b7164ba6df8d60c2e775c1d9f120af +97f179e01a947a906e1cbeafa083960bc9f1bade45742a3afee488dfb6011c1c6e2db09a355d77f5228a42ccaa7bdf8e +8447fca4d35f74b3efcbd96774f41874ca376bf85b79b6e66c92fa3f14bdd6e743a051f12a7fbfd87f319d1c6a5ce217 +a57ca39c23617cd2cf32ff93b02161bd7baf52c4effb4679d9d5166406e103bc8f3c6b5209e17c37dbb02deb8bc72ddd +9667c7300ff80f0140be002b0e36caab07aaee7cce72679197c64d355e20d96196acaf54e06e1382167d081fe6f739c1 +828126bb0559ce748809b622677267ca896fa2ee76360fd2c02990e6477e06a667241379ca7e65d61a5b64b96d7867de +8b8835dea6ba8cf61c91f01a4b3d2f8150b687a4ee09b45f2e5fc8f80f208ae5d142d8e3a18153f0722b90214e60c5a7 +a98e8ff02049b4da386e3ee93db23bbb13dfeb72f1cfde72587c7e6d962780b7671c63e8ac3fbaeb1a6605e8d79e2f29 +87a4892a0026d7e39ef3af632172b88337cb03669dea564bcdb70653b52d744730ebb5d642e20cb627acc9dbb547a26b +877352a22fc8052878a57effc159dac4d75fe08c84d3d5324c0bab6d564cdf868f33ceee515eee747e5856b62cfa0cc7 +8b801ba8e2ff019ee62f64b8cb8a5f601fc35423eb0f9494b401050103e1307dc584e4e4b21249cd2c686e32475e96c3 +a9e7338d6d4d9bfec91b2af28a8ed13b09415f57a3a00e5e777c93d768fdb3f8e4456ae48a2c6626b264226e911a0e28 +99c05fedf40ac4726ed585d7c1544c6e79619a0d3fb6bda75a08c7f3c0008e8d5e19ed4da48de3216135f34a15eba17c +a61cce8a1a8b13a4a650fdbec0eeea8297c352a8238fb7cac95a0df18ed16ee02a3daa2de108fa122aca733bd8ad7855 +b97f37da9005b440b4cb05870dd881bf8491fe735844f2d5c8281818583b38e02286e653d9f2e7fa5e74c3c3eb616540 +a72164a8554da8e103f692ac5ebb4aece55d5194302b9f74b6f2a05335b6e39beede0bf7bf8c5bfd4d324a784c5fb08c +b87e8221c5341cd9cc8bb99c10fe730bc105550f25ed4b96c0d45e6142193a1b2e72f1b3857373a659b8c09be17b3d91 +a41fb1f327ef91dcb7ac0787918376584890dd9a9675c297c45796e32d6e5985b12f9b80be47fc3a8596c245f419d395 +90dafa3592bdbb3465c92e2a54c2531822ba0459d45d3e7a7092fa6b823f55af28357cb51896d4ec2d66029c82f08e26 +a0a9adc872ebc396557f484f1dd21954d4f4a21c4aa5eec543f5fa386fe590839735c01f236574f7ff95407cd12de103 +b8c5c940d58be7538acf8672852b5da3af34f82405ef2ce8e4c923f1362f97fc50921568d0fd2fe846edfb0823e62979 +85aaf06a8b2d0dac89dafd00c28533f35dbd074978c2aaa5bef75db44a7b12aeb222e724f395513b9a535809a275e30b +81f3cbe82fbc7028c26a6c1808c604c63ba023a30c9f78a4c581340008dbda5ec07497ee849a2183fcd9124f7936af32 +a11ac738de75fd60f15a34209d3825d5e23385796a4c7fc5931822f3f380af977dd0f7b59fbd58eed7777a071e21b680 +85a279c493de03db6fa6c3e3c1b1b29adc9a8c4effc12400ae1128da8421954fa8b75ad19e5388fe4543b76fb0812813 +83a217b395d59ab20db6c4adb1e9713fc9267f5f31a6c936042fe051ce8b541f579442f3dcf0fa16b9e6de9fd3518191 +83a0b86e7d4ed8f9ccdc6dfc8ff1484509a6378fa6f09ed908e6ab9d1073f03011dc497e14304e4e3d181b57de06a5ab +a63ad69c9d25704ce1cc8e74f67818e5ed985f8f851afa8412248b2df5f833f83b95b27180e9e7273833ed0d07113d3b +99b1bc2021e63b561fe44ddd0af81fcc8627a91bfeecbbc989b642bc859abc0c8d636399701aad7bbaf6a385d5f27d61 +b53434adb66f4a807a6ad917c6e856321753e559b1add70824e5c1e88191bf6993fccb9b8b911fc0f473fb11743acacd +97ed3b9e6fb99bf5f945d4a41f198161294866aa23f2327818cdd55cb5dc4c1a8eff29dd8b8d04902d6cd43a71835c82 +b1e808260e368a18d9d10bdea5d60223ba1713b948c782285a27a99ae50cc5fc2c53d407de07155ecc16fb8a36d744a0 +a3eb4665f18f71833fec43802730e56b3ee5a357ea30a888ad482725b169d6f1f6ade6e208ee081b2e2633079b82ba7d +ab8beb2c8353fc9f571c18fdd02bdb977fc883313469e1277b0372fbbb33b80dcff354ca41de436d98d2ed710faa467e +aa9071cfa971e4a335a91ad634c98f2be51544cb21f040f2471d01bb97e1df2277ae1646e1ea8f55b7ba9f5c8c599b39 +80b7dbfdcaf40f0678012acc634eba44ea51181475180d9deb2050dc4f2de395289edd0223018c81057ec79b04b04c49 +89623d7f6cb17aa877af14de842c2d4ab7fd576d61ddd7518b5878620a01ded40b6010de0da3cdf31d837eecf30e9847 +a773bb024ae74dd24761f266d4fb27d6fd366a8634febe8235376b1ae9065c2fe12c769f1d0407867dfbe9f5272c352f +8455a561c3aaa6ba64c881a5e13921c592b3a02e968f4fb24a2243c36202795d0366d9cc1a24e916f84d6e158b7aeac7 +81d8bfc4b283cf702a40b87a2b96b275bdbf0def17e67d04842598610b67ea08c804d400c3e69fa09ea001eaf345b276 +b8f8f82cb11fea1c99467013d7e167ff03deb0c65a677fab76ded58826d1ba29aa7cf9fcd7763615735ea3ad38e28719 +89a6a04baf9cccc1db55179e1650b1a195dd91fb0aebc197a25143f0f393524d2589975e3fbfc2547126f0bced7fd6f2 +b81b2162df045390f04df07cbd0962e6b6ca94275a63edded58001a2f28b2ae2af2c7a6cba4ecd753869684e77e7e799 +a3757f722776e50de45c62d9c4a2ee0f5655a512344c4cbec542d8045332806568dd626a719ef21a4eb06792ca70f204 +8c5590df96ec22179a4e8786de41beb44f987a1dcc508eb341eecbc0b39236fdfad47f108f852e87179ccf4e10091e59 +87502f026ed4e10167419130b88c3737635c5b9074c364e1dd247cef5ef0fc064b4ae99b187e33301e438bbd2fe7d032 +af925a2165e980ced620ff12289129fe17670a90ae0f4db9d4b39bd887ccb1f5d2514ac9ecf910f6390a8fc66bd5be17 +857fca899828cf5c65d26e3e8a6e658542782fc72762b3b9c73514919f83259e0f849a9d4838b40dc905fe43024d0d23 +87ffebdbfb69a9e1007ebac4ffcb4090ff13705967b73937063719aa97908986effcb7262fdadc1ae0f95c3690e3245d +a9ff6c347ac6f4c6ab993b748802e96982eaf489dc69032269568412fc9a79e7c2850dfc991b28211b3522ee4454344b +a65b3159df4ec48bebb67cb3663cd744027ad98d970d620e05bf6c48f230fa45bf17527fe726fdf705419bb7a1bb913e +84b97b1e6408b6791831997b03cd91f027e7660fd492a93d95daafe61f02427371c0e237c75706412f442991dfdff989 +ab761c26527439b209af0ae6afccd9340bbed5fbe098734c3145b76c5d2cd7115d9227b2eb523882b7317fbb09180498 +a0479a8da06d7a69c0b0fee60df4e691c19c551f5e7da286dab430bfbcabf31726508e20d26ea48c53365a7f00a3ad34 +a732dfc9baa0f4f40b5756d2e8d8937742999623477458e0bc81431a7b633eefc6f53b3b7939fe0a020018549c954054 +901502436a1169ba51dc479a5abe7c8d84e0943b16bc3c6a627b49b92cd46263c0005bc324c67509edd693f28e612af1 +b627aee83474e7f84d1bab9b7f6b605e33b26297ac6bbf52d110d38ba10749032bd551641e73a383a303882367af429b +95108866745760baef4a46ef56f82da6de7e81c58b10126ebd2ba2cd13d339f91303bf2fb4dd104a6956aa3b13739503 +899ed2ade37236cec90056f3569bc50f984f2247792defafcceb49ad0ca5f6f8a2f06573705300e07f0de0c759289ff5 +a9f5eee196d608efe4bcef9bf71c646d27feb615e21252cf839a44a49fd89da8d26a758419e0085a05b1d59600e2dc42 +b36c6f68fed6e6c85f1f4a162485f24817f2843ec5cbee45a1ebfa367d44892e464949c6669f7972dc7167af08d55d25 +aaaede243a9a1b6162afbc8f571a52671a5a4519b4062e3f26777664e245ba873ed13b0492c5dbf0258c788c397a0e9e +972b4fb39c31cbe127bf9a32a5cc10d621ebdd9411df5e5da3d457f03b2ab2cd1f6372d8284a4a9400f0b06ecdbfd38e +8f6ca1e110e959a4b1d9a5ce5f212893cec21db40d64d5ac4d524f352d72198f923416a850bf845bc5a22a79c0ea2619 +a0f3c93b22134f66f04b2553a53b738644d1665ceb196b8494b315a4c28236fb492017e4a0de4224827c78e42f9908b7 +807fb5ee74f6c8735b0b5ca07e28506214fe4047dbeb00045d7c24f7849e98706aea79771241224939cb749cf1366c7d +915eb1ff034224c0b645442cdb7d669303fdc00ca464f91aaf0b6fde0b220a3a74ff0cb043c26c9f3a5667b3fdaa9420 +8fda6cef56ed33fefffa9e6ac8e6f76b1af379f89761945c63dd448801f7bb8ca970504a7105fac2f74f652ccff32327 +87380cffdcffb1d0820fa36b63cc081e72187f86d487315177d4d04da4533eb19a0e2ff6115ceab528887819c44a5164 +8cd89e03411a18e7f16f968b89fb500c36d47d229f6487b99e62403a980058db5925ce249206743333538adfad168330 +974451b1df33522ce7056de9f03e10c70bf302c44b0741a59df3d6877d53d61a7394dcee1dd46e013d7cb9d73419c092 +98c35ddf645940260c490f384a49496a7352bb8e3f686feed815b1d38f59ded17b1ad6e84a209e773ed08f7b8ff1e4c2 +963f386cf944bb9b2ddebb97171b64253ea0a2894ac40049bdd86cda392292315f3a3d490ca5d9628c890cfb669f0acb +8d507712152babd6d142ee682638da8495a6f3838136088df9424ef50d5ec28d815a198c9a4963610b22e49b4cdf95e9 +83d4bc6b0be87c8a4f1e9c53f257719de0c73d85b490a41f7420e777311640937320557ff2f1d9bafd1daaa54f932356 +82f5381c965b7a0718441131c4d13999f4cdce637698989a17ed97c8ea2e5bdb5d07719c5f7be8688edb081b23ede0f4 +a6ebecab0b72a49dfd01d69fa37a7f74d34fb1d4fef0aa10e3d6fceb9eccd671225c230af89f6eb514250e41a5f91f52 +846d185bdad6e11e604df7f753b7a08a28b643674221f0e750ebdb6b86ec584a29c869e131bca868972a507e61403f6a +85a98332292acb744bd1c0fd6fdcf1f889a78a2c9624d79413ffa194cc8dfa7821a4b60cde8081d4b5f71f51168dd67f +8f7d97c3b4597880d73200d074eb813d95432306e82dafc70b580b8e08cb8098b70f2d07b4b3ac6a4d77e92d57035031 +8185439c8751e595825d7053518cbe121f191846a38d4dbcb558c3f9d7a3104f3153401adaaaf27843bbe2edb504bfe3 +b3c00d8ece1518fca6b1215a139b0a0e26d9cba1b3a424f7ee59f30ce800a5db967279ed60958dd1f3ee69cf4dd1b204 +a2e6cb6978e883f9719c3c0d44cfe8de0cc6f644b98f98858433bea8bbe7b612c8aca5952fccce4f195f9d54f9722dc2 +99663087e3d5000abbec0fbda4e7342ec38846cc6a1505191fb3f1a337cb369455b7f8531a6eb8b0f7b2c4baf83cbe2b +ab0836c6377a4dbc7ca6a4d6cf021d4cd60013877314dd05f351706b128d4af6337711ed3443cb6ca976f40d74070a9a +87abfd5126152fd3bac3c56230579b489436755ea89e0566aa349490b36a5d7b85028e9fb0710907042bcde6a6f5d7e3 +974ba1033f75f60e0cf7c718a57ae1da3721cf9d0fb925714c46f027632bdd84cd9e6de4cf4d00bc55465b1c5ebb7384 +a607b49d73689ac64f25cec71221d30d53e781e1100d19a2114a21da6507a60166166369d860bd314acb226596525670 +a7c2b0b915d7beba94954f2aa7dd08ec075813661e2a3ecca5d28a0733e59583247fed9528eb28aba55b972cdbaf06eb +b8b3123e44128cc8efbe3270f2f94e50ca214a4294c71c3b851f8cbb70cb67fe9536cf07d04bf7fe380e5e3a29dd3c15 +a59a07e343b62ad6445a0859a32b58c21a593f9ddbfe52049650f59628c93715aa1f4e1f45b109321756d0eeec8a5429 +94f51f8a4ed18a6030d0aaa8899056744bd0e9dc9ac68f62b00355cddab11da5da16798db75f0bfbce0e5bdfe750c0b6 +97460a97ca1e1fa5ce243b81425edc0ec19b7448e93f0b55bc9785eedeeafe194a3c8b33a61a5c72990edf375f122777 +8fa859a089bc17d698a7ee381f37ce9beadf4e5b44fce5f6f29762bc04f96faff5d58c48c73631290325f05e9a1ecf49 +abdf38f3b20fc95eff31de5aa9ef1031abfa48f1305ee57e4d507594570401503476d3bcc493838fc24d6967a3082c7f +b8914bfb82815abb86da35c64d39ab838581bc0bf08967192697d9663877825f2b9d6fbdcf9b410463482b3731361aef +a8187f9d22b193a5f578999954d6ec9aa9b32338ccadb8a3e1ce5bad5ea361d69016e1cdfac44e9d6c54e49dd88561b9 +aac262cb7cba7fd62c14daa7b39677cabc1ef0947dd06dd89cac8570006a200f90d5f0353e84f5ff03179e3bebe14231 +a630ef5ece9733b8c46c0a2df14a0f37647a85e69c63148e79ffdcc145707053f9f9d305c3f1cf3c7915cb46d33abd07 +b102c237cb2e254588b6d53350dfda6901bd99493a3fbddb4121d45e0b475cf2663a40d7b9a75325eda83e4ba1e68cb3 +86a930dd1ddcc16d1dfa00aa292cb6c2607d42c367e470aa920964b7c17ab6232a7108d1c2c11fc40fb7496547d0bbf8 +a832fdc4500683e72a96cce61e62ac9ee812c37fe03527ad4cf893915ca1962cee80e72d4f82b20c8fc0b764376635a1 +88ad985f448dabb04f8808efd90f273f11f5e6d0468b5489a1a6a3d77de342992a73eb842d419034968d733f101ff683 +98a8538145f0d86f7fbf9a81c9140f6095c5bdd8960b1c6f3a1716428cd9cca1bf8322e6d0af24e6169abcf7df2b0ff6 +9048c6eba5e062519011e177e955a200b2c00b3a0b8615bdecdebc217559d41058d3315f6d05617be531ef0f6aef0e51 +833bf225ab6fc68cdcacf1ec1b50f9d05f5410e6cdcd8d56a3081dc2be8a8d07b81534d1ec93a25c2e270313dfb99e3b +a84bcd24c3da5e537e64a811b93c91bfc84d7729b9ead7f79078989a6eb76717d620c1fad17466a0519208651e92f5ff +b7cdd0a3fbd79aed93e1b5a44ca44a94e7af5ed911e4492f332e3a5ed146c7286bde01b52276a2fcc02780d2109874dd +8a19a09854e627cb95750d83c20c67442b66b35896a476358f993ba9ac114d32c59c1b3d0b8787ee3224cf3888b56c64 +a9abd5afb8659ee52ada8fa5d57e7dd355f0a7350276f6160bec5fbf70d5f99234dd179eb221c913e22a49ec6d267846 +8c13c4274c0d30d184e73eaf812200094bbbd57293780bdadbceb262e34dee5b453991e7f37c7333a654fc71c69d6445 +a4320d73296ff8176ce0127ca1921c450e2a9c06eff936681ebaffb5a0b05b17fded24e548454de89aca2dcf6d7a9de4 +b2b8b3e15c1f645f07783e5628aba614e60157889db41d8161d977606788842b67f83f361eae91815dc0abd84e09abd5 +ad26c3aa35ddfddc15719b8bb6c264aaec7065e88ac29ba820eb61f220fef451609a7bb037f3722d022e6c86e4f1dc88 +b8615bf43e13ae5d7b8dd903ce37190800cd490f441c09b22aa29d7a29ed2c0417b7a08ead417868f1de2589deaadd80 +8d3425e1482cd1e76750a76239d33c06b3554c3c3c87c15cb7ab58b1cee86a4c5c4178b44e23f36928365a1b484bde02 +806893a62e38c941a7dd6f249c83af16596f69877cc737d8f73f6b8cd93cbc01177a7a276b2b8c6b0e5f2ad864db5994 +86618f17fa4b0d65496b661bbb5ba3bc3a87129d30a4b7d4f515b904f4206ca5253a41f49fd52095861e5e065ec54f21 +9551915da1304051e55717f4c31db761dcdcf3a1366c89a4af800a9e99aca93a357bf928307f098e62b44a02cb689a46 +8f79c4ec0ec1146cb2a523b52fe33def90d7b5652a0cb9c2d1c8808a32293e00aec6969f5b1538e3a94cd1efa3937f86 +a0c03e329a707300081780f1e310671315b4c6a4cedcb29697aedfabb07a9d5df83f27b20e9c44cf6b16e39d9ded5b98 +86a7cfa7c8e7ce2c01dd0baec2139e97e8e090ad4e7b5f51518f83d564765003c65968f85481bbb97cb18f005ccc7d9f +a33811770c6dfda3f7f74e6ad0107a187fe622d61b444bbd84fd7ef6e03302e693b093df76f6ab39bb4e02afd84a575a +85480f5c10d4162a8e6702b5e04f801874d572a62a130be94b0c02b58c3c59bdcd48cd05f0a1c2839f88f06b6e3cd337 +8e181011564b17f7d787fe0e7f3c87f6b62da9083c54c74fd6c357a1f464c123c1d3d8ade3cf72475000b464b14e2be3 +8ee178937294b8c991337e0621ab37e9ffa4ca2bdb3284065c5e9c08aad6785d50cf156270ff9daf9a9127289710f55b +8bd1e8e2d37379d4b172f1aec96f2e41a6e1393158d7a3dbd9a95c8dd4f8e0b05336a42efc11a732e5f22b47fc5c271d +8f3da353cd487c13136a85677de8cedf306faae0edec733cf4f0046f82fa4639db4745b0095ff33a9766aba50de0cbcf +8d187c1e97638df0e4792b78e8c23967dac43d98ea268ca4aabea4e0fa06cb93183fd92d4c9df74118d7cc27bf54415e +a4c992f08c2f8bac0b74b3702fb0c75c9838d2ce90b28812019553d47613c14d8ce514d15443159d700b218c5a312c49 +a6fd1874034a34c3ea962a316c018d9493d2b3719bb0ec4edbc7c56b240802b2228ab49bee6f04c8a3e9f6f24a48c1c2 +b2efed8e799f8a15999020900dc2c58ece5a3641c90811b86a5198e593d7318b9d53b167818ccdfbe7df2414c9c34011 +995ff7de6181ddf95e3ead746089c6148da3508e4e7a2323c81785718b754d356789b902e7e78e2edc6b0cbd4ff22c78 +944073d24750a9068cbd020b834afc72d2dde87efac04482b3287b40678ad07588519a4176b10f2172a2c463d063a5cd +99db4b1bb76475a6fd75289986ef40367960279524378cc917525fb6ba02a145a218c1e9caeb99332332ab486a125ac0 +89fce4ecd420f8e477af4353b16faabb39e063f3f3c98fde2858b1f2d1ef6eed46f0975a7c08f233b97899bf60ccd60a +8c09a4f07a02b80654798bc63aada39fd638d3e3c4236ccd8a5ca280350c31e4a89e5f4c9aafb34116e71da18c1226b8 +85325cfa7ded346cc51a2894257eab56e7488dbff504f10f99f4cd2b630d913003761a50f175ed167e8073f1b6b63fb0 +b678b4fbec09a8cc794dcbca185f133578f29e354e99c05f6d07ac323be20aecb11f781d12898168e86f2e0f09aca15e +a249cfcbca4d9ba0a13b5f6aac72bf9b899adf582f9746bb2ad043742b28915607467eb794fca3704278f9136f7642be +9438e036c836a990c5e17af3d78367a75b23c37f807228362b4d13e3ddcb9e431348a7b552d09d11a2e9680704a4514f +925ab70450af28c21a488bfb5d38ac994f784cf249d7fd9ad251bb7fd897a23e23d2528308c03415074d43330dc37ef4 +a290563904d5a8c0058fc8330120365bdd2ba1fdbaef7a14bc65d4961bb4217acfaed11ab82669e359531f8bf589b8db +a7e07a7801b871fc9b981a71e195a3b4ba6b6313bc132b04796a125157e78fe5c11a3a46cf731a255ac2d78a4ae78cd0 +b26cd2501ee72718b0eebab6fb24d955a71f363f36e0f6dff0ab1d2d7836dab88474c0cef43a2cc32701fca7e82f7df3 +a1dc3b6c968f3de00f11275092290afab65b2200afbcfa8ddc70e751fa19dbbc300445d6d479a81bda3880729007e496 +a9bc213e28b630889476a095947d323b9ac6461dea726f2dc9084473ae8e196d66fb792a21905ad4ec52a6d757863e7d +b25d178df8c2df8051e7c888e9fa677fde5922e602a95e966db9e4a3d6b23ce043d7dc48a5b375c6b7c78e966893e8c3 +a1c8d88d72303692eaa7adf68ea41de4febec40cc14ae551bb4012afd786d7b6444a3196b5d9d5040655a3366d96b7cd +b22bd44f9235a47118a9bbe2ba5a2ba9ec62476061be2e8e57806c1a17a02f9a51403e849e2e589520b759abd0117683 +b8add766050c0d69fe81d8d9ea73e1ed05f0135d093ff01debd7247e42dbb86ad950aceb3b50b9af6cdc14ab443b238f +af2cf95f30ef478f018cf81d70d47d742120b09193d8bb77f0d41a5d2e1a80bfb467793d9e2471b4e0ad0cb2c3b42271 +8af5ef2107ad284e246bb56e20fef2a255954f72de791cbdfd3be09f825298d8466064f3c98a50496c7277af32b5c0bc +85dc19558572844c2849e729395a0c125096476388bd1b14fa7f54a7c38008fc93e578da3aac6a52ff1504d6ca82db05 +ae8c9b43c49572e2e166d704caf5b4b621a3b47827bb2a3bcd71cdc599bba90396fd9a405261b13e831bb5d44c0827d7 +a7ba7efede25f02e88f6f4cbf70643e76784a03d97e0fbd5d9437c2485283ad7ca3abb638a5f826cd9f6193e5dec0b6c +94a9d122f2f06ef709fd8016fd4b712d88052245a65a301f5f177ce22992f74ad05552b1f1af4e70d1eac62cef309752 +82d999b3e7cf563833b8bc028ff63a6b26eb357dfdb3fd5f10e33a1f80a9b2cfa7814d871b32a7ebfbaa09e753e37c02 +aec6edcde234df502a3268dd2c26f4a36a2e0db730afa83173f9c78fcb2b2f75510a02b80194327b792811caefda2725 +94c0bfa66c9f91d462e9194144fdd12d96f9bbe745737e73bab8130607ee6ea9d740e2cfcbbd00a195746edb6369ee61 +ab7573dab8c9d46d339e3f491cb2826cabe8b49f85f1ede78d845fc3995537d1b4ab85140b7d0238d9c24daf0e5e2a7e +87e8b16832843251fe952dadfd01d41890ed4bb4b8fa0254550d92c8cced44368225eca83a6c3ad47a7f81ff8a80c984 +9189d2d9a7c64791b19c0773ad4f0564ce6bea94aa275a917f78ad987f150fdb3e5e26e7fef9982ac184897ecc04683f +b3661bf19e2da41415396ae4dd051a9272e8a2580b06f1a1118f57b901fa237616a9f8075af1129af4eabfefedbe2f1c +af43c86661fb15daf5d910a4e06837225e100fb5680bd3e4b10f79a2144c6ec48b1f8d6e6b98e067d36609a5d038889a +82ac0c7acaa83ddc86c5b4249aae12f28155989c7c6b91e5137a4ce05113c6cbc16f6c44948b0efd8665362d3162f16a +8f268d1195ab465beeeb112cd7ffd5d5548559a8bc01261106d3555533fc1971081b25558d884d552df0db1cddda89d8 +8ef7caa5521f3e037586ce8ac872a4182ee20c7921c0065ed9986c047e3dda08294da1165f385d008b40d500f07d895f +8c2f98f6880550573fad46075d3eba26634b5b025ce25a0b4d6e0193352c8a1f0661064027a70fe8190b522405f9f4e3 +b7653f353564feb164f0f89ec7949da475b8dad4a4d396d252fc2a884f6932d027b7eb2dc4d280702c74569319ed701a +a026904f4066333befd9b87a8fad791d014096af60cdd668ef919c24dbe295ff31f7a790e1e721ba40cf5105abca67f4 +988f982004ada07a22dd345f2412a228d7a96b9cae2c487de42e392afe1e35c2655f829ce07a14629148ce7079a1f142 +9616add009067ed135295fb74d5b223b006b312bf14663e547a0d306694ff3a8a7bb9cfc466986707192a26c0bce599f +ad4c425de9855f6968a17ee9ae5b15e0a5b596411388cf976df62ecc6c847a6e2ddb2cea792a5f6e9113c2445dba3e5c +b698ac9d86afa3dc69ff8375061f88e3b0cff92ff6dfe747cebaf142e813c011851e7a2830c10993b715e7fd594604a9 +a386fa189847bb3b798efca917461e38ead61a08b101948def0f82cd258b945ed4d45b53774b400af500670149e601b7 +905c95abda2c68a6559d8a39b6db081c68cef1e1b4be63498004e1b2f408409be9350b5b5d86a30fd443e2b3e445640a +9116dade969e7ce8954afcdd43e5cab64dc15f6c1b8da9d2d69de3f02ba79e6c4f6c7f54d6bf586d30256ae405cd1e41 +a3084d173eacd08c9b5084a196719b57e47a0179826fda73466758235d7ecdb87cbcf097bd6b510517d163a85a7c7edd +85bb00415ad3c9be99ff9ba83672cc59fdd24356b661ab93713a3c8eab34e125d8867f628a3c3891b8dc056e69cd0e83 +8d58541f9f39ed2ee4478acce5d58d124031338ec11b0d55551f00a5a9a6351faa903a5d7c132dc5e4bb026e9cbd18e4 +a622adf72dc250e54f672e14e128c700166168dbe0474cecb340da175346e89917c400677b1bc1c11fcc4cc26591d9db +b3f865014754b688ca8372e8448114fff87bf3ca99856ab9168894d0c4679782c1ced703f5b74e851b370630f5e6ee86 +a7e490b2c40c2446fcd91861c020da9742c326a81180e38110558bb5d9f2341f1c1885e79b364e6419023d1cbdc47380 +b3748d472b1062e54572badbb8e87ac36534407f74932e7fc5b8392d008e8e89758f1671d1e4d30ab0fa40551b13bb5e +89898a5c5ec4313aabc607b0049fd1ebad0e0c074920cf503c9275b564d91916c2c446d3096491c950b7af3ac5e4b0ed +8eb8c83fef2c9dd30ea44e286e9599ec5c20aba983f702e5438afe2e5b921884327ad8d1566c72395587efac79ca7d56 +b92479599e806516ce21fb0bd422a1d1d925335ebe2b4a0a7e044dd275f30985a72b97292477053ac5f00e081430da80 +a34ae450a324fe8a3c25a4d653a654f9580ed56bbea213b8096987bbad0f5701d809a17076435e18017fea4d69f414bc +81381afe6433d62faf62ea488f39675e0091835892ecc238e02acf1662669c6d3962a71a3db652f6fe3bc5f42a0e5dc5 +a430d475bf8580c59111103316fe1aa79c523ea12f1d47a976bbfae76894717c20220e31cf259f08e84a693da6688d70 +b842814c359754ece614deb7d184d679d05d16f18a14b288a401cef5dad2cf0d5ee90bad487b80923fc5573779d4e4e8 +971d9a2627ff2a6d0dcf2af3d895dfbafca28b1c09610c466e4e2bff2746f8369de7f40d65b70aed135fe1d72564aa88 +8f4ce1c59e22b1ce7a0664caaa7e53735b154cfba8d2c5cc4159f2385843de82ab58ed901be876c6f7fce69cb4130950 +86cc9dc321b6264297987000d344fa297ef45bcc2a4df04e458fe2d907ad304c0ea2318e32c3179af639a9a56f3263cf +8229e0876dfe8f665c3fb19b250bd89d40f039bbf1b331468b403655be7be2e104c2fd07b9983580c742d5462ca39a43 +99299d73066e8eb128f698e56a9f8506dfe4bd014931e86b6b487d6195d2198c6c5bf15cccb40ccf1f8ddb57e9da44a2 +a3a3be37ac554c574b393b2f33d0a32a116c1a7cfeaf88c54299a4da2267149a5ecca71f94e6c0ef6e2f472b802f5189 +a91700d1a00387502cdba98c90f75fbc4066fefe7cc221c8f0e660994c936badd7d2695893fde2260c8c11d5bdcdd951 +8e03cae725b7f9562c5c5ab6361644b976a68bada3d7ca508abca8dfc80a469975689af1fba1abcf21bc2a190dab397d +b01461ad23b2a8fa8a6d241e1675855d23bc977dbf4714add8c4b4b7469ccf2375cec20e80cedfe49361d1a30414ac5b +a2673bf9bc621e3892c3d7dd4f1a9497f369add8cbaa3472409f4f86bd21ac67cfac357604828adfee6ada1835365029 +a042dff4bf0dfc33c178ba1b335e798e6308915128de91b12e5dbbab7c4ac8d60a01f6aea028c3a6d87b9b01e4e74c01 +86339e8a75293e4b3ae66b5630d375736b6e6b6b05c5cda5e73fbf7b2f2bd34c18a1d6cefede08625ce3046e77905cb8 +af2ebe1b7d073d03e3d98bc61af83bf26f7a8c130fd607aa92b75db22d14d016481b8aa231e2c9757695f55b7224a27f +a00ee882c9685e978041fd74a2c465f06e2a42ffd3db659053519925be5b454d6f401e3c12c746e49d910e4c5c9c5e8c +978a781c0e4e264e0dad57e438f1097d447d891a1e2aa0d5928f79a9d5c3faae6f258bc94fdc530b7b2fa6a9932bb193 +aa4b7ce2e0c2c9e9655bf21e3e5651c8503bce27483017b0bf476be743ba06db10228b3a4c721219c0779747f11ca282 +b003d1c459dacbcf1a715551311e45d7dbca83a185a65748ac74d1800bbeaba37765d9f5a1a221805c571910b34ebca8 +95b6e531b38648049f0d19de09b881baa1f7ea3b2130816b006ad5703901a05da57467d1a3d9d2e7c73fb3f2e409363c +a6cf9c06593432d8eba23a4f131bb7f72b9bd51ab6b4b772a749fe03ed72b5ced835a349c6d9920dba2a39669cb7c684 +aa3d59f6e2e96fbb66195bc58c8704e139fa76cd15e4d61035470bd6e305db9f98bcbf61ac1b95e95b69ba330454c1b3 +b57f97959c208361de6d7e86dff2b873068adb0f158066e646f42ae90e650079798f165b5cd713141cd3a2a90a961d9a +a76ee8ed9052f6a7a8c69774bb2597be182942f08115baba03bf8faaeaee526feba86120039fe8ca7b9354c3b6e0a8e6 +95689d78c867724823f564627d22d25010f278674c6d2d0cdb10329169a47580818995d1d727ce46c38a1e47943ebb89 +ab676d2256c6288a88e044b3d9ffd43eb9d5aaee00e8fc60ac921395fb835044c71a26ca948e557fed770f52d711e057 +96351c72785c32e5d004b6f4a1259fb8153d631f0c93fed172f18e8ba438fbc5585c1618deeabd0d6d0b82173c2e6170 +93dd8d3db576418e22536eba45ab7f56967c6c97c64260d6cddf38fb19c88f2ec5cd0e0156f50e70855eee8a2b879ffd +ad6ff16f40f6de3d7a737f8e6cebd8416920c4ff89dbdcd75eabab414af9a6087f83ceb9aff7680aa86bff98bd09c8cc +84de53b11671abc9c38710e19540c5c403817562aeb22a88404cdaff792c1180f717dbdfe8f54940c062c4d032897429 +872231b9efa1cdd447b312099a5c164c560440a9441d904e70f5abfc3b2a0d16be9a01aca5e0a2599a61e19407587e3d +88f44ac27094a2aa14e9dc40b099ee6d68f97385950f303969d889ee93d4635e34dff9239103bdf66a4b7cbba3e7eb7a +a59afebadf0260e832f6f44468443562f53fbaf7bcb5e46e1462d3f328ac437ce56edbca617659ac9883f9e13261fad7 +b1990e42743a88de4deeacfd55fafeab3bc380cb95de43ed623d021a4f2353530bcab9594389c1844b1c5ea6634c4555 +85051e841149a10e83f56764e042182208591396d0ce78c762c4a413e6836906df67f38c69793e158d64fef111407ba3 +9778172bbd9b1f2ec6bbdd61829d7b39a7df494a818e31c654bf7f6a30139899c4822c1bf418dd4f923243067759ce63 +9355005b4878c87804fc966e7d24f3e4b02bed35b4a77369d01f25a3dcbff7621b08306b1ac85b76fe7b4a3eb5f839b1 +8f9dc6a54fac052e236f8f0e1f571ac4b5308a43acbe4cc8183bce26262ddaf7994e41cf3034a4cbeca2c505a151e3b1 +8cc59c17307111723fe313046a09e0e32ea0cce62c13814ab7c6408c142d6a0311d801be4af53fc9240523f12045f9ef +8e6057975ed40a1932e47dd3ac778f72ee2a868d8540271301b1aa6858de1a5450f596466494a3e0488be4fbeb41c840 +812145efbd6559ae13325d56a15940ca4253b17e72a9728986b563bb5acc13ec86453796506ac1a8f12bd6f9e4a288c3 +911da0a6d6489eb3dab2ec4a16e36127e8a291ae68a6c2c9de33e97f3a9b1f00da57a94e270a0de79ecc5ecb45d19e83 +b72ea85973f4b2a7e6e71962b0502024e979a73c18a9111130e158541fa47bbaaf53940c8f846913a517dc69982ba9e1 +a7a56ad1dbdc55f177a7ad1d0af78447dc2673291e34e8ab74b26e2e2e7d8c5fe5dc89e7ef60f04a9508847b5b3a8188 +b52503f6e5411db5d1e70f5fb72ccd6463fa0f197b3e51ca79c7b5a8ab2e894f0030476ada72534fa4eb4e06c3880f90 +b51c7957a3d18c4e38f6358f2237b3904618d58b1de5dec53387d25a63772e675a5b714ad35a38185409931157d4b529 +b86b4266e719d29c043d7ec091547aa6f65bbf2d8d831d1515957c5c06513b72aa82113e9645ad38a7bc3f5383504fa6 +b95b547357e6601667b0f5f61f261800a44c2879cf94e879def6a105b1ad2bbf1795c3b98a90d588388e81789bd02681 +a58fd4c5ae4673fa350da6777e13313d5d37ed1dafeeb8f4f171549765b84c895875d9d3ae6a9741f3d51006ef81d962 +9398dc348d078a604aadc154e6eef2c0be1a93bb93ba7fe8976edc2840a3a318941338cc4d5f743310e539d9b46613d2 +902c9f0095014c4a2f0dccaaab543debba6f4cc82c345a10aaf4e72511725dbed7a34cd393a5f4e48a3e5142b7be84ed +a7c0447849bb44d04a0393a680f6cd390093484a79a147dd238f5d878030d1c26646d88211108e59fe08b58ad20c6fbd +80db045535d6e67a422519f5c89699e37098449d249698a7cc173a26ccd06f60238ae6cc7242eb780a340705c906790c +8e52b451a299f30124505de2e74d5341e1b5597bdd13301cc39b05536c96e4380e7f1b5c7ef076f5b3005a868657f17c +824499e89701036037571761e977654d2760b8ce21f184f2879fda55d3cda1e7a95306b8abacf1caa79d3cc075b9d27f +9049b956b77f8453d2070607610b79db795588c0cec12943a0f5fe76f358dea81e4f57a4692112afda0e2c05c142b26f +81911647d818a4b5f4990bfd4bc13bf7be7b0059afcf1b6839333e8569cdb0172fd2945410d88879349f677abaed5eb3 +ad4048f19b8194ed45b6317d9492b71a89a66928353072659f5ce6c816d8f21e69b9d1817d793effe49ca1874daa1096 +8d22f7b2ddb31458661abd34b65819a374a1f68c01fc6c9887edeba8b80c65bceadb8f57a3eb686374004b836261ef67 +92637280c259bc6842884db3d6e32602a62252811ae9b019b3c1df664e8809ffe86db88cfdeb8af9f46435c9ee790267 +a2f416379e52e3f5edc21641ea73dc76c99f7e29ea75b487e18bd233856f4c0183429f378d2bfc6cd736d29d6cadfa49 +882cb6b76dbdc188615dcf1a8439eba05ffca637dd25197508156e03c930b17b9fed2938506fdd7b77567cb488f96222 +b68b621bb198a763fb0634eddb93ed4b5156e59b96c88ca2246fd1aea3e6b77ed651e112ac41b30cd361fadc011d385e +a3cb22f6b675a29b2d1f827cacd30df14d463c93c3502ef965166f20d046af7f9ab7b2586a9c64f4eae4fad2d808a164 +8302d9ce4403f48ca217079762ce42cee8bc30168686bb8d3a945fbd5acd53b39f028dce757b825eb63af2d5ae41169d +b2eef1fbd1a176f1f4cd10f2988c7329abe4eb16c7405099fb92baa724ab397bc98734ef7d4b24c0f53dd90f57520d04 +a1bbef0bd684a3f0364a66bde9b29326bac7aa3dde4caed67f14fb84fed3de45c55e406702f1495a3e2864d4ee975030 +976acdb0efb73e3a3b65633197692dedc2adaed674291ae3df76b827fc866d214e9cac9ca46baefc4405ff13f953d936 +b9fbf71cc7b6690f601f0b1c74a19b7d14254183a2daaafec7dc3830cba5ae173d854bbfebeca985d1d908abe5ef0cda +90591d7b483598c94e38969c4dbb92710a1a894bcf147807f1bcbd8aa3ac210b9f2be65519aa829f8e1ccdc83ad9b8cf +a30568577c91866b9c40f0719d46b7b3b2e0b4a95e56196ac80898a2d89cc67880e1229933f2cd28ee3286f8d03414d7 +97589a88c3850556b359ec5e891f0937f922a751ac7c95949d3bbc7058c172c387611c0f4cb06351ef02e5178b3dd9e4 +98e7bbe27a1711f4545df742f17e3233fbcc63659d7419e1ca633f104cb02a32c84f2fac23ca2b84145c2672f68077ab +a7ddb91636e4506d8b7e92aa9f4720491bb71a72dadc47c7f4410e15f93e43d07d2b371951a0e6a18d1bd087aa96a5c4 +a7c006692227a06db40bceac3d5b1daae60b5692dd9b54772bedb5fea0bcc91cbcdb530cac31900ffc70c5b3ffadc969 +8d3ec6032778420dfa8be52066ba0e623467df33e4e1901dbadd586c5d750f4ccde499b5197e26b9ea43931214060f69 +8d9a8410518ea64f89df319bfd1fc97a0971cdb9ad9b11d1f8fe834042ea7f8dce4db56eeaf179ff8dda93b6db93e5ce +a3c533e9b3aa04df20b9ff635cb1154ce303e045278fcf3f10f609064a5445552a1f93989c52ce852fd0bbd6e2b6c22e +81934f3a7f8c1ae60ec6e4f212986bcc316118c760a74155d06ce0a8c00a9b9669ec4e143ca214e1b995e41271774fd9 +ab8e2d01a71192093ef8fafa7485e795567cc9db95a93fb7cc4cf63a391ef89af5e2bfad4b827fffe02b89271300407f +83064a1eaa937a84e392226f1a60b7cfad4efaa802f66de5df7498962f7b2649924f63cd9962d47906380b97b9fe80e1 +b4f5e64a15c6672e4b55417ee5dc292dcf93d7ea99965a888b1cc4f5474a11e5b6520eacbcf066840b343f4ceeb6bf33 +a63d278b842456ef15c278b37a6ea0f27c7b3ffffefca77c7a66d2ea06c33c4631eb242bbb064d730e70a8262a7b848a +83a41a83dbcdf0d22dc049de082296204e848c453c5ab1ba75aa4067984e053acf6f8b6909a2e1f0009ed051a828a73b +819485b036b7958508f15f3c19436da069cbe635b0318ebe8c014cf1ef9ab2df038c81161b7027475bcfa6fff8dd9faf +aa40e38172806e1e045e167f3d1677ef12d5dcdc89b43639a170f68054bd196c4fae34c675c1644d198907a03f76ba57 +969bae484883a9ed1fbed53b26b3d4ee4b0e39a6c93ece5b3a49daa01444a1c25727dabe62518546f36b047b311b177c +80a9e73a65da99664988b238096a090d313a0ee8e4235bc102fa79bb337b51bb08c4507814eb5baec22103ec512eaab0 +86604379aec5bddda6cbe3ef99c0ac3a3c285b0b1a15b50451c7242cd42ae6b6c8acb717dcca7917838432df93a28502 +a23407ee02a495bed06aa7e15f94cfb05c83e6d6fba64456a9bbabfa76b2b68c5c47de00ba169e710681f6a29bb41a22 +98cff5ecc73b366c6a01b34ac9066cb34f7eeaf4f38a5429bad2d07e84a237047e2a065c7e8a0a6581017dadb4695deb +8de9f68a938f441f3b7ab84bb1f473c5f9e5c9e139e42b7ccee1d254bd57d0e99c2ccda0f3198f1fc5737f6023dd204e +b0ce48d815c2768fb472a315cad86aa033d0e9ca506f146656e2941829e0acb735590b4fbc713c2d18d3676db0a954ac +82f485cdefd5642a6af58ac6817991c49fac9c10ace60f90b27f1788cc026c2fe8afc83cf499b3444118f9f0103598a8 +82c24550ed512a0d53fc56f64cc36b553823ae8766d75d772dacf038c460f16f108f87a39ceef7c66389790f799dbab3 +859ffcf1fe9166388316149b9acc35694c0ea534d43f09dae9b86f4aa00a23b27144dda6a352e74b9516e8c8d6fc809c +b8f7f353eec45da77fb27742405e5ad08d95ec0f5b6842025be9def3d9892f85eb5dd0921b41e6eff373618dba215bca +8ccca4436f9017e426229290f5cd05eac3f16571a4713141a7461acfe8ae99cd5a95bf5b6df129148693c533966145da +a2c67ecc19c0178b2994846fea4c34c327a5d786ac4b09d1d13549d5be5996d8a89021d63d65cb814923388f47cc3a03 +aa0ff87d676b418ec08f5cbf577ac7e744d1d0e9ebd14615b550eb86931eafd2a36d4732cc5d6fab1713fd7ab2f6f7c0 +8aef4730bb65e44efd6bb9441c0ae897363a2f3054867590a2c2ecf4f0224e578c7a67f10b40f8453d9f492ac15a9b2d +86a187e13d8fba5addcfdd5b0410cedd352016c930f913addd769ee09faa6be5ca3e4b1bdb417a965c643a99bd92be42 +a0a4e9632a7a094b14b29b78cd9c894218cdf6783e61671e0203865dc2a835350f465fbaf86168f28af7c478ca17bc89 +a8c7b02d8deff2cd657d8447689a9c5e2cd74ef57c1314ac4d69084ac24a7471954d9ff43fe0907d875dcb65fd0d3ce5 +97ded38760aa7be6b6960b5b50e83b618fe413cbf2bcc1da64c05140bcc32f5e0e709cd05bf8007949953fac5716bad9 +b0d293835a24d64c2ae48ce26e550b71a8c94a0883103757fb6b07e30747f1a871707d23389ba2b2065fa6bafe220095 +8f9e291bf849feaa575592e28e3c8d4b7283f733d41827262367ea1c40f298c7bcc16505255a906b62bf15d9f1ba85fb +998f4e2d12708b4fd85a61597ca2eddd750f73c9e0c9b3cf0825d8f8e01f1628fd19797dcaed3b16dc50331fc6b8b821 +b30d1f8c115d0e63bf48f595dd10908416774c78b3bbb3194192995154d80ea042d2e94d858de5f8aa0261b093c401fd +b5d9c75bb41f964cbff3f00e96d9f1480c91df8913f139f0d385d27a19f57a820f838eb728e46823cbff00e21c660996 +a6edec90b5d25350e2f5f0518777634f9e661ec9d30674cf5b156c4801746d62517751d90074830ac0f4b09911c262f1 +82f98da1264b6b75b8fbeb6a4d96d6a05b25c24db0d57ba3a38efe3a82d0d4e331b9fc4237d6494ccfe4727206457519 +b89511843453cf4ecd24669572d6371b1e529c8e284300c43e0d5bb6b3aaf35aeb634b3cb5c0a2868f0d5e959c1d0772 +a82bf065676583e5c1d3b81987aaae5542f522ba39538263a944bb33ea5b514c649344a96c0205a3b197a3f930fcda6c +a37b47ea527b7e06c460776aa662d9a49ff4149d3993f1a974b0dd165f7171770d189b0e2ea54fd5fccb6a14b116e68a +a1017677f97dda818274d47556d09d0e4ccacb23a252f82a6cfe78c630ad46fb9806307445a59fb61262182de3a2b29c +b01e9fcac239ba270e6877b79273ddd768bf8a51d2ed8a051b1c11e18eff3de5920e2fcbfbd26f06d381eddd3b1f1e1b +82fcd53d803b1c8e4ed76adc339b7f3a5962d37042b9683aabac7513ac68775d4a566a9460183926a6a95dbe7d551a1f +a763e78995d55cd21cdb7ef75d9642d6e1c72453945e346ab6690c20a4e1eeec61bb848ef830ae4b56182535e3c71d8f +b769f4db602251d4b0a1186782799bdcef66de33c110999a5775c50b349666ffd83d4c89714c4e376f2efe021a5cfdb2 +a59cbd1b785efcfa6e83fc3b1d8cf638820bc0c119726b5368f3fba9dce8e3414204fb1f1a88f6c1ff52e87961252f97 +95c8c458fd01aa23ecf120481a9c6332ebec2e8bb70a308d0576926a858457021c277958cf79017ddd86a56cacc2d7db +82eb41390800287ae56e77f2e87709de5b871c8bdb67c10a80fc65f3acb9f7c29e8fa43047436e8933f27449ea61d94d +b3ec25e3545eb83aed2a1f3558d1a31c7edde4be145ecc13b33802654b77dc049b4f0065069dd9047b051e52ab11dcdd +b78a0c715738f56f0dc459ab99e252e3b579b208142836b3c416b704ca1de640ca082f29ebbcee648c8c127df06f6b1e +a4083149432eaaf9520188ebf4607d09cf664acd1f471d4fb654476e77a9eaae2251424ffda78d09b6cb880df35c1219 +8c52857d68d6e9672df3db2df2dbf46b516a21a0e8a18eec09a6ae13c1ef8f369d03233320dd1c2c0bbe00abfc1ea18b +8c856089488803066bff3f8d8e09afb9baf20cecc33c8823c1c0836c3d45498c3de37e87c016b705207f60d2b00f8609 +831a3df39be959047b2aead06b4dcd3012d7b29417f642b83c9e8ce8de24a3dbbd29c6fdf55e2db3f7ea04636c94e403 +aed84d009f66544addabe404bf6d65af7779ce140dc561ff0c86a4078557b96b2053b7b8a43432ffb18cd814f143b9da +93282e4d72b0aa85212a77b336007d8ba071eea17492da19860f1ad16c1ea8867ccc27ef5c37c74b052465cc11ea4f52 +a7b78b8c8d057194e8d68767f1488363f77c77bddd56c3da2bc70b6354c7aa76247c86d51f7371aa38a4aa7f7e3c0bb7 +b1c77283d01dcd1bde649b5b044eac26befc98ff57cbee379fb5b8e420134a88f2fc7f0bf04d15e1fbd45d29e7590fe6 +a4aa8de70330a73b2c6458f20a1067eed4b3474829b36970a8df125d53bbdda4f4a2c60063b7cccb0c80fc155527652f +948a6c79ba1b8ad7e0bed2fae2f0481c4e41b4d9bbdd9b58164e28e9065700e83f210c8d5351d0212e0b0b68b345b3a5 +86a48c31dcbbf7b082c92d28e1f613a2378a910677d7db3a349dc089e4a1e24b12eee8e8206777a3a8c64748840b7387 +976adb1af21e0fc34148917cf43d933d7bfd3fd12ed6c37039dcd5a4520e3c6cf5868539ba5bf082326430deb8a4458d +b93e1a4476f2c51864bb4037e7145f0635eb2827ab91732b98d49b6c07f6ac443111aa1f1da76d1888665cb897c3834e +8afd46fb23bf869999fa19784b18a432a1f252d09506b8dbb756af900518d3f5f244989b3d7c823d9029218c655d3dc6 +83f1e59e3abeed18cdc632921672673f1cb6e330326e11c4e600e13e0d5bc11bdc970ae12952e15103a706fe720bf4d6 +90ce4cc660714b0b673d48010641c09c00fc92a2c596208f65c46073d7f349dd8e6e077ba7dcef9403084971c3295b76 +8b09b0f431a7c796561ecf1549b85048564de428dac0474522e9558b6065fede231886bc108539c104ce88ebd9b5d1b0 +85d6e742e2fb16a7b0ba0df64bc2c0dbff9549be691f46a6669bca05e89c884af16822b85faefefb604ec48c8705a309 +a87989ee231e468a712c66513746fcf03c14f103aadca0eac28e9732487deb56d7532e407953ab87a4bf8961588ef7b0 +b00da10efe1c29ee03c9d37d5918e391ae30e48304e294696b81b434f65cf8c8b95b9d1758c64c25e534d045ba28696f +91c0e1fb49afe46c7056400baa06dbb5f6e479db78ee37e2d76c1f4e88994357e257b83b78624c4ef6091a6c0eb8254d +883fb797c498297ccbf9411a3e727c3614af4eccde41619b773dc7f3259950835ee79453debf178e11dec4d3ada687a0 +a14703347e44eb5059070b2759297fcfcfc60e6893c0373eea069388eba3950aa06f1c57cd2c30984a2d6f9e9c92c79e +afebc7585b304ceba9a769634adff35940e89cd32682c78002822aab25eec3edc29342b7f5a42a56a1fec67821172ad5 +aea3ff3822d09dba1425084ca95fd359718d856f6c133c5fabe2b2eed8303b6e0ba0d8698b48b93136a673baac174fd9 +af2456a09aa777d9e67aa6c7c49a1845ea5cdda2e39f4c935c34a5f8280d69d4eec570446998cbbe31ede69a91e90b06 +82cada19fed16b891ef3442bafd49e1f07c00c2f57b2492dd4ee36af2bd6fd877d6cb41188a4d6ce9ec8d48e8133d697 +82a21034c832287f616619a37c122cee265cc34ae75e881fcaea4ea7f689f3c2bc8150bbf7dbcfd123522bfb7f7b1d68 +86877217105f5d0ec3eeff0289fc2a70d505c9fdf7862e8159553ef60908fb1a27bdaf899381356a4ef4649072a9796c +82b196e49c6e861089a427c0b4671d464e9d15555ffb90954cd0d630d7ae02eb3d98ceb529d00719c2526cd96481355a +a29b41d0d43d26ce76d4358e0db2b77df11f56e389f3b084d8af70a636218bd3ac86b36a9fe46ec9058c26a490f887f7 +a4311c4c20c4d7dd943765099c50f2fd423e203ccfe98ff00087d205467a7873762510cac5fdce7a308913ed07991ed7 +b1f040fc5cc51550cb2c25cf1fd418ecdd961635a11f365515f0cb4ffb31da71f48128c233e9cc7c0cf3978d757ec84e +a9ebae46f86d3bd543c5f207ed0d1aed94b8375dc991161d7a271f01592912072e083e2daf30c146430894e37325a1b9 +826418c8e17ad902b5fe88736323a47e0ca7a44bce4cbe27846ec8fe81de1e8942455dda6d30e192cdcc73e11df31256 +85199db563427c5edcbac21f3d39fec2357be91fb571982ddcdc4646b446ad5ced84410de008cb47b3477ee0d532daf8 +b7eed9cd400b2ca12bf1d9ae008214b8561fb09c8ad9ff959e626ffde00fee5ff2f5b6612e231f2a1a9b1646fcc575e3 +8b40bf12501dcbac78f5a314941326bfcddf7907c83d8d887d0bb149207f85d80cd4dfbd7935439ea7b14ea39a3fded7 +83e3041af302485399ba6cd5120e17af61043977083887e8d26b15feec4a6b11171ac5c06e6ad0971d4b58a81ff12af3 +8f5b9a0eecc589dbf8c35a65d5e996a659277ef6ea509739c0cb7b3e2da9895e8c8012de662e5b23c5fa85d4a8f48904 +835d71ed5e919d89d8e6455f234f3ff215462c4e3720c371ac8c75e83b19dfe3ae15a81547e4dc1138e5f5997f413cc9 +8b7d2e4614716b1db18e9370176ea483e6abe8acdcc3dcdf5fb1f4d22ca55d652feebdccc171c6de38398d9f7bfdec7a +93eace72036fe57d019676a02acf3d224cf376f166658c1bf705db4f24295881d477d6fdd7916efcfceff8c7a063deda +b1ac460b3d516879a84bc886c54f020a9d799e7c49af3e4d7de5bf0d2793c852254c5d8fe5616147e6659512e5ccb012 +acd0947a35cb167a48bcd9667620464b54ac0e78f9316b4aa92dcaab5422d7a732087e52e1c827faa847c6b2fe6e7766 +94ac33d21c3d12ff762d32557860e911cd94d666609ddcc42161b9c16f28d24a526e8b10bb03137257a92cec25ae637d +832e02058b6b994eadd8702921486241f9a19e68ed1406dad545e000a491ae510f525ccf9d10a4bba91c68f2c53a0f58 +9471035d14f78ff8f463b9901dd476b587bb07225c351161915c2e9c6114c3c78a501379ab6fb4eb03194c457cbd22bf +ab64593e034c6241d357fcbc32d8ea5593445a5e7c24cac81ad12bd2ef01843d477a36dc1ba21dbe63b440750d72096a +9850f3b30045e927ad3ec4123a32ed2eb4c911f572b6abb79121873f91016f0d80268de8b12e2093a4904f6e6cab7642 +987212c36b4722fe2e54fa30c52b1e54474439f9f35ca6ad33c5130cd305b8b54b532dd80ffd2c274105f20ce6d79f6e +8b4d0c6abcb239b5ed47bef63bc17efe558a27462c8208fa652b056e9eae9665787cd1aee34fbb55beb045c8bfdb882b +a9f3483c6fee2fe41312d89dd4355d5b2193ac413258993805c5cbbf0a59221f879386d3e7a28e73014f10e65dd503d9 +a2225da3119b9b7c83d514b9f3aeb9a6d9e32d9cbf9309cbb971fd53c4b2c001d10d880a8ad8a7c281b21d85ceca0b7c +a050be52e54e676c151f7a54453bbb707232f849beab4f3bf504b4d620f59ed214409d7c2bd3000f3ff13184ccda1c35 +adbccf681e15b3edb6455a68d292b0a1d0f5a4cb135613f5e6db9943f02181341d5755875db6ee474e19ace1c0634a28 +8b6eff675632a6fad0111ec72aacc61c7387380eb87933fd1d098856387d418bd38e77d897e65d6fe35951d0627c550b +aabe2328ddf90989b15e409b91ef055cb02757d34987849ae6d60bef2c902bf8251ed21ab30acf39e500d1d511e90845 +92ba4eb1f796bc3d8b03515f65c045b66e2734c2da3fc507fdd9d6b5d1e19ab3893726816a32141db7a31099ca817d96 +8a98b3cf353138a1810beb60e946183803ef1d39ac4ea92f5a1e03060d35a4774a6e52b14ead54f6794d5f4022b8685c +909f8a5c13ec4a59b649ed3bee9f5d13b21d7f3e2636fd2bb3413c0646573fdf9243d63083356f12f5147545339fcd55 +9359d914d1267633141328ed0790d81c695fea3ddd2d406c0df3d81d0c64931cf316fe4d92f4353c99ff63e2aefc4e34 +b88302031681b54415fe8fbfa161c032ea345c6af63d2fb8ad97615103fd4d4281c5a9cae5b0794c4657b97571a81d3b +992c80192a519038082446b1fb947323005b275e25f2c14c33cc7269e0ec038581cc43705894f94bad62ae33a8b7f965 +a78253e3e3eece124bef84a0a8807ce76573509f6861d0b6f70d0aa35a30a123a9da5e01e84969708c40b0669eb70aa6 +8d5724de45270ca91c94792e8584e676547d7ac1ac816a6bb9982ee854eb5df071d20545cdfd3771cd40f90e5ba04c8e +825a6f586726c68d45f00ad0f5a4436523317939a47713f78fd4fe81cd74236fdac1b04ecd97c2d0267d6f4981d7beb1 +93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 +b5bfd7dd8cdeb128843bc287230af38926187075cbfbefa81009a2ce615ac53d2914e5870cb452d2afaaab24f3499f72185cbfee53492714734429b7b38608e23926c911cceceac9a36851477ba4c60b087041de621000edc98edada20c1def2 +b5337ba0ce5d37224290916e268e2060e5c14f3f9fc9e1ec3af5a958e7a0303122500ce18f1a4640bf66525bd10e763501fe986d86649d8d45143c08c3209db3411802c226e9fe9a55716ac4a0c14f9dcef9e70b2bb309553880dc5025eab3cc +b3c1dcdc1f62046c786f0b82242ef283e7ed8f5626f72542aa2c7a40f14d9094dd1ebdbd7457ffdcdac45fd7da7e16c51200b06d791e5e43e257e45efdf0bd5b06cd2333beca2a3a84354eb48662d83aef5ecf4e67658c851c10b13d8d87c874 +954d91c7688983382609fca9e211e461f488a5971fd4e40d7e2892037268eacdfd495cfa0a7ed6eb0eb11ac3ae6f651716757e7526abe1e06c64649d80996fd3105c20c4c94bc2b22d97045356fe9d791f21ea6428ac48db6f9e68e30d875280 +88a6b6bb26c51cf9812260795523973bb90ce80f6820b6c9048ab366f0fb96e48437a7f7cb62aedf64b11eb4dfefebb0147608793133d32003cb1f2dc47b13b5ff45f1bb1b2408ea45770a08dbfaec60961acb8119c47b139a13b8641e2c9487 +85cd7be9728bd925d12f47fb04b32d9fad7cab88788b559f053e69ca18e463113ecc8bbb6dbfb024835f901b3a957d3108d6770fb26d4c8be0a9a619f6e3a4bf15cbfd48e61593490885f6cee30e4300c5f9cf5e1c08e60a2d5b023ee94fcad0 +80477dba360f04399821a48ca388c0fa81102dd15687fea792ee8c1114e00d1bc4839ad37ac58900a118d863723acfbe08126ea883be87f50e4eabe3b5e72f5d9e041db8d9b186409fd4df4a7dde38c0e0a3b1ae29b098e5697e7f110b6b27e4 +b7a6aec08715a9f8672a2b8c367e407be37e59514ac19dd4f0942a68007bba3923df22da48702c63c0d6b3efd3c2d04e0fe042d8b5a54d562f9f33afc4865dcbcc16e99029e25925580e87920c399e710d438ac1ce3a6dc9b0d76c064a01f6f7 +ac1b001edcea02c8258aeffbf9203114c1c874ad88dae1184fadd7d94cd09053649efd0ca413400e6e9b5fa4eac33261000af88b6bd0d2abf877a4f0355d2fb4d6007adb181695201c5432e50b850b51b3969f893bddf82126c5a71b042b7686 +90043fda4de53fb364fab2c04be5296c215599105ecff0c12e4917c549257125775c29f2507124d15f56e30447f367db0596c33237242c02d83dfd058735f1e3c1ff99069af55773b6d51d32a68bf75763f59ec4ee7267932ae426522b8aaab6 +a8660ce853e9dc08271bf882e29cd53397d63b739584dda5263da4c7cc1878d0cf6f3e403557885f557e184700575fee016ee8542dec22c97befe1d10f414d22e84560741cdb3e74c30dda9b42eeaaf53e27822de2ee06e24e912bf764a9a533 +8fe3921a96d0d065e8aa8fce9aa42c8e1461ca0470688c137be89396dd05103606dab6cdd2a4591efd6addf72026c12e065da7be276dee27a7e30afa2bd81c18f1516e7f068f324d0bad9570b95f6bd02c727cd2343e26db0887c3e4e26dceda +8ae1ad97dcb9c192c9a3933541b40447d1dc4eebf380151440bbaae1e120cc5cdf1bcea55180b128d8e180e3af623815191d063cc0d7a47d55fb7687b9d87040bf7bc1a7546b07c61db5ccf1841372d7c2fe4a5431ffff829f3c2eb590b0b710 +8c2fa96870a88150f7876c931e2d3cc2adeaaaf5c73ef5fa1cf9dfa0991ae4819f9321af7e916e5057d87338e630a2f21242c29d76963cf26035b548d2a63d8ad7bd6efefa01c1df502cbdfdfe0334fb21ceb9f686887440f713bf17a89b8081 +b9aa98e2f02bb616e22ee5dd74c7d1049321ac9214d093a738159850a1dbcc7138cb8d26ce09d8296368fd5b291d74fa17ac7cc1b80840fdd4ee35e111501e3fa8485b508baecda7c1ab7bd703872b7d64a2a40b3210b6a70e8a6ffe0e5127e3 +9292db67f8771cdc86854a3f614a73805bf3012b48f1541e704ea4015d2b6b9c9aaed36419769c87c49f9e3165f03edb159c23b3a49c4390951f78e1d9b0ad997129b17cdb57ea1a6638794c0cca7d239f229e589c5ae4f9fe6979f7f8cba1d7 +91cd9e86550f230d128664f7312591fee6a84c34f5fc7aed557bcf986a409a6de722c4330453a305f06911d2728626e611acfdf81284f77f60a3a1595053a9479964fd713117e27c0222cc679674b03bc8001501aaf9b506196c56de29429b46 +a9516b73f605cc31b89c68b7675dc451e6364595243d235339437f556cf22d745d4250c1376182273be2d99e02c10eee047410a43eff634d051aeb784e76cb3605d8e079b9eb6ad1957dfdf77e1cd32ce4a573c9dfcc207ca65af6eb187f6c3d +a9667271f7d191935cc8ad59ef3ec50229945faea85bfdfb0d582090f524436b348aaa0183b16a6231c00332fdac2826125b8c857a2ed9ec66821cfe02b3a2279be2412441bc2e369b255eb98614e4be8490799c4df22f18d47d24ec70bba5f7 +a4371144d2aa44d70d3cb9789096d3aa411149a6f800cb46f506461ee8363c8724667974252f28aea61b6030c05930ac039c1ee64bb4bd56532a685cae182bf2ab935eee34718cffcb46cae214c77aaca11dbb1320faf23c47247db1da04d8dc +89a7eb441892260b7e81168c386899cd84ffc4a2c5cad2eae0d1ab9e8b5524662e6f660fe3f8bfe4c92f60b060811bc605b14c5631d16709266886d7885a5eb5930097127ec6fb2ebbaf2df65909cf48f253b3d5e22ae48d3e9a2fd2b01f447e +9648c42ca97665b5eccb49580d8532df05eb5a68db07f391a2340769b55119eaf4c52fe4f650c09250fa78a76c3a1e271799b8333cc2628e3d4b4a6a3e03da1f771ecf6516dd63236574a7864ff07e319a6f11f153406280d63af9e2b5713283 +9663bf6dd446ea7a90658ee458578d4196dc0b175ef7fcfa75f44d41670850774c2e46c5a6be132a2c072a3c0180a24f0305d1acac49d2d79878e5cda80c57feda3d01a6af12e78b5874e2a4b3717f11c97503b41a4474e2e95b179113726199 +b212aeb4814e0915b432711b317923ed2b09e076aaf558c3ae8ef83f9e15a83f9ea3f47805b2750ab9e8106cb4dc6ad003522c84b03dc02829978a097899c773f6fb31f7fe6b8f2d836d96580f216fec20158f1590c3e0d7850622e15194db05 +925f005059bf07e9ceccbe66c711b048e236ade775720d0fe479aebe6e23e8af281225ad18e62458dc1b03b42ad4ca290d4aa176260604a7aad0d9791337006fbdebe23746f8060d42876f45e4c83c3643931392fde1cd13ff8bddf8111ef974 +9553edb22b4330c568e156a59ef03b26f5c326424f830fe3e8c0b602f08c124730ffc40bc745bec1a22417adb22a1a960243a10565c2be3066bfdb841d1cd14c624cd06e0008f4beb83f972ce6182a303bee3fcbcabc6cfe48ec5ae4b7941bfc +935f5a404f0a78bdcce709899eda0631169b366a669e9b58eacbbd86d7b5016d044b8dfc59ce7ed8de743ae16c2343b50e2f925e88ba6319e33c3fc76b314043abad7813677b4615c8a97eb83cc79de4fedf6ccbcfa4d4cbf759a5a84e4d9742 +a5b014ab936eb4be113204490e8b61cd38d71da0dec7215125bcd131bf3ab22d0a32ce645bca93e7b3637cf0c2db3d6601a0ddd330dc46f9fae82abe864ffc12d656c88eb50c20782e5bb6f75d18760666f43943abb644b881639083e122f557 +935b7298ae52862fa22bf03bfc1795b34c70b181679ae27de08a9f5b4b884f824ef1b276b7600efa0d2f1d79e4a470d51692fd565c5cf8343dd80e5d3336968fc21c09ba9348590f6206d4424eb229e767547daefa98bc3aa9f421158dee3f2a +9830f92446e708a8f6b091cc3c38b653505414f8b6507504010a96ffda3bcf763d5331eb749301e2a1437f00e2415efb01b799ad4c03f4b02de077569626255ac1165f96ea408915d4cf7955047620da573e5c439671d1fa5c833fb11de7afe6 +840dcc44f673fff3e387af2bb41e89640f2a70bcd2b92544876daa92143f67c7512faf5f90a04b7191de01f3e2b1bde00622a20dc62ca23bbbfaa6ad220613deff43908382642d4d6a86999f662efd64b1df448b68c847cfa87630a3ffd2ec76 +92950c895ed54f7f876b2fda17ecc9c41b7accfbdd42c210cc5b475e0737a7279f558148531b5c916e310604a1de25a80940c94fe5389ae5d6a5e9c371be67bceea1877f5401725a6595bcf77ece60905151b6dfcb68b75ed2e708c73632f4fd +8010246bf8e94c25fd029b346b5fbadb404ef6f44a58fd9dd75acf62433d8cc6db66974f139a76e0c26dddc1f329a88214dbb63276516cf325c7869e855d07e0852d622c332ac55609ba1ec9258c45746a2aeb1af0800141ee011da80af175d4 +b0f1bad257ebd187bdc3f37b23f33c6a5d6a8e1f2de586080d6ada19087b0e2bf23b79c1b6da1ee82271323f5bdf3e1b018586b54a5b92ab6a1a16bb3315190a3584a05e6c37d5ca1e05d702b9869e27f513472bcdd00f4d0502a107773097da +9636d24f1ede773ce919f309448dd7ce023f424afd6b4b69cb98c2a988d849a283646dc3e469879daa1b1edae91ae41f009887518e7eb5578f88469321117303cd3ac2d7aee4d9cb5f82ab9ae3458e796dfe7c24284b05815acfcaa270ff22e2 +b373feb5d7012fd60578d7d00834c5c81df2a23d42794fed91aa9535a4771fde0341c4da882261785e0caca40bf83405143085e7f17e55b64f6c5c809680c20b050409bf3702c574769127c854d27388b144b05624a0e24a1cbcc4d08467005b +b15680648949ce69f82526e9b67d9b55ce5c537dc6ab7f3089091a9a19a6b90df7656794f6edc87fb387d21573ffc847062623685931c2790a508cbc8c6b231dd2c34f4d37d4706237b1407673605a604bcf6a50cc0b1a2db20485e22b02c17e +8817e46672d40c8f748081567b038a3165f87994788ec77ee8daea8587f5540df3422f9e120e94339be67f186f50952504cb44f61e30a5241f1827e501b2de53c4c64473bcc79ab887dd277f282fbfe47997a930dd140ac08b03efac88d81075 +a6e4ef6c1d1098f95aae119905f87eb49b909d17f9c41bcfe51127aa25fee20782ea884a7fdf7d5e9c245b5a5b32230b07e0dbf7c6743bf52ee20e2acc0b269422bd6cf3c07115df4aa85b11b2c16630a07c974492d9cdd0ec325a3fabd95044 +8634aa7c3d00e7f17150009698ce440d8e1b0f13042b624a722ace68ead870c3d2212fbee549a2c190e384d7d6ac37ce14ab962c299ea1218ef1b1489c98906c91323b94c587f1d205a6edd5e9d05b42d591c26494a6f6a029a2aadb5f8b6f67 +821a58092900bdb73decf48e13e7a5012a3f88b06288a97b855ef51306406e7d867d613d9ec738ebacfa6db344b677d21509d93f3b55c2ebf3a2f2a6356f875150554c6fff52e62e3e46f7859be971bf7dd9d5b3e1d799749c8a97c2e04325df +8dba356577a3a388f782e90edb1a7f3619759f4de314ad5d95c7cc6e197211446819c4955f99c5fc67f79450d2934e3c09adefc91b724887e005c5190362245eec48ce117d0a94d6fa6db12eda4ba8dde608fbbd0051f54dcf3bb057adfb2493 +a32a690dc95c23ed9fb46443d9b7d4c2e27053a7fcc216d2b0020a8cf279729c46114d2cda5772fd60a97016a07d6c5a0a7eb085a18307d34194596f5b541cdf01b2ceb31d62d6b55515acfd2b9eec92b27d082fbc4dc59fc63b551eccdb8468 +a040f7f4be67eaf0a1d658a3175d65df21a7dbde99bfa893469b9b43b9d150fc2e333148b1cb88cfd0447d88fa1a501d126987e9fdccb2852ecf1ba907c2ca3d6f97b055e354a9789854a64ecc8c2e928382cf09dda9abde42bbdf92280cdd96 +864baff97fa60164f91f334e0c9be00a152a416556b462f96d7c43b59fe1ebaff42f0471d0bf264976f8aa6431176eb905bd875024cf4f76c13a70bede51dc3e47e10b9d5652d30d2663b3af3f08d5d11b9709a0321aba371d2ef13174dcfcaf +95a46f32c994133ecc22db49bad2c36a281d6b574c83cfee6680b8c8100466ca034b815cfaedfbf54f4e75188e661df901abd089524e1e0eb0bf48d48caa9dd97482d2e8c1253e7e8ac250a32fd066d5b5cb08a8641bdd64ecfa48289dca83a3 +a2cce2be4d12144138cb91066e0cd0542c80b478bf467867ebef9ddaf3bd64e918294043500bf5a9f45ee089a8d6ace917108d9ce9e4f41e7e860cbce19ac52e791db3b6dde1c4b0367377b581f999f340e1d6814d724edc94cb07f9c4730774 +b145f203eee1ac0a1a1731113ffa7a8b0b694ef2312dabc4d431660f5e0645ef5838e3e624cfe1228cfa248d48b5760501f93e6ab13d3159fc241427116c4b90359599a4cb0a86d0bb9190aa7fabff482c812db966fd2ce0a1b48cb8ac8b3bca +adabe5d215c608696e03861cbd5f7401869c756b3a5aadc55f41745ad9478145d44393fec8bb6dfc4ad9236dc62b9ada0f7ca57fe2bae1b71565dbf9536d33a68b8e2090b233422313cc96afc7f1f7e0907dc7787806671541d6de8ce47c4cd0 +ae7845fa6b06db53201c1080e01e629781817f421f28956589c6df3091ec33754f8a4bd4647a6bb1c141ac22731e3c1014865d13f3ed538dcb0f7b7576435133d9d03be655f8fbb4c9f7d83e06d1210aedd45128c2b0c9bab45a9ddde1c862a5 +9159eaa826a24adfa7adf6e8d2832120ebb6eccbeb3d0459ffdc338548813a2d239d22b26451fda98cc0c204d8e1ac69150b5498e0be3045300e789bcb4e210d5cd431da4bdd915a21f407ea296c20c96608ded0b70d07188e96e6c1a7b9b86b +a9fc6281e2d54b46458ef564ffaed6944bff71e389d0acc11fa35d3fcd8e10c1066e0dde5b9b6516f691bb478e81c6b20865281104dcb640e29dc116daae2e884f1fe6730d639dbe0e19a532be4fb337bf52ae8408446deb393d224eee7cfa50 +84291a42f991bfb36358eedead3699d9176a38f6f63757742fdbb7f631f2c70178b1aedef4912fed7b6cf27e88ddc7eb0e2a6aa4b999f3eb4b662b93f386c8d78e9ac9929e21f4c5e63b12991fcde93aa64a735b75b535e730ff8dd2abb16e04 +a1b7fcacae181495d91765dfddf26581e8e39421579c9cbd0dd27a40ea4c54af3444a36bf85a11dda2114246eaddbdd619397424bb1eb41b5a15004b902a590ede5742cd850cf312555be24d2df8becf48f5afba5a8cd087cb7be0a521728386 +92feaaf540dbd84719a4889a87cdd125b7e995a6782911931fef26da9afcfbe6f86aaf5328fe1f77631491ce6239c5470f44c7791506c6ef1626803a5794e76d2be0af92f7052c29ac6264b7b9b51f267ad820afc6f881460521428496c6a5f1 +a525c925bfae1b89320a5054acc1fa11820f73d0cf28d273092b305467b2831fab53b6daf75fb926f332782d50e2522a19edcd85be5eb72f1497193c952d8cd0bcc5d43b39363b206eae4cb1e61668bde28a3fb2fc1e0d3d113f6dfadb799717 +98752bb6f5a44213f40eda6aa4ff124057c1b13b6529ab42fe575b9afa66e59b9c0ed563fb20dff62130c436c3e905ee17dd8433ba02c445b1d67182ab6504a90bbe12c26a754bbf734665c622f76c62fe2e11dd43ce04fd2b91a8463679058b +a9aa9a84729f7c44219ff9e00e651e50ddea3735ef2a73fdf8ed8cd271961d8ed7af5cd724b713a89a097a3fe65a3c0202f69458a8b4c157c62a85668b12fc0d3957774bc9b35f86c184dd03bfefd5c325da717d74192cc9751c2073fe9d170e +b221c1fd335a4362eff504cd95145f122bf93ea02ae162a3fb39c75583fc13a932d26050e164da97cff3e91f9a7f6ff80302c19dd1916f24acf6b93b62f36e9665a8785413b0c7d930c7f1668549910f849bca319b00e59dd01e5dec8d2edacc +a71e2b1e0b16d754b848f05eda90f67bedab37709550171551050c94efba0bfc282f72aeaaa1f0330041461f5e6aa4d11537237e955e1609a469d38ed17f5c2a35a1752f546db89bfeff9eab78ec944266f1cb94c1db3334ab48df716ce408ef +b990ae72768779ba0b2e66df4dd29b3dbd00f901c23b2b4a53419226ef9232acedeb498b0d0687c463e3f1eead58b20b09efcefa566fbfdfe1c6e48d32367936142d0a734143e5e63cdf86be7457723535b787a9cfcfa32fe1d61ad5a2617220 +8d27e7fbff77d5b9b9bbc864d5231fecf817238a6433db668d5a62a2c1ee1e5694fdd90c3293c06cc0cb15f7cbeab44d0d42be632cb9ff41fc3f6628b4b62897797d7b56126d65b694dcf3e298e3561ac8813fbd7296593ced33850426df42db +a92039a08b5502d5b211a7744099c9f93fa8c90cedcb1d05e92f01886219dd464eb5fb0337496ad96ed09c987da4e5f019035c5b01cc09b2a18b8a8dd419bc5895388a07e26958f6bd26751929c25f89b8eb4a299d822e2d26fec9ef350e0d3c +92dcc5a1c8c3e1b28b1524e3dd6dbecd63017c9201da9dbe077f1b82adc08c50169f56fc7b5a3b28ec6b89254de3e2fd12838a761053437883c3e01ba616670cea843754548ef84bcc397de2369adcca2ab54cd73c55dc68d87aec3fc2fe4f10 +97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb +ad3eb50121139aa34db1d545093ac9374ab7bca2c0f3bf28e27c8dcd8fc7cb42d25926fc0c97b336e9f0fb35e5a04c81 +8029c8ce0d2dce761a7f29c2df2290850c85bdfaec2955626d7acc8864aeb01fe16c9e156863dc63b6c22553910e27c1 +b1386c995d3101d10639e49b9e5d39b9a280dcf0f135c2e6c6928bb3ab8309a9da7178f33925768c324f11c3762cfdd5 +9596d929610e6d2ed3502b1bb0f1ea010f6b6605c95d4859f5e53e09fa68dc71dfd5874905447b5ec6cd156a76d6b6e8 +851e3c3d4b5b7cdbba25d72abf9812cf3d7c5a9dbdec42b6635e2add706cbeea18f985afe5247459f6c908620322f434 +b10f4cf8ec6e02491bbe6d9084d88c16306fdaf399fef3cd1453f58a4f7633f80dc60b100f9236c3103eaf727468374f +ade11ec630127e04d17e70db0237d55f2ff2a2094881a483797e8cddb98b622245e1f608e5dcd1172b9870e733b4a32f +af58c8a2f58f904ce20db81005331bf2d251e227e7d1bef575d691bdca842e6233eb2e26c2e116a61a78594772b38d25 +b3c1313c31ec82da5a7a09e9cf6656ca598c243345fe8d4828e520ade91787ffb8b9867db789b34ad67cef47b26ff86d +a8ed8a235355948e0b04be080b7b3e145293accefb4704d1da9050796b2f6870516c1ebf77ae6a65359edcfd016c0f36 +80e792d5ba24b8058f6d7291a2ec5cb68aab1e16e96d793128e86815631baf42c56b6205c19e25ce9727bd1fd6f9defb +816288c5d726b094e3fdf95cb8882f442c4d9d1101b92c7938a7dfd49bc50636d73ea1b05f75eb731c908c8fd8dee717 +ae009128d128ba2e1519bfa7a0c01ed494a7d461c3aba60f8a301701fed61fe4e31d6c79ce189542ae51df91e73ce1b3 +96a866d60a9007d05825c332476a83e869e15b11d7257172a67690ea9bd3efea44bf9c8d42191454eb04fcf110b16396 +8b250a2a06419adb9b611e89f7f8f2990aa301949b533ad3bf17c4a61ab5f5be0b1d5e2b571864d13f1bb75805c7795d +8450f49facf2e620fa45ee90e1801178842d927a2a25fc6ed7ba99a4eec7ae40eebfee41028eaa84f107f4a777694976 +91049080cf659c0985a22d1366e59191bb89663f922e8168b9b7d85c8a73d74a6d9dceefd855d3d858b493670c750581 +a1e167aeb2008087f3195926f1985c0a459d6ec57237255b1473a96de4e2c1cf766127c862c7dc853a6909e67cb06cf7 +b667c0d4e26e20698b07567358625d5f003839c92de8088e12dbd74a6f6a3156b4ea8d252c9ad62af5f6c4fec1cf6cc7 +8e4b5e304c0b1b161ae3e4b68b5e3ac66c42acd7c1ee2458044f6527c508a93995e50894d72d57c1350f91afe72775ff +8c642640aa7915421cdc21fd639f88a42052b1cfa358ff7702e60793a92b7b5926dae15a0c8f8f59cd3013f01c159ba3 +a356f35e713cfc283056bf539de54a21731e61efb4c47319f20de4a4b723d76a33b65f4a67d298b9ec5c2a1579418657 +93ce204146ce95f484dc79c27919a16c9e3fc14a9111c6c63d44491158d5838117d20851cc3227a5e8ba6ccf79e77f39 +b585664cbb9a84b52f89114e1cf0cf1171bea78a136dc1404ac88a11210b2debc3b7a55e702da93ff629095c134a295e +b6dfd444ec7fdceb14c6328f26ca12c3f9fc4327d8d8c68948e92e7e61262b82d833a65a9e3af6353ffa832b6da25705 +b4d4b8eb9ecfffe3f0d48fb4149c7b31aec1da7041ec03bd0750c52a2a7cbc3a7cfbf09d5bfdc56e3860826a62d0bb91 +a4e248e3d61db52da9683fef188579c470d65e2df9064726847b1599fc774049ffdc6ef2ae578d5ed7874f1298ecdf69 +a68a0fffc2e37d3183feb01b42234c0f4e510f9dc29d09c571e6da00fecad9da224cd0f31550070148667e226c4ca413 +86adda2ffecb77236c18005051f31f9657a0d50fef2a1175dfda32e74d5d53df825c10f289eb0ad39df0c64fc9bc7729 +998266d5c9c3764ed97d66fa9ed176af043999652bae19f0657c8328629d30af453230e3681c5a38e2f01e389ed8d825 +a05261554d3c620af0c914cf27ab98f5d3593c33ab313c198e0c40d6c72022eb5943778cd4f73e9fe8383392a7004976 +ad243fb3631bf90fedb9d679fd71fc0cf06bda028591ded2bd4c634ea7b3c2bd22eca2ab318fcdaa6c2cda1e63e1c57b +89b9859a04f903c95e97fb2951f01cc6418a2505eee0b5bc7266b4d33e01b69b9fe7dc56fa9ebb5856095be0925a422d +a68d118343a5bbfbbab95ff9bfe53aeb7fdbaf16db983e6f4456366df2aa01fbdb6ee9901cb102fc7d2bd099be2f1f3e +b49301f25d5a9dd2ec60ddb0b4b477291958487efea9e54dc0e4ef388f03b8bbadd13259d191f7a0b7513876767d8282 +8b93df7fb4513f67749905fd43db78f7026589b704ebb9ea3255d0ad6415437799f40f02e07efccda1e6fd5e8cd0a721 +ad88769ace96455da37c3c9019a9f523c694643be3f6b37b1e9dcc5053d1fe8e463abebdb1b3ef2f2fb801528a01c47c +80f0eb5dcbfaaf421bf59a8b9bd5245c4823c94510093e23e0b0534647fb5525a25ea3aeea0a927a1ee20c057f2c9234 +b10ad82ea6a5aeabe345d00eb17910d6942b6862f7f3773c7d321194e67c9cced0b3310425662606634dcd7f8b976c04 +82f6fd91f87822f6cc977808eeac77889f4a32fb0d618e784b2331263d0ffa820b3f70b069d32e0319c9e033ab75d3b4 +9436d3dc6b5e25b1f695f8c6c1c553dab312ccace4dac3afddc141d3506467cd50cb04a49ea96ea7f5a8a7b0fc65ef37 +8e0a9491651d52be8ebf4315fbbb410272f9a74b965d33b79ff1b9e1be3be59e43d9566773560e43280549c348e48f01 +8809137e5d3a22400d6e645a9bd84e21c492371736c7e62c51cef50fee3aa7f2405724367a83fd051ff702d971167f67 +b536a24f31a346de7f9863fc351fa602158404d2f94747eebe43abf1f21bf8f95a64146c02a4bec27b503f546789a388 +b5cdf5a04fc12a0e0ef7545830061dff7fd8abea46e48fbe6235109e6c36ee6bffcb9529e2f3d0d701cf58bbfb6a4197 +ab15377525753467d042b7931f66f862cbbb77464212c9aa72d4e5c04375ef55f619b3a446091c1ba1a3b5d9f05e538f +905a75b943ad017ff78ea6ddd1d28a45c7273ee1c2e5e3353685813793ead3370c09cabd903fcab9d8b1c6961372d486 +8147df4324faddc02fb0896367a7647b719b6499a361aecfdd3a34296fa6768ad31c34f9e873fd1e683386c44651883e +ac91d08570dd91f89d2e01dca67cdc83b640e20f073ea9f0734759c92182bb66c5d645f15ebd91ed705b66486ed2088d +ac6295ef2513bbea7ef4cdcf37d280300c34e63c4b9704663d55891a61bf5c91b04cc1d202a3a0a7c4520c30edc277c7 +b604be776a012095c0d4ebc77797dd8dec62a54c0559fb2185d7bac6b50d4e5fd471ac2d7f4523206d5d8178eabd9a87 +80ead68def272ce3f57951145e71ed6dc26da98e5825ef439af577c0c5de766d4e39207f205d5d21db903d89f37bbb02 +9950b4a830388c897158c7fe3921e2fe24beedc7c84e2024e8b92b9775f8f99593b54a86b8870ec5087734295ba06032 +b89ba714adabf94e658a7d14ac8fc197376a416841c2a80e1a6dde4f438d5f747d1fb90b39e8ea435c59d6ecda13dea1 +b0c78e7cc60bd05be46d48fbb0421a678c7f14b8d93730deb66fbe1647613b2c62b5075126d917047820c57fc3509cb9 +a860c4acc5444e9ae987e8c93cb9a5f17d954d63c060cc616f724e26bc73d2c54cd36e0492d1fde173847278e55942ba +8fb8269c9d5c15428e8d45da1251e4c4a4b600d47da0caea29fef246854d8fb6acae86a8e6440d0c429d8dd9c2dfee0c +96c5d8eb6fd5c525b348ee4335d200139e437e4be83690af0f35b7f336a7cda8c6d2958647988b84da9f2dd7bbb7710b +a7f62141c4346cc14e9823dc38ac7d587b0427022afc1498d12ee2c43f6ac3a82167057e670dd524b74137f8c3ceb56d +956aac50d06b46a3e94397f163f593f5010d366aa2d816c2205c7d0f47f90cf0f36c169e964f9bcf698d49182d47d91f +b812899bcdc0e70d79ca729cb01104bf60e1357b9085a10f64f3ba9865d57e9abd0a505a502d4de07afb46f4d266be2f +abce02c7e1372e25d40944dc9ece2904a8f59c8854c5f2875fe63ace8ce37d97881f4f9ab4f7bad070ec8e0daee58d3f +8fb13c515b2d6abb4e14ed753fad5cc36c3631dfe21a23d0f603aad719423dd5423157eefcbd9a9c6074e155b79eb38d +a9ef67304dc297ab5af778cf8afa849eeac27db4b6978963e97b95ef7a8d3264d0d07775f728c298a2b6daed2ecf5053 +a9b975520adb066e2ff2a4cde53284c23bc84261a22dc43b1634d99eff8e7892e46bb6e6da7319c9e72788aa9ea7a1ea +a6eaea4ab4206294474d9b956d9d3188d558a5633de2bd05df0d3bac03dbcbe4ed85406349c1d2e660b77c6da1f5bf8c +af4a19f77290dddee762e1e0d4bc9945aacea3f75756ae46cd3e58a8f74d1b5db73e4834687946b0f39191e32f2fed0c +aafa6523f58f1a4cabc924c86d842816d606afeea21fa4b2b8b9573425810fdcc41c98888318e868f9c05e2be12178a3 +8ef38fba0a3fa4ebe985239c8b759c22aaef0c57e6f39050a651c869487803b0d1e389c3d958fb5a7f37740f050ac69e +b07dfc9f85913c608ca7596a2e361f05e4853fad00e796fd492d247de6414892ce160f627669b1ba933b6ad726415d4e +94da679ad1d78b2bff5283c938f17b2a7d6e9cbcdf59d340e6dfb652951c7a9e852ac0590f99cfee9631b9410f6f00ea +98a907c9c021a5b034d3720197c160a82c4b7146cb73d48efeed99b9d0c6b831812cf80ac7e19e85a676a8cd3ead72de +adb746595466a12929019d0048cea33236b05c1229d2eba73b259a18a786f2bc3f05fc0598d8ce253cecb80bdf679aaf +a2fbac016996d68f9027a157b0a3f6a336144a798d6113adfcda3a5d05b62c31f108f112aa915906aef22b7f83b9228b +81841dea1904406d1b6fa49b4b3f7f6cb40b7646cf44d36c9fa07e3dee29f8e47324b40d8356ddf653109673c3374e9b +a3edbb8aac5e60c775775cbdb19067341b2e2530de48738e84c2c07151241ee31f0d8333bf20c2bc9dcb7b2e638a6b5e +b8aa6890e22964828787ce86460d3a32f12a655bb5c28de500f2fcf6b61e3334640ec6ba96029a4912af0d18df4b4139 +8ca43169f04243ad0fdb0152de17c60d9e31ee0ab520970fccd98590e05508821a183b4b367967e60d53c2c826ec5dbd +b179fffd9df8c00486c5a8b9327d599f5a11745ef564f06e126849b06fe2f99273c81f65bc941efb0debaadfecbfec1c +acf068f1c2b1926279cc82750ce21b0d6b0bfd0406f0d8bbfa959bd83935932957c7f6b8de318315bf0b75f6ee41a0f2 +b97831da260919c856e9f71a41687f5979bc16f8a53b1037285b4a2f9ce93af5cfe70bf0ad484744827fb55c847b58eb +aff50b0bd907383b0c241727af364fe084d021221bfb1b09fb6c1a7752eeba45d662493d590f1f182764b90b25f17906 +aeeef044c14e3ad41e1235c9e816e1eb49087fd3abe877b89b3bade74459186126e160bb569bcd77779e701b19b5f71a +8483deb2b7001ca7c438fcdca8ca6aba96c9cbc4becfd9b16a6062705eae270011bcaedcae69bb54630d8c78129e57c7 +aeee8d24be4ac0d9784c029e239fb5e64316ce29b88f47394cfaaa8bb966a72061bff72f99d02dc51c9705854686e77f +90ae09525a16bb2422169e15d6831c87968a14ebc0d1d27e11a759839c73c655b9d33ee5b12f275d6f440688146fbd2f +a3a41fc7fefef101422465e506bea7f3ff23c26fe35f5732b86f5f2471fb93b37ebc339f84c6be1e8d22abc812c2e212 +86f4b5293e8aea4af1f1fb05dcf99714cb3aff1cfc849b1bb73524061c921c9da9ad92579a852e1889da29d952f02fe5 +8932ef39d4050a1e9dc0fd8afeaf159472d71c5c27f458c69d2730836606ea56e19c8c4febf2535f930d3260e9bc7637 +86307b9f3696bb21c20e4558e30310389e7367803c353d437e9b696039a0ff054d9a4953b75237ab1d1dd6f71118c189 +96e57730e683ef5b550c91de18b19ac73879f3e26234297db68d28747ed0953beb0f3913cfb720c602720bf9330685d8 +b04a19ee70123782e47b238abde55baf60ac0c66292a998af0d14afc8bbeb1134e557b94cd17a020084631c09a0d3c02 +829abc8718be8139569fcb2c398962f38f4201114d30e2b2fb23566f8a27a5c380f5605cec543415202a12ed859e33f6 +a0744fa488c8fa92a722c5fc4ef5a47dfe824eccd87d26c8bab9c174cbb151d44b1b29082c48652f03d3177e5ec86001 +81d4035ae9fd28bdcd78b135cb54955d3b685a527319df6ee7e904b8e6d796f5f5a5f5035ee1de750c4cb6050e452b9e +b205e8c2ec24d7104fa0106c09ad34b5a912c1adef553fb718838dd627355993c2ec01055c11d00b2c75b68e9516d44b +b12d09da7968fa7394e449624fc7174d1d76c069ccb03e140d4d87a2d3f6d1f7b9cfc930f0c80becc673406ebe63f08e +b23752c158695da85048fdf38b395681cc0e8998630af8a9ed41efbda08c9964c2dc8ae6e53377264be4467d702c0de4 +b0d84582fd73628d96b8c1ec96197697c41a963542451a2ade0890af0d33c7161d0f18e1a1ce2c168ca2dc1e9119d55e +8b877e618b469aa187632e410b125d2999d5738fd66d482000706b51fd904a0c7e7daa8c9b729fa33817bbc4154cba2a +b1cfc8a7551b601723b937d497d01dec3ee7614c2bf13d430b1058d5ebc1406045009ff02c2ac15bf8cf16f860193d1e +b6d9da84f97b21e13175bbb0b5cc8e79e88b470c87a3e115726c1bd98e0288526c58f3faaa8aa170ace0cd6a60852525 +ad2e773c2d527671ca5fab7085dde4da31cd35f45d4315dd95d8893ff5fb900494dca08eccfc1a2fc7bf7c7fd2fcab97 +8d5a79b34aeb761d4a0c73f09f02e9548e6d382c33ee6887a759ab05762b490b8a549ef2933c7e3a46415c154c0221c0 +b6f2cbe81bd0a7298403be392f8456bed30aed7ef30216959357698f789affd2942ae5fbaf3f48ecebeb7c273b20cb57 +b5b6c45d99cea7ce6a1dc134aff4a8f630f299b42bd59592a7592345f8cd35bcbee944e61b0723de732fcad6e4425b63 +8077d64dfcb2418974e956ea6dbf8a4c05b25d2a025333ad7e2a379f1976dc036771403383a51bfa3476c9c619ef8bef +ad2e0a9d479c77a5fb73b3613a177fdaad50dcb50fed50e756ba18164c153af30b07fb2565e80ff7469f1b0338b7b5de +81017d1d80a6b6df4e99d0d7f85a8180b5523e8fa2ea2672fddff604933f8a113cab27fce098dcb454d7d1f7ed266e04 +852355479d68e76c7febf6dfe2ef8e80d575c0d3bd52c983803592021cfa898c571c0b884412c21e66f0dbfe03167b53 +98e1bf8ad48421467c93b9f72b47dded7c41b4fcd36ea55ca43ab24b0d0b876f5a731f422579b7167c7138fad2121266 +803369314abd5422019ed4b0ef652b4dbe97ef5a87b0ea373eec9628b64a12120b2c3d4eb53db405131ff786d14c7ac6 +adf2613fc34f73e1160975c140e925ed84d254e03cc3bc7fc1d19957b499c9ba9d9e4c1639981b594a7095c0a52c6757 +a2f6a68efdff6e4173c00692abcfdfcdaf6f8b62369afad3dafaae4f2f38c4860780b4624d185e20e4f4498b75b5fe94 +8b1658aa0e119fb8401d486ed08d60240d26a8623ef9788e3b45ad09ae31259395b021bd16be395139cbb7149714e764 +a7dd8bf21121285e00672ee8bb84e0cb39b2496fb53a26e35dfbca7f2b04e9a9ff9db15f53fe63fcbeafeb2deeaf2ca4 +b6d8d709e44bc18f3b41d69608edce60c02bcba48d3b7e2fd420842657f0665a7343246dea149a25e8f3416284abae66 +aaf744ca5e9bcb63e3e2939b7a1e96e4a93c88c76bec0cf4294dd7db95cdd3f6a7d92196e352d08680e2328bc4592899 +84434b015a7c398d35f1ec71fce455d62ba4ed4f62da042ec31bb2b4db47073314354cd50bc322297a1cfe35138bf490 +8d70b3a3cd9d5dfefdacfa418c0b775a112a47ce538d33a560a519660009c3f141fd6221c18539129e9c0acdaceeeb80 +b8c6903412a800ec78a4c15f31c24385a267b0c0ece32fd31bbbb557fd70c3b2d60d8fc0f90fbd70f43baa1928ea30ba +8e391dd445ea06cabb433f057853f8159511b2f9bef41aed9ccd14e0a6fcd912bbaebd38fd5fb736cfde0fa34b7a4874 +a40cd988f70613df32babbd1bbc2f1b29ff1ab0147b01161555a81d56c9621657999bcdb1df38485f687afc51d5d0f23 +b6a008b4426b3d7b28ae04eee4698fc8ef6a35d89008ef5394da39ce582ce1a45dcfae9a33b90f6fa4237f3667803873 +8987280debfb175c3b44a2f152ea82548e4f680966f1fcbee9bf7d714e31bf8080c33f52705ef3aeee70544b22516aba +a78a51a2c11eea7680a5a0ae417a2981f8c69c396e06da621eadd7510a3664ade49d065617bec67b3de779548a4f4509 +a4d9163f0a1bc048385e94d5e0bcafeee1b18f28eb23505623b9e8ef16f3df76408254dfbe790e45f2884198060d388d +83dcae2568a0c518793c0f6e38b42f9ceb50673d100b556a17ec8bd9faeec84afe50b8d72422c6b2356959667bb8e2de +874731941be4474b4576226e5906b5dee89fc9b56a9870dcc7289c1a7d494d345ba6aba31f7546a16f9963283c05f744 +82c1cfab1f501189ac20147fc4631075dbf1abf9125b7d42fcb4f31cf73f3d6461b1bd08fdf6e45cc54bc08a7d5d51d1 +b978228286f5d4a10ce027b6bea3021affcaa805340ca4b5192c69e8c56db59f48e4a14a284ec015f53baf97389f62b2 +af125f4fdccd1c1b64fdffecb5ec7cf8c7392bbe476e1b89a5b5329c5ba4a526e58c11e72ab9de8a38d60af648d75adc +8411a41ec14295acab0d36389013535a80dfff6e024bffeb32fb3070762f61256419e8c51b2ad6de9dbe4f1e8e286912 +8ea67a91112a41f9c65515cd496f4b0cdefa1400fc06568eef000c9eae6dc250fb7622eb3f2deca10b37287cd96fa463 +8da99b6c55c31dee6a49aabb54da249d348a31d4416201a10c45a3b04b11e99d4ae9813632f0ee36c523b5cca62f6f49 +8b44656341e039e2bd83a19c3bb9a88f6209482e274f8cd4f8557b728e5948dd80b5745f621b96f4562928689314e8c2 +a02d424a615ba0dce8ed91f477e79852215a3a39d025059826fa278e7eebef19824b2a2844f5b3865a0f471b609a23f5 +a1f115cebc3fff3bcf233da27cef19eae791660f155d088003460f75567a550bef0722885010ddc384acdeac635939dc +b61a55ce9d143c17876776e064b58a10baf0ba13553c785c1e47f57b5f94c0cda8bc89d43d73386e57816c15b61a8ec8 +b4073f47041e20a8e548c7fb00e07ba3b9056c34eb4ab63bb0e7b48f8e338e8b56a17611a1b5f4c03b352450b86f1d69 +a7b1a07b213205b682fc5b6acb7e76fdf97b280c26621d8f3b76b7c1deb3511957da33a4e358c8e8f3d98b2a8855d67e +b797e67c2670fbd9844e8a68c585f404b035dc14bd4ec75c3f95f932c777f9db5d5f5df7629164af488fc1213035cc5f +99618200797b945f595794d6468e5c618649554ad9ba896330f1cc844090eb956ae9fc23132912f9047085c5f0c3bf7b +81194aa1319abf534cb3927af9adfb178a99d0e3e8c99ab1105f1d3b4fed40ec2971caf1d6647acb0c8d681eca53097b +80673f18e4978dbc226a6cd4b128a1259d9a7f833879c6e2fbe24d69fef2c3c23a51a4f3e8d88fa4533434bbb0723661 +8125bf6c7dbb2fb63aaa3f53283559f172c788223674adbeb6d5bd17cfe888e6b87a79aec774917f20ce911c1f85f8e7 +884bcdb1878b14fc38adc9fb8b4dd0b3afde404fbeb664f26ddfebc81736018551f23e75ce4cfe4865f610bcd454fbd7 +aec65c8d4be8316e98aa54888af01bc6703a0c5d04b69756ff39a0a947b66817ec59d76afe9f61a25749b5e890f03e02 +aa457aaa1b014a4c5a8992847a187a23321bb43452c98745987d038e3b04046102ae859b7a8e980eea978a39d76a88ef +a9832ee63b08e19123f719bfe2fe742125f32463efa966c7709a98ebfc65277670e9ea1fa2d2d78b96bdc7523b0c4c3e +a87b6b1b7858f96d55064274f29fbde56067064962cf3c3e2ba3110b22ea633bc037a74d23543ce3307a46208855d74f +897cbe4ab68a753020fec732dfcc052c7ed9905342b5a6fe0aa25c631f9ad9b659e0ee75d46f0df6507b6720675ee28c +97c3b5f0d54c1fc45e79445c3ff30458959e406a069f5bbf7979d684195b4fa0406b87c1c008f4075bc9e602ed863152 +921e65d582ea9322ddfad1c855331c3cac81f53c700b96db5305a643c084eb6793094e07944bfd41dc02c3b3cf671530 +8f23ef1aca02a260a3b65d25b110f28d3bafca44727448c8f2d03c5e77eda620c1721b06681bd816ee6027664d76352a +946a89b132ec0795aea9ff9dde7b77e7feafffe6e4a2f093042a7e6c71cd6ab87ce0ca914a1b5fabad4e1f96a795f163 +a01e2de9db33df6511172123ad6f7c64074237471df646b32dd9aff8c15278e2723108e4facaedca97e9f49503f8c792 +99dcdcde45b2ea3f15279936feede5f7d3b63ca4972f335b0559c2fa6f9faabd8127aa892a36deb114357ca906553ed8 +a3f8af37bfcf66b04d1896a4bd5d343f4733d4c3305369ac7e75a08f20f2004c10c642d2c7577f4e5c4d1f2cd851ac3b +b7294d15a3d674a56099f97a1adc9e82c15e90832eaf1722df110fc2abc8634c51515e5ad8522015498a3753b1fa8c49 +b4f27f5062ba7a04ea0048b3025b5e3d5b5d319a9e80310c808a5fb4e8e77b38c10a0f3172cb805cadbcc8bc66d36ec7 +aefe5decee0ae2dc372cc6cf4217daf97c4c908d145f100f0daf1ccdfdf641c78432c2e473e7e4b77dcdf2d4c2bb05f0 +acc84af7648a535ffd218c0cc95c8f7b092418c548815f1bafc286b1fe14f6ccb51b2044db3bff864d0bb70e88604084 +84d8e3dac0df6a22beb03742e1d4af684f139f07e2ea0f7fb27fc2d7d4f1e89b5e89f71af32ff115ed5e6092133535f0 +8ada001e1a03a823c4c056f636e77adc0f9dc08689d28de0d99e0feecab5db13abf37b41ec268dbdb42c75419a046c68 +87dac6c798d1744dff81d8bc3e0e04f3c9bf260e811685ddb9a9a8d6eda73927439b344f9a818d2103fad633de5a4a17 +ad9929a7d8a7d5d5954e48281a87e5c84f67e19110d73296b9989a09c76767a57a8115629239ffb4d99dfdf9c52ef6d9 +81ac7cbeef8ec35a5c3b61cc887080c29e6cd3e08af37e45830d17400dbacfb374dd07bf370b979828c3875b2027d5c6 +97f92c9182953b7e10f7a1bbb6b5b5c40b8275eb5a6eec1e29874c4712814749aa8c409651380216e1ff01d7b8511041 +a09794d0bbe7db013045d3fd857c1544fe6231d21afa3495fa300371f6301a3a0f4b8ea175b281503dd06078ff371ae4 +839bb58d320aa08116dd387a57a2b9bd9efc89c4cdfd82d0e47a00cabe644631d09be5436bd485df3b61b75ddf81a3ef +b1cdaa344f783757e8b9c1f84421da3c5be4c69f019a8fd4c1aa5bf1a63e8970c99e35c22cf3b48a0e6738bc6ba7ce8d +92af68e3216c78998208fb24b5ba0e645d0d3f5e28222b805668d7e9cdd6c033d3b22fd6df4c2d745d7f910d133cd226 +87640a4ea4e605e2204e5232b29a6c1c31152d83547eef14122cb76a0da52b8653801af48455a3ed713b9dcfee7b1ef1 +8147e5bf0c8f4731155ca0517ef3fae5a32b4d5d2d98ed0007b23893d8dbb7f8a1199c50c1750c2fa7c9cebe594b1bb0 +a76b4473c63c3ab6103c729afd2482822e4150f3155af39983b0ff0766c71cb622455ce6304e23853661eaa322219d18 +b3e2f05ca551bc3adec0067e4034aaffd72e0b64ac18ae25452c996927976c6727966e26d213b032521889be2170800d +a8414cd14cb3be658e9e0004ce511ef7063439b1cbc3166a11de030613fde4b59caad4e91d426927863c55382afbf476 +b2f0f8ab99f4d0ea785ac84fdbc00b20217b1df59b30b51d9d209d489d53b69dd5d82cdacc16fd1dd15c3a4001595f50 +8b2025d5fd658c9bbed619f3e3f6ac8efe7aeff8aa9401bd66a7ceb0062c44b353608ca073f95be99204f0a913bb77eb +94a46bc5a87291b42024b2137e623c70115b9c6b196604106bfbfa20f3f56ac7779763f56b580190d3cb2f1c648cada1 +aca9355545118d0769cacf69c4b23d6d68d229cd8f68f1bc0c847c05569c5af6bbbd8c4dceb637b4a6b3b5c83841bf5e +b0731992cab87c7116406b283a84707a34838bfa3284b0f6082dfabeaf41c5ac2b0ddc1b420547a1b0955aee92de2dc0 +b671f77588c0f69f6830a5b28e7d07ed161b81fa9791bb3a24aae6638e3aa5e186df74978a82549c370c18ebee04d4f0 +b5621ed841780f3e6681d880a76cf519cdd20d35197b112eeaa686764d57b5dfa78ffe1a294b6bc76b6e3949cd2a2369 +afeba2524659d00caecf089645611553187a6ed7102050f6dd20f5a19bed08ac7065912d88371ee06242897d58d652a4 +b78bfb83d44ced14a20135804aba3f00128c3ce1f302e95567ce4097b0d973414153fb305b9f156882a5a0554bf25973 +98510aede95d26b1adf214053eae051ffaf24894e2fa37961a91d0ff5392dd09388196648d95b73e90bd88f2587cc4bf +b35c682d49c295946b9f120fbc47b95abd9ee86d294abb003a92139fb825b509209562575015856a270eb3eea86397a7 +b9641bf685571dd9c478dd2033a1f1b11cd3a662b26502c78595863b8e536a189674a9a85f7a253453ebfd1b99fbd841 +b2ad37036a59b1c9b8457972665720a6868422ed8157b6810a9c0783006103be34ab732d7aeb8629653edd18fd0f1717 +af0920cff05179a3896ea6ea322c39adf91ada5bc40fe3f6fb1b1b4e121e907c904bbaa8ca00468b3749f3da144d71f3 +8e269672818ef1e2f9e0c8aa65c84442fcd9151d74bb8e870cee8c0e3fe24526e1a5388b430cef47b67f79b4e4056bcc +aa29a16fe00ea3d143b1032b1dd26b8ce638f37f95c085c7e777e8e2784bd724bd5c38b1583c61a6ec7c451dd78fd3fb +87452b7435911cc5f513b0c81b15aa04972ecbe3d7bbd0a5d676c96a8a311301c0e07fac925c53a350b46fbd3d4d0fc1 +869a81c351096f47748e41566ae7b77a454b1cdfaa41d34a5742f80df38fbf5cbb08924b6fdff58e3b18f05c62bbbbb1 +8b7bc1b0486300981147a40a449ada9a41afc06d735cce8bf0fab3ee94ba2e2ea57b1397e3cd31bc295352beb8334ef7 +93e93fc41adb2df279d95654921b4c2edf0d293dab58d0afefb221f777349ef88d0985b3447e3b935954a81f1580a92c +970fa7cdca8324faf3e62348bb50d78f580b4f43f2e1c11bd8382d48d0074a3c55c6407203a0c9cb1c5f2163ba421ef4 +924983929e608d27e4a36d4ed919297869e3c64de51aca794d32d6e90aea546bf898d98ceca28a0b2187734821b78504 +8d395332529c703d943d68415d443332b5c1342ca9d9a59bfa8bd4ab63e93358c4b0dde6ce1f2e8ea9dc8f52ad7ebd95 +80200dda853e588256599e7f905add5d5ee7c74272780317694fbae39318ae9be05d5bcd7b20cf460069743f3d4ef240 +a287d51d6359c9ef7c7ac1b20e479ce7d0146dba5606397bd04b7a622cec642508d5b45d51b31de71f9763595b6ac88e +a320396c075175d6599225cf2e1de8c7cab549f6316c07feb0f6eaa21f06b2dd29ab14fbdf2af4543b4890ec0fd08a4d +b1e9fe230418d20368691058adcbbe30011bab3000422f0371015ff8bd09c60fb5fa85d18550d35b1c900977ca48f58b +9718fc26a51783b971744933f20490e9b5cd9162f86b84788c4c5217f5409e37b5a39d628b18e5b35a757acf67596321 +a0cf81fdb161f4f1b419c5e4caa36d4bdca2325f0cd25b119a30178016f171bd6fb88403e4e3aec026c4089f180d540e +8ab1e36bd04625ee794ef04c4dcb8e004d61aceb2b62438377f49ad95dcf025ba25eb799280004941e555bf7172af6fe +9257b9e3d14d37fc7efae49b0c68d36eaac546035f4a2654d566b3ce1b2c4564cbb03dc8ec66efceb768559a8a507a18 +945d1123b839637ab5154a1972c3c83a0ff34a3b1a3465de6ef0416b1950f649869a3ef88d7f1036648ee385265ce2df +81449639d708860fc0229c94f754f7262e8a3c7f67960ff12dfd15df95f57a9ffcee2013e81978b7703dd42bd5d0816f +a865481deaae5a690fd53892791e5fa729db283b75a525a11cdfee1ce17e8e7f0b449d25f20b3c1b43da128dbdf98a8b +98766812a65fcd25b853546e3bba618a3edc9fd61510e4f8ab60c038a7fa50d197abeec8776109df0f2119be9445ad00 +b1b8dd5379d903dc41d74e999b1ab693607a0d2905692f4fb96adf08f738e5d31f9d00df28ccb8b5856145ca552c3e3c +99d20be7b511bec78a8ed03c207aa4aa9097ba39d85e18f1b8d52f65431ab7e9a773c7b9ac3e8d8b25458bc91bd00703 +b1b7c3563fe8cb33c7d3e0b89d00bdd13e86452ff507c2e69db7b3af06f247f139155396e9b0278753310dc63940a10b +b3dc9c08451b1de7c9969b1e47574bffff50490f4a16c51e12390195d9e9c72f794790caf7b0a835d64e01fec995d3ac +aaaa4761a00022ede0809d7063d3532b7bfae90ff16f45e17a340ad4ebaa2fbac40728ccc5fbe36a67ab0e707566c5dc +8319a1903314eab01f5442d2aee6ae9c3f6edfda0d9a88b416d0f874d7d1d05d08bb482102f8ca70a4fa34836d0840c1 +932949a6e9edfec344932a74d4f81eec3667ece1e8b8ca840ce07ffd4b5d6d8f01657c764d64ac1b9190f876b136490e +904db1568128487e312fe629dd8bb920cecafd3bb9cad8b63e269ae0129f2f5c80cd82f0d81e7feca9835c3945a72d28 +a17280693d30dcd43c85de8f6b02d5f30cb9097274ad680cede1ef105c903615b4c40f3c6aaca478642de324972514e0 +8d5f76e093aee71d0cdeb017fdfcb13bd068039746de90690ce150a0bfdbe7ddc4d539df0f82c2d2890a40b191900594 +96fa1f2196a3883cdd73c66d28403cbbb58f6a939a3697ee0d308d8a076393cbb4be86255af986869230ee410c01bcfa +a8b74438dc5cabd70a91bf25601af915c4418d074327a9b01e0190c27d3922c89bb9b41e0b366e82e313edda8f21983d +ac9fdc1a9b2e3ff379eb2370979372e13c4177bf4574f1490fadf05a7073e6d61e703e2d8eed9ce984aba317d411e219 +a45a6c9b958169f2f8df70143e6ac3e2f6f969a4eed6fd9f1c620711bc2454739bb69f0094079464790c5429c0d8aedd +8901cbdd1009864386577842c1e3d37835fddf834064d9613b4559ea9aef3084204e1f863c4306f874141f4374f449ff +b6c582161691e3635536686825be9c4d7399d668a7675738417e0363e064dfd28acdbd8dbc9e34c1dab8a1990f1f0eba +89e89ddaf3cacc78428f3168549c161283ca8337345750667c98212717b21e7d994eae4e45bbddacc832a18df1d79276 +84be275627eed8e1a73c7af8a20cee1ef5cc568cfeea7ec323d7f91b44e9653e9aeed47c1896a8240b99dde545f0e1fa +a779a54ab4f40228f6e2539595fb8d509b70aab7c19e1928c1be69ec1dc19285c3898cf15e5f8b8bc725e13af177fe17 +92e2a49d2b9b36349d442283b17d46f8f9bf5932c34223015ce62d2f285e7363b2c12232be4a838b5b6cf08e694c094c +8b4e28c6f3f36caa2cfb82ba88066c830f8017bd35608b077143dff236f3181230166f5a5c02fa0e5272297331726aed +85fd77d46162ffac4b8adb25baff0eb0512a53a3d01638b3a376ea34702279ce21c8e7d8884308c03e00c9bcc1a9fd29 +aad5e46916ff1be29009b595d1d8fa160cc7aa01c7fbf3a68f445c87615790dcab1fcdbdceda533d182b6541f09f2f73 +948df7654726250dae393325addd3c0a20431c81f00470962190335ea4b6d9f7463d6f308cda46b92084c1f24390b1da +8f577474dea132676504376c5542b730b6604fe3d965eaa194659fd11c52233bd0b11ab62e198c0f442327ff1c00e501 +ae2f1001546db3e0c19700adad997cd9f765fe7a51a502cbcd9a2a07a3a5db79c8f603e05cf96d80b688cb6c9b6cd3ae +953b68e5d9561088dd20406ea7fb6894cba33868a38ace38fc30b5813140cb15dd6dd2171befae5b4df2e4a9658889d8 +86c52901655ff11419b084a04da8fc3596eae59d81d3461601c0baff59ba59e3d1dd0b7ce719e741a3e97c013e898579 +b9a72dd5eff73f9912a28b55de073568efb3eb0241a10b77a2bfd4f30c2aa4fbfe0c89eb345c9f07fb725660873cb515 +8e7353f5f2932e4ffd95811caf46c9bd1a53643c27eb41a4ebd211f230955cd71a8b27e17cfe8aa708d8514c0de67a66 +a096b8e66312a92fb10839ebe60189a8d1bd34dff55f7dfae85e4d2f53a1a4a88211c19fc84494f066358ddce82be131 +931c5cd82719d76596832b007969b5f75d65cffabb41b9dac7910300db677c1309abe77eeb9837a68c760bb72013b73a +8ba10f5118d778085122065b55dd1918fddb650cce7854d15a8f0da747da44d7b12d44fc29ad7dc38f174be803db74c6 +8c971deec679372a328587d91fd24ab91043e936ca709c333453d7afd43ee256d08c71cb89f0ab0e89ae119831df6d86 +a2ac28a58034fbd8fd518f409221bad0efec52670880f202e09c0530e2aabc2171ed95e99891790596ffad163d86c110 +b3354e3dfa8068aba4f3741152b9204baa4e342c1cc77e6dd1419cbaf8da1d118be605846b8609e997d6a62a11f3423a +a12ab65a213c9d95c24865fddc2dffe0cf9fc527dd6bcdacc1bd7271e79929a4ab3427a231f4f49d0530474e6cbc88f9 +90afd65b7e6973f8aafbe74da0f42441840d3c93bd69bc1bec8fa56824e7ca97ad1b427c8a85da7d588469bd4ccc50c3 +a09175940c59489bac3d3da3a4091270d9118948cbbdd57f2bcc63fbf45b8010651c801d3e58dccf42733ce1d6b446a3 +a843bbf286e3cecc1fe370ff1bcf5f1001bc2e95b34246625ff50d48ee62343e82fba2d25b8a4bd5f7b5ffe90920efa2 +a3c4d1003219157fdbee2707ce07afa6c2a64ae8e450182c307ed7f070024071f30b12c4b0032960ff913c74e73a9976 +b24af3f68d66f825d06fc3ff94fcccebe28b1a0d4ba29c48d3a3c953b9bf7ae6707f193fef25e2dcbd2b74e483c774f0 +b0f657f7723184ef7d7e4381143f1ac8020d8c6c6f2dcbebb0eaf9870d61a81f2d452596503311e46d1b38f625d4756b +b90091004fc8f6205c51bec68547ac82dba0f5525631e7632cf6efe54eecd9020729fbee6105d1b8012402d3b79c54aa +8e3fa187713c60eb0a416d6900a894cdf81e6b6b69dae0bb64f6287f3c3f030cfa85c665f7aace1eab4937f380b8f728 +879bf0784ccf6725c9cd1ea8c49fde31c91c605de1ea664a33c2ce24c277ee45d20b66309f98d989acb2ff3b77e13101 +af3f3a3ddc4e11abd627d5aef8adffa91c25df5f0c68b4d2b5d51e7d9af3395ba4f6f7ae2325a6672847e1ecc6cad628 +973e667289e796d3a40f072e6fea575a9b371a9997cf8961677f8dd934619ddc47c1a3efe91bae9ef95acb11a8fe6d09 +afa81c5606de82f46b93f4bb6db3fc0670f4e0d1091388b138a66b3827322d95a56168c951c30831d59eeadc227500bd +b83eff77db5b4c18574662942eb36f6261c59f655f8a9c3d3731412d0f257c8e80aacc995c4b2303058a1ba32522a434 +912e5ac9234b9445be8260393ff08e4859a7a385e800b74d1534eeb971f58f74cfb518dfdb89f8705d89fbf721439129 +ab27c8ece4a51d23e22c2e22efa43487c941139b37ea1182e96efb54ca4809d8245eae0ebe8ba94f0ed4457896fe11b1 +a6630585d104a745bc79dba266d9292bbdad346449c8ee8140a5e6e8a6194411df9cdbf3d3ef83468a536d4f052e9335 +8b8c128244da48e7fec641a882d0005a2d05c7138d86a293e6a0a97c76bf632b44767d0ce44663c975e7f9f9679e25e3 +87dbcaca67351a4e7d2297d7cdba4796d12f58857e7ee4abd0645563577ff33544a44cd84e50b3a3b420d6998de9b57c +b859ba43df259d7f8e7fac70bfd7aae546d57a5dc90e107b174a95bf7fd3cf00f740c4434848e69b2a7e6061f66c1ef1 +99d6e20978fefc40c6d310187eb2ad3a39296f189ee122ed64d74f81033c3069d44f7a9d3988a1df635b609603a17272 +99a5ddf3420cc0c92b21f71a805245608d4995ead447d8f73a670d26d33e26920d5f07bfe1f6230bd5f15978055b4253 +b936ac0944d3c5e4b494f48f158000abb37b80b5c763f77fe856398c664b0f1ddbcc0a9a2a672db9278f08b4bafbe2ec +b4af85fbf4040e35a686dd016adec037c99b47cc2e4dfccaf7870ee9e8c97bff30f3035992def2a9d4af323c0b3af8ae +a5ee32b8bd5f8fa9000da4da0bf00565659a43285393d37080b555d0166bde64d87317b2eab2d48a0e7b287caa989be2 +894d4ad58ecb1c9ebc4f5a97407082e56cb7358d7a881ba7da72321c5027498454f2c7fa2bd5f67a4b11d38c7f14344a +965be9eeaa0d450dacc1b1cc2fbf0d5d4b0dd188f2c89aaa9260e7307a2a1eb22db6092fccb662269e9a1abfc547cabb +805893c424aec206260c1c2d2509d2cb9e67ee528bd5179a8417a667aa216a3f318ed118b50d28da18e36c01f0805e3f +972d7040d4963b35260ef0cc37cd01746f1a2a87cedc0dc7b0ee7e838c9e4573784ea743f563b5267eb3905d4fa961ba +8c7156991d4c2e561888feaecf501f721b4174e7d14109e9deeac5a9d748301c07e11fb2b04b09799f0d34ff42cb77d1 +894722ac35af3d507e81d737d21e16c5ba04686f8f004aa75934aae5e17acd3e065b96e229eb011c2f34096f4c62048b +81237937c247c88e8e31e2c72412189fe59c1daf65c5513489d86cf29ee922c0bb08e5f7890f09f4ada7e5262083d266 +8cf62cda2fe0d9a6b42aa2a1c483f4ad26378c7cc2c2d1510a76df7560b07dba8528b33aaacb15f7f20b9d4c7c9f61f6 +aaf0921fb3e1920eee5d0acb59dcc268b42f4b435d60d25d30357edd7dd758d035919691bd15311d85489dfa2e5ee696 +92cec07be2247ef42002ebcaf65ec855611b8e893a5675796f2225f55412201b0bf9f4761924d0c8377b9f131e09e39f +8e514a62ac1e91773d99588415426c97ad63e917c10d762fe06ace5277a5c3bf3730e4b9e5d116f8493b9ab8687b70e3 +83932df2d923a5052468a3ea87f7b55c6a80ede3594046ee4fe233046570921822bc16555b92ba6aeabaef9b1dc0805a +a2b5bfb249de3472113fd3f35bfabf3c21d5609da62a27ea6aab5f309c9068d94bc58ba03efb4ec11be06306d59e60e8 +8106cf3ebe6f0507be8c6e8d137987315fe3689ecb75bb27980f36ba5efac504baccea0e7603549b6d126beccc278804 +a73ee70b6fe8c082443972102c453fc0e386852476cf22224fc0bfe554735c12f96037fbf10922795f4502c4f052b5f4 +932b27e175440169958504f3ed6400e7d6dcd5e716c19dcd0f15c56c04503ed133d5a993e111c016f141e32d68b29886 +96f7ce4595318e0b4a6b368f788ff82226aac676aed4ace343867f751de414453a9aaaabef6e6224ce5aedc3d5cf77c4 +a950c1e3bc9a14484997013d44d876374b939af437ae7c821c131fb886063ee9fe7214a25a0c7084f0b07b99412eff75 +a9dba3886ed6855303106a1bdd26010f294218684e1c178afcfea3f37a2f04fd01724a31d82de3449046617e3507a115 +87a2f776b32a6b550cf3ceeaf78db02819be74968d228b1d14e0d74a1cdf994bb500b7abef6619455e98d728701fac5c +8cd887b07e335edc0b27e6a660cebb64d210741395be431d79d570139687b056557159407459799a8197b6079644f666 +b81a61fce00588909c13a90c1caa150f15788786af443ff60ce654b57147601f7e70b95659e01f470334a220b547611b +8aebc51141544c5f3d3b99422250424b9800031a8fdfbf22c430907a3a446fecaa2392105d66d64b1c8e847240da4a6a +90db7dc12baa02f3f86d3edadf9434e2b9318d4f6f0eca08276b765dbb38d8eb0d08be2fe70adf2bf16ceda5db08d3ca +aa1839894152d548cc6ad963de20fb6fcc843bc9af2a2bf967c63626b8ad19e900894d6106265f38f3afccca317c22f0 +848e27b741496988a582515c0c8847b2bfc6a001259396cdeea1e1b1d2828ca3a626693a1bf4adf3a3d7f8b1fa3d75fe +a0aa11754d4ee136ac3ca609b17bcae77758763b2016544ca7921dddedd8aafcc7ad5f2b337c8bf53084eb8e43ea41fb +b8713b7aa1c112178195fdcc9b7024f46e6bc04c4e76c41abe620aa265287809200d98eaed6c9703fa97e81d6964f0ec +8605b5b33309e9ea6823542b85383c496794b8481c577497aaf99ba90496e794dce405be615bf92c7b6361460e6b82e3 +826fa34faa7f83e063a7bf172addfc07badabada59cfc6604fdf481d29085251c0a67a1355b2cbd374e2975934b84cb6 +b45d131082dc16fa53af010d43eefb79200dc23d2f3ee26af95ac6a5cebc49c84a9ed293e534ed16ff3ef9a4a25456ec +91bd6ce3c5396a7a0de489e49f0cdf6dce1cd2d0be7a410326423c3185bd1125ce1e610768be7f15f4e44b62f8834fc3 +903ffbe3d33fbf106c01c727dc3a385201a67ded70d4df623934882f69a3a96c909b027a124f3d70cb072b0046a149e8 +b405359db9d9ef4821a181b440ef2918c240595141d861d19a85867a5afa74d2972d22c988775eab441e734700bae4a3 +8abb756d027233c83751910a832b0ef4d28d100077f1c5d656720c94906f91d85dd0ea94b1cc0ed95b692efee14c786e +a78ee77ab476a41a3454160ba7ca4085d8b1f7057c63e76db8b07cf20afdeddd2250cd00771a6329133bb4ad48ccc20a +a41810271d8c37197aa9b3dfcefe3498e42f5978d3f3d59defff4676d6402d8575b40683834f184f143b6cfbfc859b3a +90c24a0750242660bcc6d487358a3cc015730538a0a8beb00ad5ac2ef33cb8ca8a62121e50bec8f3d2f43900f8e3134a +8b96c39695d864ef5796941754978a1fd612b369f6b77fe5ae6587beac936ee28190af8f0a3822b63060af35e49a5c8b +acde2548883d0e63c0fc257bb9dadd919aba60a985b69ebcfa1bca78acca42fc1322ec30bcc8e7c188818f858d04ad33 +895c86ae9ff8d95f2707d4838a3bc8ddb05b2611f0476f014b9c150d0e8332bc73285037a747426f09ac8179ba4e19fc +821761fe406e18bd86fa9ca9db99d382cd3b5c70c456f471fa3706d57763d147706304c75d54f51ce8f3115aa26e59d9 +a803a80e3e8f47dc3c59ea23eafdec017458eac648b360cd42cbd075e0dde6f6f450b48c7646fb1e178c04f82ae51a12 +91f40e1b6f588bd592829ce937996452c40be0fd6c43793c607866701ac6a8c7227e0891d45c6e7b1599382b0a3fbdbb +9408246d996a634a58689337f2526dfb3ba9ffef1d3ff91c32aa8cbbed900861ef25d6477308b67d76491edfcc70d65e +a492325a427f3df1c9c690c5b553daa8ac41f62f5ae55f425539222bacf959e2f67afabbba1732e120d3e7a6dcdf7049 +8fd0c3e15477cae228613a171b6e9ec29ddc63ef74854d99b638adeffe39f89f34346a42851e8445e855a9f2bbef0f57 +b735ed01fafa051004dbaad5e8c9e2faca8f6049ef9b590f256ea4d75b04594af12764ad4e6031735eae36f83179db93 +a7d35f43fca06c86b3425dcb68a87186834ba9740664fd657915771beca4cdc0fa2fc9b4c2e9d9bdad8ec33543ddfa59 +a1156e71e2db1b17df5da28747c88e091bd687bfee59d89096437ab4dc9a543fe5c5272d5023d72adbaab397a6fc94d1 +ab06a58bd81b33a411bade8d8c5232d38fadc2e38507159edea6e2e104b8ebd65ca02b05335118f691d44197b847a4dd +848b67a10f1e6ff8f5c228f226ef2ffeb67fb8f50925fc94cbb588d61896d9dc79726959e649898fd3354fe3ff7b7ee3 +aa933397361f32b388edcf832f0db172a38e756b34d5f7a4a050fa7325058006c22cede26ee27917e8f1b0f301792bd7 +89e49e7f02cfaae4a4b9c4180c9f6559d76e3a45774955859d4147970b1470dac37bdc9aedca1c32a20b045049161590 +adc1825d5ab94fc719f25d8c9773f4d518134ed88eb13ac33cb910b2be3523ef9ef88d9e4aea2418b806e20108317bf6 +96c4b444c8a023da644f3a343ebeeed19a8392d2ce175992461451c318a54273b76c3574d8f2dceda2947ddd34d1a674 +8aa7e97e87c8c5b29bbd51a6d30396a6be1fb82b716ef83800f2c36d5b85467ade7e0f59d2db82c310fa92a9265f0b03 +9146c32d99f02c3a6f764dcd9b4807f1585f528ac69dc4f84e4380f6fda4f9d5057c375671d51e7aca2b2b4140e83da0 +a10760a533d9bc57536bcaf65f080302086aa50225437efd64e176841544711828c23a15c49c0dd1f357d3f10722ab72 +acb0811777e17f7ae7aaba5f6fce81b759c067a4908730916195a2505c7450d0e6e2194c2ef0f241090597d58e70de47 +b24f161e9bcdbad56665e2490b5e4c7768390d4668cd69a04ed74739062dbe832636dd33cda89e9b0afa8c77e93fc641 +96b4d01106b831868a88ef016500ef2fa42d0ce87a37ca8ca4194a92a22c113edfe04eb2ca037329f3c1acc635148f55 +aebbb95fb4f7adcc8e7a217aeb73f9e037cbb873d08c1cd9d68c6c6834511adf1af8b44567fee84327599bdcb734dedb +a9bd8b17300532fb94d028659bcafbe7bbdf32f8945baf5db4cfaa1bac09e57c94cad0ba046b4514044b8fe81ea8596d +a5557cbda599857c512533e7cadcf27bf8444daa0602aa7499cafc1cf1cf21f9d16429915db7485f0e9a1b5046cf01c5 +8810307c40bc661c478a9747ebf2a30e5a5ead942d1ac0418db36ba5db0709c476f7d19685cabe6959e33ec1f3bff914 +8829b741f41f2c32e10b252d9338deb486dba2f23996a44cf1dd888ad967a589d51329be34d764139f372a1043f6c2e5 +a6b4728d18857c5fa082fa67bfb3b1d801e76b251b1e211a19c87cea5fe7ce757f943c85071f7a03a718388cd5690e95 +86da7f397e2533cd487f962ae58e87bea2cd50af70ef2df9ea0f29f70b5843cde664d30ec207ab84fc817f3851277e02 +8085776ef4ac6d42ab85b9d9135ecc6380720efd274f966544eeedf4684028197de76ecab919fa5414302597e1962bca +b05a065c733033d223ba13d16baa7a97bd8c8b8b1f0e59a9bdd36ee17e9922d48eb39bd180c168b122088a77f0bf321a +a89343fe44a93023dcc7ef71bd3bcb6786f68e1885ad260edc56a52445d34757f476395ba7ad35437f89bc573c7618dc +a114a9cd6105b524f3969c69faa2e09afe21753a93361a296f9e0e3b4e3e63726ddf2e6bfd3ddc046043e50bd44e539e +8a5611fec539cf681c05636bb580f29acc06f628bb012649ffa41ea6c1521194a5643d5dd843f09b6eb2c3bdb4d41acd +ade247c4011ec73ec90b72f35afa59a999e64ba5a7e664a4b30874fea53ba6a14a76a41b58a5f891a20d019e5f091bdb +905b5d96df388160ade1ffe210d0c6d1979081bc3de3b8d93ac0d677cc2fc2dc1ef6dcd49d3947055514292a3fa2932e +a9520796ca9fccd11b7524d866507f731f0f88976f0de04286e68d7cf6dbd192d0d269f0cd60fd3d34011a9fe9e144c2 +989a1edf4d7dae811eb57a865c8e64297837ffeeaae6ee6ac3af0f1044f023f1ca552bf00f1642491f0f0f20e820632e +879c8e63713f4935ed6e020559e140ea3073ced79d3096c152c430141272117b4fd9a9fc3eef012e81262df02ea14bd7 +95074738ac1540c0312274333acd1ecad9c5509fee883c4d9295fa8d8200f6e637c363de395f9fa612f05c0dc58fae88 +a770e4fc595269eb806b113ab3187ea75c8f96b57bf9fcfaf535f3eedc1d4d7e6285a20990575de0ff09f62d06ed0692 +81283e5dfb6423439ff513eca1cc316941d196df8da2d1069d2d0b63f5289e630af2fd4119bc0144c002d33313372dab +abd1b108e743887b78f698f2aba9d5492f87a22868d1351d705d93a1084fd45be67170c68a6e18b07f400d9a01cda8c2 +8509c3f67b92908cea8144f4e2a71631a66a61ac3547601c788907e52e380e5fe8ae4110aed95d13c67d3bcdd5b55a61 +8fa5a790ec5cce6d4114128c295390120869aac5490a82feebd3c37a167120df2e7fdfaf2a4050a7dfebf48fb093212f +944753e1ea7d8bc727d46a7702077dc01dc0c6574e8263a16579b57ee155ca5901f71bb347a01a9a922b329d3ff75135 +b46bc1fd4590b7a6275e20036d247c5909fc549c78e95b64ae7ed96e3b05bb044840f19f7650ebfe7008ba09fa83c3c9 +b1e47e4d88e59a06c465348c6cc4181d40f45b91e5e883966d370c26622c328415c6144aa2f61ddb88ec752482c550ca +8bd4f8e293e3f1815c7e67167618fb3b0ea76424bc0985908957cfcede36109378e41b4d89555b8c2541b4c447e00461 +a70589a867b2bfb63d0106083d58475d506637148549ed35c83f14e5c8de996e1b1f3447ecc80cf5cd134ef4db9d2fb6 +8048b80ba6131d07370162724127b0f7cb17fa7f71855e55e5a75bd0a9e4fd71b0d0ea2d16ec98858e458528df8d06b5 +97326cb94bae7530f4ec3235770c5a7ba042759e789d91c31fedbd979e3c0e6a2c69e2af3c1979c6fe0094274dbd53ce +a18e9c1d3eabd62af4e31a4b8e08494f4167fd4598c95d0123f39c46c53f9e93f76615900246e81a286c782ac37c569f +80309c59d4522b15aba617cd3c6238663e8b1c7ad84456346082c8f281140fc0edf9caa19de411c7e7fb809ca4fa3f4d +8e450c0990e2f65923f252311623038899eeff7b5c2da85b3a224e0ef7132588b291b782d53c477ecb70f34501466178 +87843f96f41484e254e754c681a65681b9ae5c96c292140368743df9e60f7e2ada58ca2bb95fa39abe064b2ebf21eeba +858e8d5bf2a1cf26d8af5036b28b831d450a446026f58a1734b696c18f1f41482796b91cab0e5b443dd2f0b9cffa52b4 +99627dd6bad8c05c5904cd23aa667d664da846496dbbb8452705c4ec01e1480e9c7295504a5a8529e4a0c842306b038d +b64b33256c18b2c886a837a0c0730fdfe73befb0e2796207c4dc592c5a33cd51f8c2ef47c584dd5773abf9ce9c1b0082 +944f6da2a1546f0bfc4d98c3e73c79e935e33d208b6be26b0b5f8df6d0e3b74a5bda649853b99281bd3a3ec799a7dd04 +a266d165435784d4e884640155e35b2a911b3f89e1e715986de419b166a36a341ba724877d80583fa3da566f6a828971 +adff2698409d0756e78c534032ee926560c13d578cb178d5073172d049ebbce32a92692f7e2033ec781b9b0d894ddce0 +a91933f110756c699c28bf9e24fd405bf432002a28c4349e0ca995528e56a5a2d101b8d78afa90a178ff1a9bf2ba515c +8e77839c0eb4da2d01e4053912cd823eddffbdc6b9c42199fba707ca6ab49fc324288b57be959fbfb11d59085d49324a +aa124517c76692036c737e987f27c2660514e12a953e63ff4bcb269dd18fc44dae95e282de8444bed09639ef6577af88 +b285deae99688f1bd80f338772472fa2b35e68887c7eb52c4ef30fc733812444c5cd110050275ad999d5a9b57f782911 +8877b0fa85b44ef31f50bdb70b879fa6df5eb1940e2b304fd0c8f08abb65f3118fa3d97ff93919038c1e452fb1160334 +8a89f3b50dcbca655024542ca7d93df17deff5c7d01c7da2bdb69e76b3e0b4490d85c800fb3debb4b0b4d20c9527f7ad +b7e5dbe36e985354ac2f4ab7730fea01b850af00767a6c4d8ee72e884d0fe539bb81f2e34638fcf5d07b7c8d605f4c06 +a85a1d78f6d4f9d5d83ec0f2a426708342d4e4a5d15625554e8452f6a843d9aa4db0c7e68caebdaf767c5b3a6a6b2124 +a518078a9dac63c5bf511b21ed8e50d1ccede27ebfe9d240937be813f5ee56aef93dc3bf7c08606be1e6172f13f352ce +91144eedebda4d1ad801654ef4ecd46683489b177ba1de7259f7dd8242c8c1700e15938e06c5d29aa69f4660564209a0 +a16c4657bc29d1d3271f507847b5a4f6401cee4ad35583ad6b7a68e6c2b9b462d77b5dd359fd88ea91ce93bb99130173 +85b855778f4b506880a2833b8468871c700440a87112fa6a83fd3ddb7e294b3a232d045dc37dfc7100b36f910d93c2ae +8d86bb149d31bfbf1fabcae1b8183d19087fd601c3826a72a95d2f9cedb8bb0203d1136a754aa2dd61f84b7f515acfa9 +acfe7264eee24e14e9f95251cbcfdd7e7f7112955a1972058444df3c2d2a1070627baefada3574ebd39600f7f2ea7595 +906bd14ecca20ac4ae44bff77cc94eb5a4ecc61eba130de9838e066e8766ed3b58705f32c650e1e222b3100691b3806b +8f2cbc7b8593c4be941dd01b80dc406fe9dfdf813ef87df911763f644f6309d659ea9e3830ff9155e21b195fc3c01c57 +a68eb15ed78fae0060c6d20852db78f31bebb59d4ddc3c5bdd9a38dbe4efa99141b311473033ff8f8ea23af219bc8125 +a95cb76c9d23fc478c7e8a73161f2ff409c1e28a2624c7d5e026e3cee9e488f22225a0c5907264545a73e83260e3a4ec +b76f90e55fa37c9e2732fd6eba890dd9f1958c1a3e990bd0ce26055e22fe422d6f0bcc57a8a9890585717f0479180905 +b80cc95f365fabd9602ec370ca67aa4fb1219a46e44adf039d63c432e786835bb6b80756b38f80d0864ecb80e4acb453 +b753c86c82d98a5b04e89de8d005f513f5ea5ea5cf281a561d881ed9ad9d9a4be5febb6438e0dba3d377a7509d839df0 +a664733f3b902fac4d1a65ea0d479bb2b54a4f0e2140ed258570da2e5907746e2ac173ace9120d8de4a5e29657ae6e05 +9479722da1a53446e2559bb0e70c4e5bf3f86c0ce478eede6f686db23be97fcd496f00a9e174ceb89ab27f80621f9b80 +b707fd21b75a8d244d8d578f3302d1b32bb2d09f2bd5247dff638d8b8b678c87d4feab83fe275c5553720a059d403836 +93214c16831c6e1d6e5a1266f09f435bbed5030c3c4c96794b38d4a70871782002e558d960778e4465b1ff296ffedad8 +8648f84e18eb63dad624e5fa0e7a28af2ee6d47c28f191be0918c412bf24b5460c04bf2b7a127c472914a0741843f78b +b67f61e75d6b773a6b58b847d87084b94f3cdac3daa7bef75c2238903a84250355a986b158ff96ba276ca13a6035fdd6 +ae9b094b7b5359ee4239d0858d3755a51aba19fce8ad82b0936cca48017523319c3309409ea6e9883a41bece2077e4d8 +8d1d8e1fba8cebd7a0e1effea785a35e16b1a10842f43e2b161d75add11eccf8f942d2ae91c20eef6c1a0c813731ea9a +b82bd387458e3603782d5e2dec32ae03890a3fc156d7138d953f98eff4200de27c224f626e3648e80cd3dfc684c4790f +a6dd02a89ad1c84e25e91176c26355e21a01b126c1df4d22546159dab9d502dbc69bc0d793a017c1456516e4aa5fa53f +a9ab74a5c5459b8500beb0ad13e9cfe2656e966dc9b4f3f98bec7588023b4ddebf74e4fc722d30423f639f4ee1b2587f +b03e5f33ab7ecec12cbc547038d3fa4f7ea0437e571891c39660c38d148212d191be29e04eb2dc001b674219b7a15a9c +925df4fc6e898ca55090ad1a8f756cc5014167a042affda5b24896eeb6aac408545134920586a8e1a2b997de9758b78a +98c8580fb56ed329fad9665bdf5b1676934ddfb701a339cc52c2c051e006f8202e1b2b0f5de01127c2cacf3b84deb384 +afc3765d374c60fac209abd976fe2c6f03ce5cc5c392f664bb8fac01be6d5a6e6251ac5fb54cfcd73e3b2db6af587cbb +8e7e98fb5a0b5b50d1a64a411f216c6738baaca97e06d1eba1c561e5c52809b9dab1da9f378b5f7d56a01af077e4f8cf +b724bf90309651afb2c5babaa62dc6eac2b8a565701520fe0508cee937f4f7b6f483fc164b15d4be4e29414ce5d3c7d4 +9665160e7bf73c94f956ecb8ba8c46fe43ae55c354ce36da40ccc7594beae21d48d9c34d1af15228c42d062a84353a0c +8600ab3aa86b408ee6e477c55572573ed8cfb23689bbdadf9fccb00161b921ec66427d9988763a7009b823fa79f8a187 +b0d8d19fd1022e7bc628d456b9bd1a2584dce504eb0bf0802bdb1abd7a069abbeeccdb97ce688f3f84a229342dbc1c33 +8f447d5e5a65bb4b717d6939cbd06485b1d9870fe43d12f2da93ca3bb636133a96e49f46d2658b6c59f0436d4eede857 +b94e327d408d8553a54e263f6daa5f150f9067364ded7406dcb5c32db3c2dffd81d466ee65378db78d1c90bc20b08ab3 +b58c02781b74ef6f57f9d0714a96161d6bfa04aa758473fb4d67cc02094cd0c0f29d0527c37679a62b98771420cf638b +8cfa0a687ea51561713e928271c43324b938aa11bb90f7ffaa0e4a779b3e98899f2af59364ce67b73a46a88748c76efa +95d6d39c814c5362df69116558d81ce6f1c65fb400fc62de037f670d85f23f392c1451d43341c59bc342bc31842c8582 +af888b384c52d9e04e4db6c4e507c2037eb5857e9bcc33acf84fc3a02d93cbde8cce32141fce9f5fec715b5f24d56356 +a7822bbc3c236fd58bd978f0fc15fe0b60933a0c953db6436a233441219418090ae0c07c490a6548e319029771cdaba7 +8c53729f750922e5eb461774be8851a3f40fe42eed170881cc8024d590bf0a161d861f5c967144d15cdcdc3dc6b5cf88 +a052a25a4aeab0d5bb79bc92a6ae14b5ad07d1baca73f4f6684ccecfc7ea69bc21eadeb9510452fdba116c0502dd698f +923946b83d37f60555dbac99f141f5a232728c6eb819a37e568c8c6e4d9e97a4229fb75d1de7e9d81f3356f69e6d36f1 +8cab82cf7e415b64a63bd272fe514d8b1fa03ba29852ec8ef04e9c73d02a2b0d12092a8937756fdec02d27c8080fb125 +b1123314852495e8d2789260e7b3c6f3e38cb068a47bdf54ed05f963258d8bcabaa36ccbea095ba008e07a2678ec85a7 +a685b779514961e2652155af805996ceb15fb45c7af89c5896f161cac18e07b78c9776047c95b196362c9ad5430bcb22 +b734dd88f6cc6329c1cb0316c08ade03369a11dc33191086c6a177cf24540c7ceee8199b7afa86c344d78d513f828e81 +b0bf492fb136ecdb602c37636ed4deef44560ab752c0af5080a79c9f76a1f954eba60a0bf6ba8bd7b8cac21848c29741 +a5c74682323e85ac20f912ab9c1d6e1b9246c4c829dca40c8a7d58ec07ea0ad3524be30623f351269552f49b65a1245c +837403b9cf830fb33ecc11a7c8433e07745973c36acdeb3fc9ea8f7d8d690d462e1250b7410f79f2f4180fe8f3962a4f +b03d64b944d49c83608f2c5b9c14070c025f7568c4c33d4eeb1da31d07f0bc5897e498b35b50d557ee129f0c3c68e254 +827272aab8bf757e2483156e00fbebe1093a58070dd3af9855bbf946c7abfb9c8a850a6a8acda8c620902f391f968b8f +84c4eb863a865282d321302d06b362f8bd11c2bb0090f90ebffedd3eb3e7af704cff00d39a6d48cbea4262942e95200b +b044eb91653dc55dce75c8d636308a5a0dae1298de4382d318e934140a21ca90e8a210e06fdf93aadbbeab1c2ef3904a +a8c08955a4378522e09a351ecb21b54025a90f2936b974068e80862803e7da2b5380c4b83b4b4aad0409df8d6c8cc0cb +a763a5fb32bd6cb7d7c6199041f429782deacac22b6a8467077fab68824dd69343ebca63a11004c637b9cb3129dbf493 +8c44c8afa9a623f05c2e2aba12e381abdb6753bb494da81f238452f24c758c0a0d517982f3999d2537b7279d381625ed +8613f47fda577cd3bda7c99b80cf4b2dd40699edfd3df78acb5e456dd41fd0773bc8da6c5e8cbf726a519b9fb7646ccc +b21a30d49d7e1c52068482b837a4475568d0923d38e813cea429c1000b5f79b8905b08f6db237e2eccf7ef3e29848162 +b9bdf4915f3fbb8d84cdfd0deedf2c9dc5b14f52bf299ef5dca2f816988e66322df078da2c54b934b69728fd3bef40b5 +993b45f389f55eba8e5ba1042d9a87242c383a066cbf19bc871b090abe04de9ff6c1438cb091875d21b8c10fac51db58 +a85a95d14633d52d499727f3939979a498c154fd7ebb444b08f637b32c1caf5cca5e933a2f5d94f26851ae162707b77d +b9874c7c4be1c88a9646e0c2f467cd76bc21765b5ab85d551305f5ec0b4419e39d90703d4ac1bb01feb3b160517e97b7 +ad6771177fc78812904c90594712956357de1533a07fec3082ba707f19c5866596d624efc3e11773b3100547d8f6c202 +a79f31921134f7197f79c43a4b5d5b86736a8d3ad5af1bdf4ad8789c2bfe1c905199c5e9f21e9f446247224f82b334f8 +a7f1b6c45321222a350a86543162c6e4e3d2a7c2dce41aeb94c42c02418f0892dbd70c31700245d78c4d125163b2cd5e +92abafe3ec9dbe55c193fb69042500067eb8f776e9bf0f1cb5ab8eb12e3d34986d1204136856fb115c12784c3b8dea6e +89bc761238a4d989006ca5af5303c910c584fe7e6f22aa9f65f0718a1bc171e452c43695e9f5a591725e870770c0eceb +aa0e44c2b006a27d35e8087779411ba2f9f1966a0f5646ff6871bcf63a8b1a4a7638751b94c9b9798ccd491c940bc53f +8736fe82862b8106e7fdab7b5a964d87ec291a74b8eb1cb5a6c046a648c1b686064ef3d52297043b8940bfe870c712f8 +956a3def1942f05144d8e9c3a82fd2d3610064b53b9eefde3d5594a8f705bf8f6849eb2c22181796beffeba43cc74ee4 +af27416d00cf97d5a1f4a1b6b51c010884cceca294f1151c3b684a3f83c3c8a3c30771df1166d833cbddf6c873c400c3 +aac3b8dca2336fc4ffc63c362df461289e4bbd3418c621bde6c581d3ecedf66e2b3e523d4db39e3d8ba014577bf85efd +94c3a8167f62074e5b28c2bffe4b6ce645439a9a0c5da3ca1b3ee956590a465d6f84a8a4dbbe9070ffbd6bbc734e4d62 +95e23ba6986d25ed4451215da05bd72c5491528271726d79a94c8cb16aef1c85b190d6c5b8a3a1191c7cafbab1dccf0c +953e3dadb5ad68f7de31ac09692948655d174fe16d88b96930ef35b331da7f1dbc4c17863cd07b4ec3135b5205891a27 +915d018f18b5d63cb3301c2bb5c6e85e75a88ba80663c964d06575b6bacbbe59139d030b218ce0998271d5b28c00b26d +8c871ba3dd138a908b2f7effeea0e71df096b23e0dd47cab10b9762b250abfd1221da94a8ee884e05bdf02271fb85a04 +96bad5c6ebc3080ecbe337409ae398bbeada651221c42a43ea3b7c08c21841ddbcfde544c9b8d4772de6f2ce92c0b963 +b5dbcd0b1c44c62108841558ec0a48df4b327a741e208c38b1c052321eda6e6ad01af71d49dfcdd445ab6fa6f0c34e6d +97dba59219b69e8aef2659d1f10bbea98d74aefff1f6451de3f41be39acbac0122b8ff58b02e90554469e88911ec3547 +b7e5682ec306478be4858296f5d03364a61f3260636a4242f984d351a02e8723378496beb30c4ca22def9c9ca193ea70 +9656a7a3df4d11df3d8bc35930dff70a5e78a488ca57bba20bb06814fc390fc6c7cb3f39b22134992aad196cced577de +8b269695aa63eb56d0324ba984279dc4c88e565321f1d61d553622bd4f1910d5eff68393d3a830eb924472bd478c2aa3 +9177bcd04b28c87bc0440268b4c8995c6790cad6039594971b2c177f0e197055231e776927d3fa30d98fb897a2ba401f +ae0e943973482001c4f214b9da82e1c27e38aa254d0555e016095c537c835d3702bc2de5c67b234ab151e02b3b7a43a6 +82fc719a7d38bf4787fe1888019ad89fbf29beb951d2fece8686d2beb9119d0c8c6d13bc598748c72c70d73d488140ca +b716dc66f87eb16b95df8066877353962d91bf98cf7346a7f27056c2a4956fb65e55cb512af278783887ab269e91cd76 +81d58cd8bc6657362d724b966321cd29a1b5cdc4601a49fa06e07e1ad13b05e9f387ca4f053ed42396c508cd065c5219 +b32ad0280df6651c27bb6ddbdc61d5eb8246722140a2e29c02b8b52127de57a970e1ded5c2a67f9491ae9667349f4c46 +b68a2eb64cc43f423be8985b1a068e3814b0d6217837fb8fbfd9c786db9cca91885c86899c50a1242040b53bf304ced9 +85887515d4e371eabb81194cbc070e0c422179e01dbda050b359bd5870449c7950e6b3947b7a4a0eb68199341cc89fc3 +ac5fff3c27dfbab78eb8aad37ac31cc747a82401ebf3644a4f4f5aa98d37b8bf3b3f4bd8a3428b32a127c25c9e19d239 +86fceaa6fbf8913553a9e1e907fcb1f1986d5e401a7eafd353beefd1899d571454fea96ff5b2a21254d9fb693ec94951 +b6778bb296d3f0de2531b67d36fdbfa21475be0ca48b9dfcc38f396c41b557823735ed0b583e525a2bae1fe06e04058c +898088babeb5b9866537d6489f7514524c118704abd66b54210dc40a1c1ddb0a1edf7fe0b6e0db53b836f1828ecf939e +b27854364b97274765f0fb8d1f80d3660d469785d1b68da05e2bd1e4b8cbbe04304804d4c8aabb44cf030eba6c496510 +8c55bbf3603dc11cb78b6395ccbc01e08afcef13611f7c52956b7a65ccf9c70551bff3ae274367200be9fc2d5cb26506 +947726f73cd6281cd448d94f21d3b91b96de7ad3ff039f9153befbb5f172db9f53cacb4f88c80a3db26e6a0f7a846eb0 +a7b733a05e97528812d71cecb4f638a90d51acf6b8fcbc054787d6deb7e2595b7b8d1cbe1aa09d78375b5e684a2019bc +8d5ca6d161341461544c533314fe0a6655cde032c2d96f0e4ea7e41098b8b39fa075d38e2d8c74e2d0308f250d6cf353 +b960e9f081393e2260b41f988935285586a26657a3d00b0692ea85420373b9f279b2f1bb2da2caae72dd2e314045f1bd +852a49c7388c10821b387c6d51617add97ba72485f52be95d347bac44c638c92e9c6a44ba0d32afc4d59178a497d944a +8412162a65147e1334ad5af512982b2b48eef565682b3f3e0bbe93fbc5e1103db9375a0c486bdb1b2c57e4cb3a8e7851 +8f52c3eb5d4f1e1e82cfd2b291d4910195427603b796f6c311deb35ef14a01a57a9e6cad39619ad108f3e86f384f9e1c +88d221088f2bf0103c53e44d0d96cd7881ec2b0a965db9121a47481771a8b796edd5ac23c4f9c208a171dab301f7d3bb +b49c3235e8b3617ed08a1891b9e2bcb33dbdacceb94ca96330555b7e00904fe6a749ced9312b8634f88bcb4e76f91cb1 +a85834215e32f284d6dfb0cbfd97f6cffc7b9d354e8f8126d54598bb42d7f858a2b914cf84fa664069632db2ff89a332 +aa3d48eb483c6120c27d9b3e3d0178c1c942632ff54b69f5b3cfbc6ad4ff5b2b9ce6eb771fd1eea8edf4a74c97027265 +a446cfded353cdd9487783b45846402b973cdeddf87e2bf10cf4661610fff35743cc25e8d3b5771dcedfb46b018a5d18 +80998377b3b393ef3073f1a655ad9d1e34980750e9a5cfb95f53a221b053ddb4d6985747217e9c920735b0c851d7551f +a35ac469790fac6b8b07b486f36d0c02421a5f74ea2f0a20ffc5da8b622ac45dfccabfb737efa6e1689b4bd908234536 +8fb1f6d8e9c463b16ac1d0f36e04544320d5a482dd6ffaec90ea0f02b4611aaca984828bf67f84dcc3506b69af0a00a1 +b6e818d61aea62c5ed39c0a22ccbb327178feebdabda0c9927aa1549d2c5bb0637785c4aed2a6d9a7b4989fa8634c64a +b4e7208d16018bf67caafe996d436113eac619732e3f529a6efb7e6f094d8ebea55b7be0e122be075770f5957b6ea6f0 +b691d38b552befac61f6d367287c38d01fec73b7f2efdb6713ca30314a37fb7c177eb111fe6bee657f2681014e07630a +9817587e418e6e7e8e97ae27067f17b55d25dfb14e98f63f530620c855d9a348c9fa571c8508e2741f902f8b9fdc0c5c +b6a6e5ca779ba140bf1d84cd5394ede8262f7479637ec0087a4b152243a1774ba916d8115ce759a3bebd1b409de5f2fc +b53d1c84ad766ff794bf497db3228efd2cc8ed5fc1958d89c1126efdff361610ecb45ea8e329b39035ab00a66c1259c7 +adc31333c507c8e0f4aa2934fcdca57fd9c786722a50dbd5404e129541f7ac182cc7373bf14e1e4e06e6cf94b31b90eb +a82b7fde4642d982d95cec669efee140ad797a2442c7f6620580527d163accbf021b893446cbb8038ea82fe25b15d029 +91f7acf8a8903979afa281646fdecb54aa4d2ed905748e156e92f0910de268fa29d67107d40863935d677d1de8039be2 +86fea71c6d43a7d93216a92fc24dfce8521fd4534a9558b33762d002081247867a6eff54cad7116023277fb4049403ad +8ae5369a7f9f4c91f3be44b98089efd9c97c08f5bb4cd8b3150c115ecd86288fa0865a046a489c782973a111eb93966e +b6fb9e829aa2c81c2d9eac72bb2fd7f3a08e0cd763532c2ce3287444d33cf48b3621f205e9603ec58525934b61a795a9 +83e35ca808d84e41fc92115e9f6e283e928c3a614e6dfc48fe78c33b6411262e7bfa731eadb1e1937bc03cff60032e1d +832fca5196c95098ad47b7d24ba2f9d042e1c73ad2273edd1c2ce36386796ccc26e8567847697f3fcc2a0536a2a2087a +8fdb7038bc8f462ab2b76bf7053362f9c030019f1b6105cf42219a4e620ecc961e3eacb16a8e581a562a97f1418b0128 +8d3a5a404b51b1ad8ce3b23970e0d5cc57b573922341008e3a952a1dd24a135e19e55b79d86a70cfd82e1c0e9630f874 +ba00c025c1c21c57c03cdfc0bfd094b35422281ff0a64b68b240617aa58c6b18800af5f2047d3ff9068bbe987d6c7980 +b468f0dd51964b3806b0aa04f3fe28a035e8f5567fc7d27555be33d02701a838b8dbfe1348b6422c4eac46d2c75c40c7 +8a73a18c97da9958903c38584b08d0e7e26993a5d9b068a5e0e1ee0d8a873942745cf795f94f7a3d3ba88790a9fbb2f6 +953a0a40c2c8102723736854d13b228698c14a02d85c8d2e61db1a768019ac305faf0d5db62ac976430ce087a5b20f1e +8998219da6b34f657cb8a621c890a52cb98c2bc0f26f26e2af666eebeadadc5e8bdf4f830a91d04aca8ce186190152c8 +8941e08c3155ad432236ed05460420a05dd0aaab30477493ffb364b14c00ea5b9183d30d3442b6321d2d20c36e4f5c7e +93f293ff7fb56cf5b03aee6f3ad2ad78444398ed5b3be56d7bf5b56b5aa5a2b980d13895dd57a5726d1b067c20cc55e2 +84a16f313e3f75e31824f58d19ab24c6611fb4c75140a7cadc3c166f68819547c1d0ff7f7d13f5d8ae30dff1d80e2aa4 +b6e3e830b15039d3e28b08f5465bb089eade11ee3bd80afe39e010df7db1fcf0c56d698717677a41ddbc91eeaf6544d3 +95e928e6dfff51351281568ae72da7d1edeb6e9fe01f30af0499e7505ba35a22b5bb919d41bb809a432dce83f3977663 +aabeeb60ca46f9b0232ff82ea7766dcab8cc5aaf9d23539f30174f9486640bc9312868ca493b59b314519fc399973e47 +b393a11e957d0bbb3ecf617b075b5906a3450b348e62916c04791b366f0a7397cccd6648440ac544bc30526e1f95aad8 +abb5bfc3964a6d246da60bd809d0ea6daf4f8222efdc12ceb6730194e85f413ee7eb03bae300abf7ea900dbbc3d08971 +96c1bd1d1d216a4bfbcf000c123f296c0d31e1684e9e3884c14df23bf528c8d599f82bb98fcea491716b617216a8e0be +92d1e570a56f1741fd9f3d9f488cc336421c6256c14a08d340a63720be49b0029e3780e3e193a2e22bf66cc652fa22a3 +8769c08551e3a730e46f8e5d0db9cf38e565a001dfb50db3c30fa7fa0e98b19438edc23c6e03c8c144581b720d7b33a4 +b850bd67fdf5d77d9288680b2f6b3bc0f210580447fb6c404eb01139a43fccb7ed20051999ae2323ea5a58de9676bfb4 +80285da7a0aaf72c4528a137182d89a4db22a446e6c4a488cf3411937f4e83f7b00ec7549b0b4417682e283f91225dfe +80520368a80b97d80feb09dbc6908096c40ff7120f415702c1614d7112b0b57f6729581c71f4a3ce794ac959a46494ff +9817b4c27a490b1cd5a6337e7bc7e8005fa075dd980c6bf075ddfa46cd51cc307ad1d9f24e613b762a20fc6c877eab41 +ad66bda1a3034ec5e420b78107896ecf36126ce3ef9705163db259072dfa438c6107717a33572272062b9f60cb89557c +876114ef078c2915288e29c9abe6b0ad6a756b5ee2930ba1b8a17257f3f0557602d1225e8aa41ce8606af71ada2a971b +aa3d6cde4c3b9d3d5d0c77a33e67f182a3e1cf89b0921423b2024236171955b34afc52b1f25b1dad9da9b001371771d7 +984d3e3a72412d290e3459339757af7520d1739c7af0cbcf659c71999328db44f407d92e8a69fea11625612c49eac927 +ae890d0faf5bd3280dcad20a5f90e23a206661be8842375fea2ab22aadc500849ffbc52fe743b376d46bb926cedae6a6 +b1f231f3f4d710c3fe80099faeb56dac67c1baf53b8fe67a9920fe4f90e52cb9a4bf19211249a6456613b28efe337f18 +8caa54b418ba609d16520af3dff2e96d5f2eeb162c065a1763beb926547b2cfb3ae41d738db2c5681a9bc8bc9e6b9a1a +932157ff56c5ac29cf6cf44f450c882b3acfbb9f43d12d118da3d6256bde4e6eb3183aea304ab6967f37baa718ffec99 +9360bed8fc5b6aac36aa69473040689bfc30411d20ffb7275ef39b9ff5789f9055d149383ce9f0f7709a1f9d683adbfe +98b5b33209068335da72782179d0c7aeeabe94b5560a19d72088fe8323e56db7ce65debe37a97536b6b8a0ca3b840b61 +89a385c11be40064160b030a1bb28c3921fc8078522618a238c7ea0f86f34717ed9af9b4e2e20f5128e5f7fc66ad841e +b615703cbc64b4192990cc7e4903b74aed6a0076ce113b59ef7719197ffa46fb29eb78ca56b49873487432d0625c0faa +90f0d77abae9d3ad73a218e5ccec505ad108ea098451461567ae8ef9661606ca8e78df53b5d628b20b7037bd24622330 +92e0e7cc4dfadc5fa0ee6da0c8de0493030db6e54ba0317f52f232a6708b732068b6077bd13a17eb7eb40b88368085b5 +a24dad20094985bfccc6df1343506ed3bf9dcbdf4b2085a87627a5d71f7568db067304e465f8f380c5c88e8a27291a01 +8629a45a10619354c84bdc2f6c42f540eab5a46f53f2ae11970433d7a2aef007897590bf31dfba1c921614c6d6fe1687 +84ac64040d4206f82b08c771f375da4b7d752e41d2aa0da20ce845f6bc1b880a855d3ee966bca19b8ec327b4b43e7f0e +9608e6050c25996c052509f43f24a85cdf184135f46eaac520a9a6e78e0d44a6cee50ebc054048c708aefde8cd6651c2 +a32032b0e0d7cc35e480c328f315327f9385adb102a708c9ba637878deb74582ae26bb6d6e5f8c9e3a839b0e0154b82a +b7e3c78d63acc6564a49e9f00b0a820b56d4f37a2374af1f7f1d016268011df9e7af0670ed2b0eee961f15aa948328dd +8b88bfdd353acc91ad0d308a43e5fb40da22c228f2fe093c6d6904d70f69c6203f56636ed898b05df51d33f1095ef609 +b1d7a430c51fc857af55047683fc18c453b013527196c5e1bf776819a3dffca802217e9249ae03f084e2ea03ad67fcc2 +80558e28a819ddb5e72e97c54be0f57c173ccf78038d360d190b7f1350a19577b8e3f43fa2f7bf113a228cd3b965b2e4 +b4b2ec44e746c00dfc5661ba2514930934fc805cdc29adc531c02d28ce3cc754414b0485d4ee593232cd1175f357ad66 +b57cee5d32835f76572330f61ccd25a203f0e4a7e5053d32965db283aad92f287645533e8e615137208383ec51b1fd99 +930256086b419a8a6581c52590d0dbd9f8a3564c79424198fca3866b786df2f6098a18c50dc4abd20853a7184b1ce15d +8e75fd01181cffcd618a983492390f486e8c889972a46c1f34a4e1b38f384e8e4efc7e3c18533aa2057da9f9623e2238 +b375d927dd988429f9e2764e5943916131092c394fce13b311baa10f34b023dd3571da02553176091a0738cc23771b9a +b9e28e4c0d0477518034d000e32464852e6951c8db6f64ccdb1d2566f5094716213fbf2fc0e29ac88d0e79f725e3c926 +963981e99392afbd2b8318d5a6b2b0cc69c7f2f2f13f4b38dddbfedb2b0eaf0584aecfcbda20a4c60789c15d77970a58 +a7804e1977aa77c263c7c001afa6cf568032dea940e350d6a58ce4614f1a91c13ae1c78bfea740c229dce2444556976a +8787204177da3cde6d35cd3497fa8774d244f9faa9f4bd91b636a613a32ce2ea0326378cf9c4cf475e73ef751b355c4b +895aeef46a07152a04ec812f1aa1fd431389fa0ef6c6e96a5b833e70ea14073bc9984757a8ee456dbec9788e74e6f0ca +8d17f0e5826783440d1f0ec868003510a4d9952bfe4a638e44a36d94482ac18ba70ef7ff773bdf7a3b62d714dcf0fcba +810d5e36b31310b2e054a666d3b3f7ed16dfcb1765532d87ca2a3920316f0187303c27dd113db145d47e8961062a6c03 +b4e2fb48ae04cf8580bb6a28095076c9b95e5f13122b917328f334d4ac8a8648ce442919e28319a40148987350ab5303 +b85549a313544fa1eb3ceb78473b7d3d717fc85b808de7b79db7dbd0af838ebb020622a7503f1cbacab688dddb648f84 +80665adee057088eae827a5fe904ec3ad77d8843cdce0322d535e0659b4abc74a4d7ddd8a94c27f2def5c34ac2c038ee +ad72fc19c2ce99b5b717e35528fe7d3ac8add340b02ebeb4889d9a94c32f312a0b45ea84d21c54f84cc40ee4958b72e1 +99d530c843dff89a47a5ee8c87303ab18f8a82b0d5b808fca050354b35da5c5a5594d55921c6362d6cc917d75bdc18dc +99c7286c293e1be21c5b2a669dfdfcd5aa587105d2886fc5a8eaf8984da4e907f7d7b8c2362d64a4f1621b077a2a08a0 +b4a39e1a9ed5d80c9563c3ca3fadf76f5478c63a98f4346a61b930c9c733e002f3ff02bc16abfdb53d776184cc3f87ba +9378ea71b941979404c92d01fb70b33fa68d085bf15d60eb1c9fc2b5fcdee6379f5583389a3660a756a50019a2f19a69 +b68e17344a2bc45b8e2e19466b86dc139afefbf9bad2e2e28276a725099ebac7f5763f3cb52002261e3abe45ef51eb1a +819e64dc412b2d194d693b9b3157c1070a226af35c629837df145ea12ad52fa8eabd65b025a63c1fb0726207a58cdde8 +a5e8ff8748419466ff6df5d389125f3d46aedacf44eaf12cbfe2f68d218c7d5ab6de4a8279d13aecc25f3b1d98230894 +91560d54a9715cfda9cf7133ae51c432d0bf7fcbaeb468004994e6838bfc5ddcfa30e4e780667d0c4c0376780b083017 +ae8adb3309cc89d79a55ff74f129bb311fe4f5351a8b87600a87e0c3ba60825f71fccf67eadcf7e4b243c619417540fd +8d92cc1a6baa7bfa96fbce9940e7187b3d142f1888bdcb09bb5c8abf63355e9fb942ac4b4819d9be0e0e822d3e8e2e08 +a6e8b79fdd90c34735bb8fbef02165ccbe55ea726dc203b15e7a015bf311c9cac56efd84d221cc55eaa710ee749dbdfe +a409b151de37bddf39ce5f8aa3def60ee91d6f03ddd533fce9bf7bdbeac618cc982c4f1ffbf6e302b8353d8f28f8c479 +b9693975ef82171b3b9fc318ca296e4fe6110b26cbdfd653418f7754563fa7b6e22d64f8025ee4243483fa321572bfe4 +a039ebe0d9ee4a03ade08e2104ffd7169975b224061924cca2aae71464d250851e9f5f6f6cb288b5bf15df9e252712a6 +b27834db422395bd330e53736a001341ce02c9b148c277dabac67dc422741bfa983c28d47c27e8214cd861f2bad8c6f6 +a2bafaf4e2daf629fd27d7d5ac09fb5efc930ff2ae610f37519808683aa583fe1c6f37207daf73de1d8a164f79a0c981 +b856cee1cfcf5e50db9af4ab0aed3db2f43c936eaea369b5bba65582f61f383c285efbda97b1c068c5d230cbe94f7722 +a61ab205554c0550fa267e46a3d454cd1b0a631646b3df140623ff1bfffaa118e9abe6b62814968cc2a506e9c03ea9a0 +8c78edcd106377b9cbdfa2abd5278724aed0d9e4ae5869b5d2b568fdabb7804c953bae96294fcc70ef3cd52ba2cbe4ed +8570869a9bbf6cc84966545a36586a60be4d694839f367b73dfc40b5f623fc4e246b39b9a3090694aa2e17e652d07fd1 +a905b82c4da8d866a894da72315a95dc98faa3c7b3d809aef18f3b2be4801e736a1b79a406179e8cac8f74d27e71ac52 +a8eb8679ff1a64908515f6720ff69434cb33d63aeb22d565fde506618908b1d37585e3bd4d044fd0838b55787af06b42 +af4d86b2fbd1684a657dffe4210321a71e6ae560c144d44668d1f324dc9630e98348c3d444622a689327c1a59cc169dd +80359c6eab16954559ab0e6a1fee9a0526c45d3cae1a371159a2e3aa9b893afdc3a785c9559a5fd9cd8cd774234bf819 +8d4e5ff81eb5d17bbe8ae6416538ca51a9427ce142b311f5cbb14febbbbb9c1ffc6489fd625b9266264c366c12a9d997 +92e181c66489c5fa063ba2a1a354b6fd3439b8b4365a8c90e42e169bfaa1fb5766bf3e0fe804399d18bc8fbcafb5c3b1 +a9ddf229360a095393885083716cb69c819b2d7cfb100e459c2e6beb999ff04446d1e4a0534832ae3b178cbe29f4f1d3 +8e085ef7d919302a1cc797857b75cff194bdbc1c5216434fa808c3dea0cf666f39d9b00f6d12b409693d7a9bd50a912c +916dc4dc89e5e6acf69e4485a09fc66968f9b292eac61a146df1b750aa3da2425a0743d492179f90a543a0d4cd72c980 +b9cbf17e32c43d7863150d4811b974882da338cf0ed1313765b431b89457021dd1e421eeaa52840ef00551bb630962dc +a6fb875786daec1a91484481787093d8d691dd07e15c9c0c6ae0404bf9dc26083ed15d03c6d3fe03e29f28e20da21269 +a870fcb54b9a029e8086de9b08da8782c64ad2cc2e7fdf955b913d294038bb8136193256b85267e75a4ca205808a76b4 +99883f057e09b88bf0e316f9814c091837fd5c26eeb16fec108c9fed4b7a2bd1c783dac0e4242b5a906621ab606c1e50 +85d89069ca3190577dab39bbec43c16bf6dbca439ad3eebd8f5e9f507d84c3c43e77fd6323224582566a3aa2c8018951 +9363ba219e0003f6e8a9d8937b9e1449e4b2c5cd57194563b758bea39deab88778e8f8e4f7816970a617fb077e1e1d42 +820622f25553c035326145c1d2d537dc9cfd064c2f5bdf6d4ec97814de5fe9a0fbd443345fa2ea0a9d40d81d3936aa56 +87e31110aaf447e70c3316459250e4f7f8c24420c97828f9eb33b22107542c5535bdb48b0e58682dd842edea2886ff08 +95bf80cac6f42029d843d1246588acb40a74802f9e94b2bf69b1833936767e701ef7b0e099e22ab9f20f8c0c4a794b6c +a46ecf612b2763d099b27fb814bd8fdbaee51d6b9ac277ad6f28350b843ce91d701371adfaaf4509400dc11628089b58 +8604decf299fb17e073969708be5befeb1090ab688ad9f3f97a0847a40ea9a11bbcfc7a91e8dc27bc67a155123f3bd02 +8eb765c8dc509061825f3688cb2d78b6fef90cf44db33783d256f09be284bc7282205279725b78882688a514247c4976 +b5c30b2244fa109d66b3a5270b178960fdec47d31e63db0b374b80d2b626409eb76d2e8d1ebf47ef96c166743032fc5e +aab01e76290a7e936989530221646160bf8f64e61e79282e980c8c5dcaaa805ff096efd01d075a2c75917a3f4bf15041 +b9d79671debd0b83d0c7c7c3e64c0fb1274300564b262771f839b49218501e7f38ef80cae1f7e5a3c34acdc74c89dab6 +92c0eaceadf036b3b9dfd2712013aba3dd7c30b7760f501f52141618265baa31840fe77850a7014dc528f71f8cf39ce6 +b3cdd098059980455dd5b1c04182df1bd12fa844a866f02a9f8a86aab95b59945baa9af99f687410bffc5b07153cb23c +b361b73a62f71256b7f6ea8e0f6615e14fc5a06ee98b928ab3c9dd3eef9d9d30070e9855c82b7facb639cacb3401e01f +b9c85fc0f25a3271cf28b1ca900078eaaa66cbab0a3e677606e898ac32781a2dfce4d9cbd07404599e2c3c02fa161c9d +ac5b4fdac2a0b2e6430d9fc72bde4249d72183b197fc7347bb1546ae6f544426686bbe0caec3ee973b6836da5e831c44 +b675aebf24b92e398e166f171a6df442b3f5919b6bee192f31675a5e8eeb77d34c6590a6f0c0857417e0f78cfb085db8 +a9bef942044d8d62e6a40169f7dc7b49e40cd0d77f8678dd7c7bae6f46c46786f9b1e319a3fa408f22a54fd2a4d70804 +a20d19cd917d5102ae9ca0cf532127d2b953aa3303310e8a8c4b3da025dded993a47e3a28e6b02acfadb6d65dc2d41a3 +a47fdb04059b83b2afb86a47b2368bbd7247c337a36d3333b6e5ef2cc9476a92c4907e4c58a845c9ef9b497621e0b714 +94a9e9ffc14b411e11a4ffa59878d59460263589003dc7b6915247c549f67feede279bf3645fdd92379022fb21e3caeb +b92e1177dd9ecdaf1370c71b14954219cf0851f309bc216d5907a4e2e84e0df3457018224150c142cc6bf86644bb4b73 +8bc57fadd68a265b7df9b42227a9c0968db7b1bb50dc12f7d755505779f1ff2c408672b3091e903366acc9ce15d19fb6 +b6b5efbe1ac4e1bd2e8447c45000d09397b772ca5496acc447b881022608a41c4f60388814607a01890190105bee7be3 +95f7c85fd614df968f8ccf8d086579c9e1cec4644ecf06da26e3511cb39635a7326b3cec47bd51cf5646f1c660425e9c +b81765fb319bcdc74b4d608383ccb4af7dd84413b23af637be12e2827a75f7e4bcd14441cf979ed9038ae366fbb6f022 +a120ea76cda8c6c50c97035078f6648afe6537809bdba26e7c9e61de8f3070d2347160f9d34010effbf2ec7e94f5749f +92c1b8631953b40d3cc77eee2c72a064b999c09a9b92c11d8fa7b4072966273901c9dba25f9f79f384d9f11a56f3fc7a +a4b00dc0ab67b2300abc9c516e34daf444d6497b066a90cfe3381ed2812304ed37b14f3b948990443dc6c1cf1bed460c +a9e9f7e13c9f031bc7b9e6f1417c7abcc38894fe7d3f54869ee277afd2efa3e6fb50757dd36c8c94d591e0abdea322cc +84f3e98f831792b5ad14bcfe62a4c9f296476c6087c4c1ec7767fc642fbca141ff6a3deeb8b4d4106a9cda5a9937eea0 +8eb1a7931bbea9a714226fd74b0100ab88355287d9b0a349c095e9b5809b98f237ffd706bce7d67a770da355fb9cec7b +9738ef8739e1742c1f26b51a1621be0b89d37406a370c531e236f635c7064c661818817bb3858908986aa687b28b21be +a9cf3ce8501b003ccaf57552a4c4ec31081e44526d3aa3791d3dc4a7e438a357c0956f93c500356186d8fd4588ffac5e +a7af6a219cca59225839a9de5b19263cb23d75557d448bc7d677b62591a2e068c45e5f4457cceb3e9efa01d0601fc18a +972a24ece5eda7692cbb6fb727f92740451bc1281835e2a02931b2b05824a16b01dbe5edd03a0ed5b441ff25a5cc0188 +b21d1ec7597ce95a42f759c9a8d79c8275d7e29047a22e08150f0f65014702f10b7edce8c03f6e7ab578ce8c3b0ec665 +a13a1c7df341bd689e1f8116b7afc149c1ef39161e778aa7903e3df2569356ad31834fa58ceb191485585ce5ef6835c3 +a57bdb08119dc3bc089b5b2b5383455c4de0c2fcdac2dcfa21c7ac5071a61635ff83eceb7412f53fab42d1a01991de32 +b2968748fa4a6921ee752d97aa225d289f599a7db7a222450e69706533573ded450380c87f8cdd4a8b8c8db1b42b5c97 +8718ec04e0d5f38e3034ecd2f13dfde840add500f43a5e13457a1c73db0d18138f938690c8c315b5bcbeb51e8b9a2781 +82094789e26c4a04f2f30bdb97b9aecca9b756cbd28d22ab3c8bed8afc5b2963340ddfc5a5f505e679bf058cbc5dcbb8 +a35b8a566dd6ab67eddc2467906bffc76c345d508e52e9e4bb407b4f2b2c5f39b31d5a4bf5022f87bf7181dc6be2fe41 +a8c93b1e893d4777c0e3a1b4bef3be90c215781501407c4011457fc3240e13524b4d2bea64a6d0a3efe3f3b0dae9b8ab +877095ad18b1e5870818f7a606127ba1736a0b55b0dbcd281ec307c84b08afc0c9117e3a880fe48bfc225fbf37671a97 +84405ee0421ed2db1add3593df8426a9c1fcc8063e875f5311a917febc193748678dd63171d0c21665fb68b6d786c378 +a52cdc8209c3c310bed15a5db260c4f4d4857f19c10e4c4a4cfe9dfc324dfac851421bb801509cf8147f65068d21603c +8f8a028a70dda7285b664722387666274db92230b09b0672f1ead0d778cee79aae60688c3dfd3a8ed1efdeda5784c9d4 +a0be42fecc86f245a45a8ed132d6efc4a0c4e404e1880d14601f5dce3f1c087d8480bad850d18b61629cf0d7b98e0ae0 +83d157445fc45cb963b063f11085746e93ab40ece64648d3d05e33e686770c035022c14fdf3024b32b321abf498689ad +8a72bbf5a732e2d4f02e05f311027c509f228aef3561fc5edac3ef4f93313845d3a9f43c69f42e36f508efcc64a20be0 +b9ca29b0ec8e41c6a02f54d8c16aebf377982488cbe2ed1753090f2db4f804f6269af03e015d647a82ef06ffaa8cba6c +b4df3858d61bbb5ded1cf0be22a79df65ae956e961fbb56c883e1881c4c21fe642e3f5a0c108a882e553ac59595e3241 +86457d8890ac8858d7bab180ef66851247c2bf5e52bf69a4051d1d015252c389684fcc30bb4b664d42fbf670574ab3a3 +86d5576ea6dfa06d9ebce4cd885450f270c88a283e1e0d29cab27851c14ed2f00355e167b52e1539f1218ad11d8f13dd +883ad1364dc2a92388bfafaa9bc943c55b2f813525831e817a6208c666829a40455dde494eba054b2495a95f7ce69e8a +8942371e6925231c2c603b5f5a882d8404d39f0c7c4232557c2610b21c2c07f145466da798ea78b7932da2b774aa3128 +a799eb71496783cc7faf12c9d9804bf6180699a004b2f07fc5cc36840f63ce7eee7dde9275819a9aa3f8d92dc0d47557 +8eb3fb5c769548ee38c7882f51b959c5d5a42b5935269ccf987d6ddbb25a206e80c6000bcc328af149e0727c0b7c02c0 +8f3910d64e421a8f2d8db4c7b352ba5b3fc519d5663973fea5962efe4364fb74448770df944ef37ffe0382648fb56946 +b41413e0c26ff124cf334dab0dc8e538293d8d519d11cc2d10895a96b2064ac60c7da39f08589b38726cffa4c3f0bfef +b46ef2eb10abae0f35fa4c9c7ee2665e8044b8d9f91988a241da40fd5bbc63166925582151941b400006e28bbc5ba22a +b8baa8b4c420bb572a3b6b85479b67d994c49a7ebfe1274687d946a0d0b36dfed7630cfb897350fa166f5e2eff8f9809 +964b46d359c687e0dcfbdab0c2797fc2bd1042af79b7418795b43d32ffca4de89358cee97b9b30401392ff54c7834f9f +8410d0203d382ebf07f200fd02c89b80676957b31d561b76563e4412bebce42ca7cafe795039f46baf5e701171360a85 +b1a8d5d473c1a912ed88ea5cfa37c2aea5c459967546d8f2f5177e04e0813b8d875b525a79c29cb3009c20e7e7292626 +afaab9a1637429251d075e0ba883380043eaf668e001f16d36737028fded6faa6eeed6b5bb340f710961cee1f8801c41 +aef17650003b5185d28d1e2306b2f304279da50925f2704a6a3a68312f29fe5c2f2939f14e08b0ba9dee06ea950ad001 +97bcc442f370804aa4c48c2f8318d6f3452da8389af9335e187482d2e2b83b9382e5c297dce1a0f02935e227b74e09a3 +8a67a27b199f0bcd02d52a3e32f9b76a486b830ec481a49a4e11807e98408b7052b48581b5dd9f0b3e93052ec45dfb68 +b113bf15f430923c9805a5df2709082ab92dcdf686431bbad8c5888ca71cc749290fa4d4388a955c6d6ee3a3b9bc3c53 +8629ca24440740ce86c212afed406026f4ea077e7aa369c4151b6fa57bca7f33f9d026900e5e6e681ae669fd2bd6c186 +933a528371dcecc1ec6ded66b1c7b516bd691b3b8f127c13f948bfbcda3f2c774c7e4a8fbee72139c152064232103bdf +8568ddd01f81a4df34e5fa69c7f4bb8c3c04274147498156aec2e3bd98ea3e57c8a23503925de8fa3de4184563a2b79e +8160874ec030f30fda8f55bcf62613994ff7ed831e4901c7560eac647182b4a9b43bfaff74b916602b9d6ae3bfcaf929 +ae71c48d48cf9459800cdf9f8e96bc22e2d4e37259e5c92a2b24fbe2c6ca42675e312288603c81762f6ceb15400bc4c9 +b05f39bb83fda73e0559db1fd4a71423938a87ad9f060d616d4f4a6c64bf99472a2cbfb95f88b9257c9630fc21a0b81f +80c8479a640ed7a39e67f2db5ad8dfd28979f5443e8e6c23da8087fc24134d4b9e7c94320ffa4154163270f621188c27 +9969ba20ee29c64cb3285a3433a7e56a0fe4ddc6f3d93e147f49fe021bed4a9315266ebb2fb0eb3036bb02001ae015e6 +a198c89fef2ab88e498703b9021becc940a80e32eb897563d65db57cc714eaa0e79092b09dd3a84cfab199250186edcc +8df14a3db8fe558a54d6120bad87405ba9415a92b08c498812c20416c291b09fed33d1e2fcf698eb14471f451e396089 +81e245ef2649b8a5c8d4b27188dd7e985ef6639090bdc03462c081396cf7fc86ed7d01bfe7e649d2b399255e842bdc21 +8659f622c7ab7b40061bcf7a10144b51ad3ab5348567195924f2944e8c4ce137a37f1ba328e4716c10806f3fb7271689 +a575d610fc8fe09334ca619ecdadf02d468ca71dd158a5a913252ca55ea8d8f9ce4548937c239b9cb8ab752a4d5af24a +94744549cd9f29d99f4c8c663997bdfa90e975b31f1086214245de9c87b0c32209f515a0de64d72d5ef49c09b0a031fa +80a8677862b056df59e350c967a27436c671b65d58854e100115bac9824ba177e94c2a1bfcaa191a071b9cefdbee3989 +91be9a5504ec99922440f92a43fe97ddce2f21b9d94cd3a94c085a89b70c903696cec203bbab6d0a70693ba4e558fb01 +8c5a0087bcd370734d12d9b3ab7bc19e9a336d4b49fc42825b2bfedcd73bb85eb47bf8bb8552b9097cc0790e8134d08c +933aa9e6bd86df5d043e0577a48e17eea3352e23befdbb7d7dcac33b5703d5ace230443ac0a40e23bf95da4cc2313478 +984b7ee4bd081ee06c484db6114c2ce0ba356988efb90f4c46ff85ed2865fb37f56a730166c29ef0ae3345a39cdeae7a +ae830f908ea60276c6c949fb8813e2386cf8d1df26dcf8206aa8c849e4467243e074471380ed433465dc8925c138ea4c +874c1df98d45b510b4f22feff46a7e8ed22cfc3fad2ac4094b53b9e6477c8dfc604976ca3cee16c07906dece471aa6c6 +a603eb60d4c0fb90fa000d2913689126849c0261e6a8649218270e22a994902965a4e7f8c9462447259495fe17296093 +a7c73d759a8ad5e3a64c6d050740d444e8d6b6c9ade6fb31cb660fa93dc4a79091230baccb51c888da05c28cb26f6f3f +a4411b79b6a85c79ea173bd9c23d49d19e736475f3d7d53213c5349ebb94a266d510d12ba52b2ac7a62deaaaec7339b8 +943b84f8bbcee53b06266b5c4cd24d649d972593837fe82b0bf5d5e1bbc1a2bf148e1426c366d7c39ab566b10224cadc +8300012096a8b4cefecc080054bf3ceb0918162ba263c6848860423407796b5eb517170c0bad8e4905ac69a383055a21 +8244a1e3ad41908c6f037e2f8db052e81f281646141334829f36c707f307448b9ab79a7f382a1e8d86f877c90b59271c +8eca1b74687802ecc36a5d39e4516a9dee3de61a2047252d9ed737b49e0090c386e9d792ac004c96337681c7f29a16ad +b70fa47535f0524835039a20036c61e77f66146ad79d3d339214d8744742db41ceeb577c829d000011aeafbb12e09579 +84b3abbce48689f3adbb99889c7fd1f3e15ab455d477e34f5151c5c1c358ed77a5b6a581879f7e0f1f34106e0792e547 +ab45ecb58c0ef0dbce3d16afc6ac281e0d90ec48741ea96a141152647e98fcc87f3a3ff07ba81f3179118453ce123156 +90d231a145ba36a59087e259bbfc019fa369201fcfeaa4347d5fd0a22cd8a716e5a797f3cc357f2779edb08f3b666169 +a4f6074d23c6c97e00130bc05f25213ca4fa76c69ca1ace9dece904a2bdd9d987661f5d55023b50028c444af47ff7a08 +933af884939ad0241f3f1f8e8be65f91d77ac0fb234e1134d92713b7cfb927f1933f164aec39177daa13b39c1370fac8 +80d1db6933ce72091332ae47dc691acb2a9038f1239327b26d08ea9d40aa8f2e44410bbda64f2842a398cbe8f74f770f +a7a08605be2241ccc00151b00b3196d9c0717c4150909a2e9cd05538781231762b6cc6994bebbd4cddae7164d048e7b2 +96db0d839765a8fdbbac03430fa800519e11e06c9b402039e9ae8b6503840c7ecac44123df37e3d220ac03e77612f4e4 +96d70f8e9acd5a3151a8a9100ad94f16c289a31d61df681c23b17f21749c9062622d0a90f6d12c52397b609c6e997f76 +8cf8e22273f7459396ff674749ab7e24c94fe8ab36d45d8235e83be98d556f2b8668ba3a4ec1cb98fac3c0925335c295 +97b7e796a822262abc1a1f5a54cb72a1ea12c6c5824ac34cd1310be02d858a3c3aa56a80f340439b60d100e59c25097d +a48208328b08769737aa1a30482563a4a052aea736539eceab148fa6653a80cb6a80542e8b453f1f92a33d0480c20961 +b612184941413fd6c85ff6aa517b58303b9938958aa85a85911e53ed308778624d77eadb27ccf970573e25d3dfd83df7 +b3717068011648c7d03bbd1e2fc9521a86d2c3ae69113d732c2468880a3b932ebec93596957026477b02842ed71a331b +a0ad363e1352dcf035b03830fef4e27d5fd6481d29d5e8c9d51e851e3862d63cdcbaf8e330d61c1b90886921dac2c6fd +8db409fdacfa4bfdaf01cc87c8e97b53ca3a6e3a526d794eaad1c2023f3df4b888f1bf19fee9a990fe6d5c7c3063f30c +b34d6975310ab15938b75ef15020a165fc849949065d32d912554b51ffa1d3f428a6d1a396cb9329367670391de33842 +9117285e9e6762853fc074b8a92b3923864de2c88c13cea7bab574aaf8cdd324843455d2c3f83c00f91f27c7ecc5592a +b4b2e8f190ea0b60819894710c866bf8578dd1b231ae701d430797cc7ede6e216e8ca6a304f3af9484061563645bf2ab +8c493c6853ab135d96a464815dd06cad8b3e8b163849cdefc23d1f20211685753b3d3e147be43e61e92e35d35a0a0697 +9864d7880f778c42d33cf102c425e380d999d55a975a29c2774cad920dfddb80087a446c4f32ed9a6ab5f22ec6f82af0 +90f67fe26f11ca13e0c72b2c2798c0d0569ed6bc4ce5bbaf517c096e7296d5dd5685a25012f6c6d579af5b4f5d400b37 +a228872348966f26e28a962af32e8fa7388d04bc07cfc0224a12be10757ac7ab16a3387c0b8318fcb0c67384b0e8c1a4 +a9d9d64bba3c03b51acf70aeb746a2712ddafe3b3667ae3c25622df377c2b5504e7ab598263bec835ab972283c9a168b +932128971c9d333f32939a1b46c4f7cf7e9d8417bd08dc5bd4573ccbd6ec5b460ac8880fb7f142f7ef8a40eef76d0c6d +964115e7838f2f197d6f09c06fbb2301d6e27c0ecdf208350cf3b36c748436dac50f47f9f9ac651c09ab7ad7221c7e43 +a5941f619e5f55a9cf6e7f1499b1f1bcddcc7cf5e274efedaaad73a75bc71b1fc5c29cd903f6c69dc9a366a6933ca9d1 +a154bf5eaec096029e5fe7c8bf6c695ae51ace356bb1ad234747776c7e1b406dee2d58864c3f4af84ed69f310974125e +b504e6209d48b0338ab1e4bdab663bac343bb6e0433466b70e49dc4464c1ec05f4a98111fd4450393607510ae467c915 +813411918ea79bdde295393284dc378b9bdc6cfcb34678b9733ea8c041ac9a32c1e7906e814887469f2c1e39287e80f8 +8be0369f94e4d72c561e6edb891755368660208853988647c55a8eed60275f2dd6ee27db976de6ecf54ac5c66aaf0ae6 +a7e2701e55b1e7ea9294994c8ad1c080db06a6fc8710cd0c9f804195dce2a97661c566089c80652f27b39018f774f85e +956b537703133b6ddf620d873eac67af058805a8cc4beb70f9c16c6787bf3cc9765e430d57a84a4c3c9fbdd11a007257 +835ae5b3bb3ee5e52e048626e3ddaa49e28a65cb94b7ecdc2e272ff603b7058f1f90b4c75b4b9558f23851f1a5547a35 +85d67c371d1bf6dc72cca7887fa7c886ce988b5d77dc176d767be3205e80f6af2204d6530f7060b1f65d360a0eaeff30 +a84a6647a10fcef8353769ef5f55a701c53870054691a6e9d7e748cbe417b3b41dbb881bae67adc12cb6596c0d8be376 +87ffe271fc0964cb225551c7a61008d8bcb8b3d3942970dbcc2b9f4f9045a767971880368ea254e2038a3a0b94ecf236 +964bb721c51d43ee7dd67c1a2b7dd2cc672ce8fad78c22dcddb43e6aab48d9a4a7dc595d702aa54a6fb0ffabf01f2780 +a89b3f84bb7dcbe3741749776f5b78a269f6b1bebb8e95d3cc80b834fd2177c6be058d16cacfd0d5e1e35e85cde8b811 +b4314538e003a1587b5592ff07355ea03239f17e75c49d51f32babe8e048b90b046a73357bcb9ce382d3e8fbe2f8e68b +86daf4bf201ae5537b5d4f4d734ed2934b9cf74de30513e3280402078f1787871b6973aa60f75858bdf696f19935a0e2 +b1adf5d4f83f089dc4f5dae9dbd215322fa98c964e2eaa409bf8ca3fa5c627880a014ed209492c3894b3df1c117236c4 +b508d52382c5bac5749bc8c89f70c650bb2ed3ef9dc99619468c387c1b6c9ff530a906dfa393f78f34c4f2f31478508a +a8349a5865cb1f191bebb845dfbc25c747681d769dbffd40d8cedf9c9a62fa2cbc14b64bb6121120dab4e24bef8e6b37 +af0500d4af99c83db8890a25f0be1de267a382ec5e9835e2f3503e1bac9412acf9ff83a7b9385708ef8187a38a37bc77 +b76d57a1c1f85b8a8e1722a47057b4c572800957a6b48882d1fc21309c2e45f648a8db0fcff760d1dbc7732cf37c009b +b93c996cec0d3714667b5a5a5f7c05a7dc00bbc9f95ac8e310626b9e41ae4cc5707fac3e5bd86e1e1f2f6d9627b0da94 +93216fdb864217b4c761090a0921cf8d42649ab7c4da1e009ec5450432564cb5a06cb6e8678579202d3985bd9e941cef +8b8be41105186a339987ae3a5f075fbc91f34b9984d222dfed0f0f85d2f684b56a56ab5dc812a411570491743d6c8b18 +959b72782a6b2469e77fe4d492674cc51db148119b0671bd5d1765715f49fa8a87e907646671161586e84979ef16d631 +86b7fc72fb7e7904ea71d5e66ba0d5d898ace7850985c8cc4a1c4902c5bf94351d23ce62eed45e24321fb02adfa49fc8 +a2f244e7c9aa272cb0d067d81d25e5a3045b80b5a520b49fd5996ece267a7f1bea42e53147bbf153d9af215ea605fc9e +81aa2efa5520eebc894ce909ba5ce3250f2d96baa5f4f186a0637a1eea0080dd3a96c2f9fadf92262c1c5566ddb79bab +b607dd110cfe510d087bcff9a18480ba2912662256d0ab7b1d8120b22db4ad036b2266f46152754664c4e08d0fc583f6 +8f588d5f4837e41312744caac5eee9ddc3ad7085871041694f0b5813edf83dc13af7970f7c9b6d234a886e07fa676a04 +924921b903207783b31016cbec4e6c99e70f5244e775755c90d03a8b769738be3ba61577aca70f706a9c2b80040c9485 +ae0a42a222f1a71cd0d3c69ffb2f04c13e1940cce8efabe032629f650be3ceed6abb79651dbb81cb39a33286eb517639 +a07d7d76460f31f5f0e32e40a5ea908d9d2aebf111ac4fadee67ef6540b916733c35a777dcdc05f6417726ca1f2d57dd +88d7f8a31f8c99794291847d28745e5d0b5d3b9684ca4170b686ffbb5bb521a3ef6746c3c8db22e4250a0cdff7939d96 +849573071fd98c020dc9a8622a9eff221cb9f889bde259e7127a8886b73bef7ad430b87750915658918dcfb6b7b4d8d3 +b12d59f732fa47fad175d6263734da8db89230fd340a46ad1cdee51e577041a5c80bf24cd195593e637daf1a66ef5a98 +abbcfb8a4a6d5e269ee1ac5e277df84416c73ca55ec88317f73608201af25af0cb65b943c54684a5651df3a26e3daca2 +ab157f589bdbaf067a6a7ba7513df0492933855d39f3a081196cf2352e0ddc0162d476c433320366e3df601e0556278d +a86c0619b92e5ae4f7daa876a2abc5ba189156afc2fa05eef464dfa342ba37fc670d0dc308ad3822fcb461ab001bac30 +a3f292946476cfe8d5e544a5325439a00e0165a5f9bf3bb6a53f477baeac7697cc0377745536681aa116f326ce911390 +8aecbbfd442a6a0f01c1c09db5d9d50213eb6f1ff6fab674cde3da06a4edff3ed317e804f78300c22ef70c336123e05d +834ed4b58211fcd647d7bf7c0a3ba9085184c5c856b085e8a0fcd5215c661ef43d36f3f0f6329a9f1370501b4e73b6e4 +a114ea5ad2b402a0de6105e5730907f2f1e458d28ae35144cf49836e0ad21325fe3e755cfb67984ae0a32e65402aad1e +a005f12bed97d71cee288b59afe9affb4d256888727343944a99913980df2c963fe02f218e6ea992f88db693a4498066 +a010f286ab06b966e3b91ff8f1bdbe2fe9ab41a27bc392d5787aa02a46e5080e58c62c7d907818caae9f6a8b8123e381 +857bd6df2ddef04dbc7c4f923e0b1696d3016c8bfed07fdfa28a3a3bd62d89b0f9df49aae81cbb6883d5e7b4fadae280 +b3927030da445bc4756ac7230a5d87412a4f7510581fb422212ce2e8cf49689aca7ba71678743af06d4de4914c5aa4a0 +b86403182c98fcce558d995f86752af316b3b2d53ba32075f71c7da2596747b7284c34a1a87de604fcc71e7e117a8add +98dd19b5527733041689b2a4568edaf6aa0fe1a3dd800c290cda157b171e053648a5772c5d3d4c80e5a795bc49adf12e +88a3c227bb7c9bff383f9ad3f7762245939a718ab85ae6e5e13180b12bf724d42054d3852b421c1cd1b3670baddecb63 +b3cfd9ad66b52bbe57b5fff0fad723434d23761409b92c4893124a574acc1e6b1e14b4ec507661551cbbe05e16db362e +923e1bb482cf421dd77801f9780f49c3672b88508a389b94015fd907888dc647ee9ea8ec8d97131d235d066daf1f42b7 +8d5e16240f04f92aa948181d421006bdbc7b215648fb6554193224d00cf337ebbb958f7548cf01b4d828acffb9fbc452 +8b2b8f18ad0559746f6cda3acca294a1467fb1a3bc6b6371bc3a61a3bfe59418934fa8706f78b56005d85d9cb7f90454 +a9316e2a94d6e31426d2ae7312878ba6baaac40f43e2b8a2fa3ab5a774c6918551554b2dbb23dc82f70ba3e0f60b5b0d +9593116d92cf06b8cd6905a2ce569ee6e69a506c897911f43ae80fc66c4914da209fc9347962034eebbc6e3e0fe59517 +887d89d2b2d3c82b30e8f0acf15f0335532bd598b1861755498610cb2dd41ff5376b2a0bb757cb477add0ce8cfe7a9fc +b514cfe17875ecb790ad055271cc240ea4bda39b6cfa6a212908849c0875cb10c3a07826550b24c4b94ea68c6bb9e614 +a563d5187966d1257d2ed71d53c945308f709bcc98e3b13a2a07a1933dc17bcb34b30796bd68c156d91811fbd49da2cb +a7195ccc53b58e65d1088868aeeb9ee208103e8197ad4c317235bb2d0ad3dc56cb7d9a7186416e0b23c226078095d44c +a838e7a368e75b73b5c50fbfedde3481d82c977c3d5a95892ac1b1a3ea6234b3344ad9d9544b5a532ccdef166e861011 +9468ed6942e6b117d76d12d3a36138f5e5fb46e3b87cf6bb830c9b67d73e8176a1511780f55570f52d8cdb51dcf38e8c +8d2fc1899bc3483a77298de0e033085b195caf0e91c8be209fd4f27b60029cbe1f9a801fbd0458b4a686609762108560 +8f4e44f8ca752a56aa96f3602e9234ad905ad9582111daf96a8c4d6f203bf3948f7ce467c555360ad58376ee8effd2ba +8fb88640b656e8f1c7c966c729eb2ba5ccf780c49873f8b873c6971840db7d986bdf1332ba80f8a0bb4b4ee7401468fa +b72aa3235868186913fb5f1d324e748cd3ce1a17d3d6e6ea7639a5076430fe0b08841c95feb19bb94181fe59c483a9eb +b8b102690ebb94fc4148742e7e3fd00f807b745b02cbe92cd92992c9143b6db7bb23a70da64a8b2233e4a6e572fc2054 +8c9ae291f6cd744e2c6afe0719a7fc3e18d79307f781921fb848a0bf222e233879c1eca8236b4b1be217f9440859b6ce +a658ede47e14b3aad789e07f5374402f60e9cacb56b1b57a7c6044ca2418b82c98874e5c8c461898ebd69e38fecd5770 +89c0cb423580e333923eb66bda690f5aca6ec6cba2f92850e54afd882ba608465a7dbb5aa077cd0ca65d9d00909348ab +aed8e28d98d5508bd3818804cf20d296fe050b023db2ed32306f19a7a3f51c7aaafed9d0847a3d2cd5ba5b4dabbc5401 +96a0fcd6235f87568d24fb57269a94402c23d4aa5602572ad361f3f915a5f01be4e6945d576d51be0d37c24b8b0f3d72 +935d0c69edd5dfa8ed07c49661b3e725b50588f814eb38ea31bcc1d36b262fae40d038a90feff42329930f8310348a50 +900518288aa8ea824c7042f76710f2ea358c8bb7657f518a6e13de9123be891fa847c61569035df64605a459dad2ecc8 +947d743a570e84831b4fb5e786024bd752630429d0673bf12028eb4642beb452e133214aff1cfa578a8856c5ebcb1758 +a787266f34d48c13a01b44e02f34a0369c36f7ec0aae3ec92d27a5f4a15b3f7be9b30b8d9dd1217d4eeedff5fd71b2e5 +a24b797214707ccc9e7a7153e94521900c01a1acd7359d4c74b343bfa11ea2cdf96f149802f4669312cd58d5ab159c93 +97f5ee9c743b6845f15c7f0951221468b40e1edaef06328653a0882793f91e8146c26ac76dd613038c5fdcf5448e2948 +80abd843693aed1949b4ea93e0188e281334163a1de150c080e56ca1f655c53eb4e5d65a67bc3fc546ed4445a3c71d00 +908e499eb3d44836808dacff2f6815f883aeced9460913cf8f2fbbb8fe8f5428c6fc9875f60b9996445a032fd514c70f +ae1828ef674730066dc83da8d4dd5fa76fc6eb6fa2f9d91e3a6d03a9e61d7c3a74619f4483fe14cddf31941e5f65420a +a9f4dbe658cd213d77642e4d11385a8f432245b098fccd23587d7b168dbeebe1cca4f37ee8d1725adb0d60af85f8c12f +93e20ee8a314b7772b2439be9d15d0bf30cd612719b64aa2b4c3db48e6df46cea0a22db08ca65a36299a48d547e826a7 +a8746a3e24b08dffa57ae78e53825a9ddbbe12af6e675269d48bff4720babdc24f907fde5f1880a6b31c5d5a51fbb00e +b5e94dfab3c2f5d3aea74a098546aa6a465aa1e3f5989377d0759d1899babf543ad688bb84811d3e891c8713c45886c5 +a3929bada828bd0a72cda8417b0d057ecb2ddd8454086de235540a756e8032f2f47f52001eb1d7b1355339a128f0a53b +b684231711a1612866af1f0b7a9a185a3f8a9dac8bde75c101f3a1022947ceddc472beb95db9d9d42d9f6ccef315edbc +af7809309edbb8eb61ef9e4b62f02a474c04c7c1ffa89543d8c6bf2e4c3d3e5ecbd39ec2fc1a4943a3949b8a09d315a6 +b6f6e224247d9528ef0da4ad9700bee6e040bbf63e4d4c4b5989d0b29a0c17f7b003c60f74332fefa3c8ddbd83cd95c1 +adbcec190a6ac2ddd7c59c6933e5b4e8507ce5fd4e230effc0bd0892fc00e6ac1369a2115f3398dfc074987b3b005c77 +8a735b1bd7f2246d3fa1b729aecf2b1df8e8c3f86220a3a265c23444bdf540d9d6fe9b18ed8e6211fad2e1f25d23dd57 +96b1bf31f46766738c0c687af3893d098d4b798237524cb2c867ed3671775651d5852da6803d0ea7356a6546aa9b33f2 +8036e4c2b4576c9dcf98b810b5739051de4b5dde1e3e734a8e84ab52bc043e2e246a7f6046b07a9a95d8523ec5f7b851 +8a4f4c32ee2203618af3bb603bf10245be0f57f1cfec71037d327fa11c1283b833819cb83b6b522252c39de3ce599fa5 +ad06ed0742c9838e3abaaffdb0ac0a64bad85b058b5be150e4d97d0346ed64fd6e761018d51d4498599669e25a6e3148 +8d91cb427db262b6f912c693db3d0939b5df16bf7d2ab6a7e1bc47f5384371747db89c161b78ff9587259fdb3a49ad91 +ae0a3f84b5acb54729bcd7ef0fbfdcf9ed52da595636777897268d66db3de3f16a9cf237c9f8f6028412d37f73f2dfad +8f774109272dc387de0ca26f434e26bc5584754e71413e35fa4d517ee0f6e845b83d4f503f777fe31c9ec05796b3b4bc +a8670e0db2c537ad387cf8d75c6e42724fae0f16eca8b34018a59a6d539d3c0581e1066053a2ec8a5280ffabad2ca51f +ac4929ed4ecad8124f2a2a482ec72e0ef86d6a4c64ac330dab25d61d1a71e1ee1009d196586ce46293355146086cabba +845d222cb018207976cc2975a9aa3543e46c861486136d57952494eb18029a1ebb0d08b6d7c67c0f37ee82a5c754f26f +b99fa4a29090eac44299f0e4b5a1582eb89b26ed2d4988b36338b9f073851d024b4201cd39a2b176d324f12903c38bee +9138823bc45640b8f77a6464c171af2fe1700bdc2b7b88f4d66b1370b3eafe12f5fbb7b528a7e1d55d9a70ca2f9fc8e6 +8ac387dc4cf52bc48a240f2965ab2531ae3b518d4d1f99c0f520a3d6eb3d5123a35ef96bed8fa71ee2f46793fa5b33b3 +864adec6339d4c2ba2525621fceabd4c455902f6f690f31a26e55413e0722e5711c509dc47ce0bcc27bbdc7651768d2d +a0a52edb72268a15201a968dabc26a22909620bda824bd548fb8c26cc848f704166ed730d958f0173bd3b0a672f367bd +949e445b0459983abd399571a1a7150aab3dd79f4b52a1cd5d733e436c71c1d4b74287c6b0ce6cc90c6711ba4c541586 +858966355dac11369e3b6552f2b381665181693d5a32e596984da3314021710b25a37d8c548b08700eea13d86cb22f21 +974bcbb8d38c5e6518745cc03ad436e585b61f31d705e7e2e5085da9655d768ac4d800904f892c3dab65d6223e3f1fd6 +8092b6506b01308bf6187fde5ebd4fa7448c9a640961ba231be22ac5fa2c7635ef01e8b357722c7695d09b723101ea2a +a5b8ef360bf28533ee17d8cd131fff661d265f609db49599085c0c7d83b0af409a1b5c28e3a5e5d7f8459a368aa121e8 +b031b6d5e3ceab0f0c93314b3b675f55cf18cbc86f70444af266fe39cb22fd7dad75d8c84e07f1c1bfa2cb8283e1361a +93ad489e4f74658320c1cceed0137c023d3001a2c930ed87e6a21dbf02f2eb6ad1c1d8bcb3739c85dcfbecb040928707 +b15e4ec2cdab0d34aec8d6c50338812eb6ecd588cf123a3e9d22a7ca23b5a98662af18289f09e6cdd85a39a2863c945c +b304f71a9717cf40c22073f942618b44bf27cd5e2ed4a386ad45d75b0fcb5a8dafd35158211eaf639495c6f1a651cedb +b82d78d3eaaa7c5101b7a5aae02bd4f002cd5802d18c3abcda0dd53b036661c6d3c8b79e0abe591eab90b6fdc5fef5e3 +abbd1884243a35578b80914a5084449c237ee4e4660c279d1073a4d4217d1b55c6b7e9c087dfd08d94ac1416273d8d07 +92f4b61c62502745e3e198ec29bca2e18696c69dcb914d1f3a73f4998d012b90caf99df46e9bb59942e43cce377fe8fd +906e79df98185820c8208844e1ba6bd86cb96965814b01310bd62f22cbec9b5d379b2ef16772d6fc45a421b60cfd68fe +a0eae2784ef596e2eb270dd40c48d6c508e4394c7d6d08d4cc1b56fde42b604d10ba752b3a80f2c4a737e080ef51b44f +94c084985e276dc249b09029e49a4ef8a369cd1737b51c1772fbb458d61e3fe120d0f517976eba8ffa5711ba93e46976 +83619a0157eff3f480ab91d1d6225fead74c96a6fd685333f1e8e4d746f6273e226bad14232f1d1168a274e889f202f1 +a724fe6a83d05dbbf9bb3f626e96db2c10d6d5c650c0a909415fbda9b5711c8b26e377201fb9ce82e94fa2ab0bf99351 +a8a10c1b91a3a1fa2d7fd1f78a141191987270b13004600601d0f1f357042891010717319489f681aa8a1da79f7f00d5 +a398a2e95b944940b1f8a8e5d697c50e7aa03994a8a640dfad4ea65cfb199a4d97861a3ec62d1c7b2b8d6e26488ca909 +a2eedfe5452513b2a938fffd560798ef81379c5a5032d5b0da7b3bb812addbaad51f564c15d9acbbfc59bb7eddd0b798 +ab31c572f6f145a53e13b962f11320a1f4d411739c86c88989f8f21ab629639905b3eedb0628067942b0dc1814b678ca +ad032736dd0e25652d3566f6763b48b34ea1507922ed162890cd050b1125ec03b6d41d34fccba36ec90336f7cdf788ed +83028a558a5847293147c483b74173eca28578186137df220df747fccd7d769528d7277336ea03c5d9cdd0bc5ae3d666 +ab5d182cd1181de8e14d3ef615580217c165e470b7a094a276b78a3003089123db75c6e1650bf57d23e587c587cd7472 +a4793e089fbdb1597654f43b4f7e02d843d4ab99ee54099c3d9f0bd5c0c5657c90bb076379a055b00c01b12843415251 +98bdc52ee062035356fb2b5c3b41673198ddc60b2d1e546cb44e3bb36094ef3c9cf2e12bbc890feb7d9b15925439d1ea +a4f90cca6f48024a0341bd231797b03693b34e23d3e5b712eb24aba37a27827319b2c16188f97c0636a0c115381dc659 +8888e6c2e4a574d04ba5f4264e77abc24ccc195f1a7e3194169b8a2ceded493740c52db4f9833b3dbf4d67a3c5b252cb +83dc4e302b8b0a76dc0292366520b7d246d73c6aebe1bdd16a02f645c082197bcff24a4369deda60336172cefbcf09af +a4eb2741699febfeb793914da3054337cc05c6fa00d740e5f97cb749ae16802c6256c9d4f0f7297dcdbb8b9f22fc0afa +8b65557d5be273d1cb992a25cfce40d460c3f288d5cb0a54bdef25cbd17cdea5c32ec966e493addf5a74fd8e95b23e63 +97c6577e76c73837bcb398b947cb4d3323d511141e0ddd0b456f59fbb1e8f920a5c20d7827a24309145efddee786140f +abcc0849ffe2a6a72157de907907b0a52deece04cf8317bee6fe1d999444b96e461eac95b6afde3d4fe530344086a625 +9385c0115cb826a49df1917556efa47b5b5e4022b6a0d2082053d498ec9681da904ecf375368bb4e385833116ea61414 +8b868c1841f0cdc175c90a81e610b0652c181db06731f5c8e72f8fafa0191620742e61a00db8215a991d60567b6a81ca +a8df15406f31b8fcf81f8ff98c01f3df73bf9ec84544ddec396bdf7fafa6fe084b3237bf7ef08ad43b26517de8c3cd26 +a9943d21e35464ce54d4cc8b135731265a5d82f9ccf66133effa460ffdb443cdb694a25320506923eede88d972241bf2 +a1378ee107dd7a3abcf269fd828887c288363e9b9ca2711377f2e96d2ed5e7c5ec8d3f1da995a3dcbedf1752d9c088fc +8a230856f9227b834c75bdebc1a57c7298a8351874bf39805c3e0255d6fd0e846f7ad49709b65ec1fd1a309331a83935 +877bcf42549d42610e1780e721f5800972b51ba3b45c95c12b34cb35eeaf7eac8fa752edd7b342411820cf9093fea003 +84c7a0b63842e50905624f1d2662506b16d1f3ea201877dfc76c79181c338b498eceb7cad24c2142c08919120e62f915 +8e18b1bd04b1d65f6ed349b5d33a26fe349219043ead0e350b50ae7a65d6ff5f985dd9d318d3b807d29faa1a7de4fe42 +8ea7b5a7503e1f0b3c3cd01f8e50207044b0a9c50ed1697794048bbe8efd6659e65134d172fb22f95439e1644f662e23 +b1954a2818cad1dad6d343a7b23afa9aa8ad4463edc4eb51e26e087c2010927535020d045d97d44086d76acdb5818cbf +a5271ea85d0d21fa1ff59b027cf88847c0f999bbf578599083ff789a9b5228bc161e1c81deb97e74db1a82a0afd61c50 +aa2fa4c05af3387e2c799315781d1910f69977ec1cfea57a25f1a37c63c4daaa3f0ecd400884a1673e17dd5300853bcf +b1cd2a74ca0b8e6090da29787aef9b037b03b96607983a308b790133bd21297b21ca4e2edec890874096dbf54e9d04c3 +801931607ec66a81272feaa984f0b949ad12d75ecf324ba96627bd4dc5ddead8ebf088f78e836b6587c2b6c0b3366b6c +95d79504710bdf0ad9b9c3da79068c30665818c2f0cdbba02cc0a5e46e29d596032ac984441b429bd62e34535c8d55b0 +9857d41e25e67876510ff8dadf0162019590f902da1897da0ef6fc8556e3c98961edb1eb3a3a5c000f6c494413ded15e +8740c9ffe6bd179c19a400137c3bd3a593b85bd4c264e26b4dfb9e2e17ac73e5b52dfacc1dcb4033cfc0cd04785f4363 +977f98f29d948b4097a4abdf9345f4c1fb0aa94ba0c6bf6faa13b76f3a3efc8f688e1fe96099b71b3e1c05041118c8d1 +a364422b1239126e3e8d7b84953ce2181f9856319b0a29fcab81e17ac27d35798088859c1cfc9fc12b2dbbf54d4f70b3 +a0f6ba637f0db7a48e07439bb92ddb20d590ce9e2ed5bab08d73aa22d82c32a9a370fe934cbe9c08aeb84b11adcf2e0e +a2c548641bd5b677c7748327cca598a98a03a031945276be6d5c4357b6d04f8f40dd1c942ee6ec8499d56a1290ac134d +9863e9cc5fbcdbd105a41d9778d7c402686bfd2d81d9ed107b4fda15e728871c38647529693306855bee33a00d257a7e +a54173bf47b976290c88fd41f99300135de222f1f76293757a438450880e6f13dbde3d5fe7afc687bdfbcfc4fbc1fc47 +b8db413917c60907b73a997b5ab42939abd05552c56a13525e3253eb72b83f0d5cc52b695968a10005c2e2fe13290e61 +a1f8388ef21697c94ba90b1a1c157f0dc138e502379e6fc5dc47890d284563e5db7716266e1b91927e5adf3cde4c0a72 +9949013a59d890eb358eab12e623b2b5edb1acbee238dfad8b7253102abc6173922e188d5b89ec405aa377be8be5f16d +a00fdb7710db992041f6ddb3c00099e1ce311dea43c252c58f560c0d499983a89de67803a8e57baa01ee9d0ee6fa1e44 +a8b1bcbed1951c9cdb974b61078412881b830b48cd6b384db0c00fa68bcc3f4312f8e56c892ea99d3511857ef79d3db9 +8f3ee78404edc08af23b1a28c2012cee0bdf3599a6cb4ea689fc47df4a765ef519191819a72562b91a0fbcdb896a937e +8155bbb7fa8d386848b0a87caae4da3dec1f3dade95c750a64a8e3555166ccc8799f638bd80ed116c74e3a995541587a +abfe30adbc0a6f1fd95c630ed5dac891b85384fa9331e86b83217f29dff0bd7cad19d328485715a7e3df9a19069d4d2f +89d0783e496ee8dbb695764b87fb04cee14d4e96c4ba613a19736971c577d312079048142c12ce5b32b21e4d491d281b +856b8dbc9c5d8f56b6bb7d909f339ca6da9a8787bba91f09130a025ab6d29b64dbf728ba6ed26e160a23c1cdb9bc037b +8a30dd2ea24491141047a7dfe1a4af217661c693edf70b534d52ca547625c7397a0d721e568d5b8398595856e80e9730 +ae7e1412feb68c5721922ed9279fb05549b7ef6812a4fd33dbbbd7effab756ab74634f195d0c072143c9f1fd0e1ee483 +b7ce970e06fa9832b82eef572f2902c263fda29fdce9676f575860aae20863046243558ede2c92343616be5184944844 +85ed0531f0e5c1a5d0bfe819d1aa29d6d5ff7f64ad8a0555560f84b72dee78e66931a594c72e1c01b36a877d48e017ca +b8595be631dc5b7ea55b7eb8f2982c74544b1e5befc4984803b1c69727eac0079558182f109e755df3fd64bee00fcaa5 +99e15a66e5b32468ef8813e106271df4f8ba43a57629162832835b8b89402eb32169f3d2c8de1eb40201ce10e346a025 +844c6f5070a8c73fdfb3ed78d1eddca1be31192797ad53d47f98b10b74cc47a325d2bc07f6ee46f05e26cf46a6433efb +974059da7f13da3694ad33f95829eb1e95f3f3bfc35ef5ef0247547d3d8ee919926c3bd473ab8b877ff4faa07fcc8580 +b6f025aecc5698f6243cc531782b760f946efebe0c79b9a09fe99de1da9986d94fa0057003d0f3631c39783e6d84c7d5 +b0c5358bc9c6dfe181c5fdf853b16149536fbb70f82c3b00db8d854aefe4db26f87332c6117f017386af8b40288d08f9 +a3106be5e52b63119040b167ff9874e2670bd059b924b9817c78199317deb5905ae7bff24a8ff170de54a02c34ff40a4 +ad846eb8953a41c37bcd80ad543955942a47953cbc8fb4d766eac5307892d34e17e5549dc14467724205255bc14e9b39 +b16607e7f0f9d3636e659e907af4a086ad4731488f5703f0917c4ce71a696072a14a067db71a3d103530920e1ec50c16 +8ed820e27116e60c412c608582e9bb262eaaf197197c9b7df6d62b21a28b26d49ea6c8bb77dfde821869d9b58025f939 +97bc25201d98cde389dd5c0c223a6f844393b08f75d3b63326343073e467ac23aacef630ddc68545ea874299ba4a3b4f +b73c9695ad2eefd6cc989a251c433fab7d431f5e19f11d415a901762717d1004bb61e0cc4497af5a8abf2d567e59fef4 +adaabe331eea932533a7cc0cf642e2a5e9d60bbc92dd2924d9b429571cbf0d62d32c207b346607a40643c6909b8727e2 +a7b1bbfe2a5e9e8950c7cb4daab44a40c3ffab01dc012ed7fe445f4af47fa56d774a618fafe332ab99cac4dfb5cf4794 +b4a3c454dcd5af850212e8b9ba5fe5c0d958d6b1cabbf6c6cfe3ccbc4d4c943309c18b047256867daf359006a23f3667 +a5c0b32f6cef993834c1381ec57ad1b6f26ae7a8190dd26af0116e73dadc53bb0eeb1911419d609b79ce98b51fdc33bc +ac2f52de3ecf4c437c06c91f35f7ac7d171121d0b16d294a317897918679f3b9db1cef3dd0f43adb6b89fe3030728415 +94722ae6d328b1f8feaf6f0f78804e9b0219de85d6f14e8626c2845681841b2261d3e6a2c5b124086b7931bf89e26b46 +a841a0602385d17afabca3a1bb6039167d75e5ec870fea60cfcaec4863039b4d745f1a008b40ec07bca4e42cb73f0d21 +8c355f0a1886ffced584b4a002607e58ff3f130e9de827e36d38e57cb618c0cb0b2d2dea2966c461cb3a3887ede9aef1 +a6a9817b0fc2fd1786f5ba1a7b3d8595310987fb8d62f50a752c6bb0b2a95b67d03a4adfd13e10aa6190a280b7ee9a67 +a1d2e552581ecbafeaef08e389eaa0b600a139d446e7d0648ac5db8bbbf3c438d59497e3a2874fc692b4924b87ff2f83 +a1b271c55389f25639fe043e831e2c33a8ba045e07683d1468c6edd81fedb91684e4869becfb164330451cfe699c31a8 +8c263426e7f7e52f299d57d047a09b5eeb893644b86f4d149535a5046afd655a36d9e3fdb35f3201c2ccac2323a9582e +b41c242a7f7880c714241a97d56cce658ee6bcb795aec057a7b7c358d65f809eb901e0d51256826727dc0dc1d1887045 +93001b9445813c82f692f94c0dc1e55298f609936b743cf7aae5ebfa86204f38833d3a73f7b67314be67c06a1de5682d +82087536dc5e78422ad631af6c64c8d44f981c195ddea07d5af9bb0e014cdc949c6fa6e42fce823e0087fdb329d50a34 +8e071861ceba2737792741c031f57e0294c4892684506b7c4a0fc8b2f9a0a6b0a5635de3d1e8716c34df0194d789ae86 +b471c997e1e11774bd053f15609d58838a74073a6c089a7a32c37dd3f933badf98c7e5833263f3e77bc0d156a62dd750 +8d2d8686fb065b61714414bb6878fff3f9e1e303c8e02350fd79e2a7f0555ded05557628152c00166ce71c62c4d2feaa +ae4c75274d21c02380730e91de2056c0262ffcecf0cbdb519f0bdb0b5a10ae2d4996b3dc4b3e16dbaea7f0c63d497fef +97140d819e8ca6330e589c6debdee77041c5a9cedb9b8cbd9c541a49207eeb7f6e6b1c7e736ec8ba6b3ab10f7fcd443a +af6659f31f820291a160be452e64d1293aa68b5074b4c066dac169b8d01d0179139504df867dc56e2a6120354fc1f5be +a5e5d8088a368024617bfde6b731bf9eee35fc362bed3f5dfdd399e23a2495f97f17728fec99ca945b3282d1858aa338 +a59cfc79d15dbdde51ab8e5129c97d3baba5a0a09272e6d2f3862370fdbaf90994e522e8bd99d6b14b3bb2e9e5545c6f +a30499b068083b28d6c7ddcc22f6b39b5ec84c8ee31c5630822c50ea736bb9dca41c265cffc6239f1c9ef2fd21476286 +88ffe103eca84bbe7d1e39a1aa599a5c7c9d5533204d5c4e085402a51441bb8efb8971efe936efbbfa05e5cb0d4b8017 +b202356fbf95a4d699154639e8cb03d02112c3e0128aab54d604645d8510a9ba98936028349b661672c3a4b36b9cb45d +8b89bb6574bf3524473cff1ff743abcf1406bd11fb0a72070ccd7d8fce9493b0069fb0c6655252a5164aee9e446ea772 +93247b1038fa7e26667ee6446561d4882dc808d1015daafb705935ddc3598bb1433182c756465960480f7b2de391649e +b027f94d3358cbb8b6c8c227300293a0dee57bf2fee190a456ad82ecfb6c32f8090afa783e2ab16f8139805e1fb69534 +a18bb1849b2f06c1d2214371031d41c76ffa803ee3aa60920d29dbf3db5fbfac2b7383d5d0080ba29ce25c7baa7c306b +827bf9fd647e238d5ac961c661e5bbf694b4c80b3af8079f94a2484cb8fba2c8cf60e472ebcd0b0024d98ae80ad2ff5a +838e891218c626a7f39b8fd546b013587408e8e366ecc636b54f97fa76f0a758bc1effa1d0f9b6b3bc1a7fcc505970a0 +836523b5e8902d6e430c6a12cff01e417d2bd7b402e03904034e3b39755dee540d382778c1abe851d840d318ebedce7f +850a77dda9ac6c217e2ef00bf386a1adec18b7f462f52801c4f541215690502a77ef7519b690e22fdf54dc2109e0ca38 +a8265c6ae7b29fc2bda6a2f99ced0c1945dd514b1c6ca19da84b5269514f48a4f7b2ccbab65c9107cfd5b30b26e5462f +ab3d02ee1f1267e8d9d8f27cc388e218f3af728f1de811242b10e01de83471a1c8f623e282da5a284d77884d9b8cde0e +831edaf4397e22871ea5ddee1e7036bab9cc72f8d955c7d8a97f5e783f40532edbbb444d0520fefcffeab75677864644 +80484487977e4877738744d67b9a35b6c96be579a9faa4a263e692295bb6e01f6e5a059181f3dd0278e2c3c24d10a451 +aae65a18f28c8812617c11ecf30ad525421f31fb389b8b52d7892415e805a133f46d1feca89923f8f5b8234bd233486a +b3a36fd78979e94288b4cefed82f043a7e24a4a8025479cc7eb39591e34603048a41ee606ee03c0b5781ebe26a424399 +b748b3fc0d1e12e876d626a1ba8ad6ad0c1f41ea89c3948e9f7d2666e90173eb9438027fadcd741d3ae0696bd13840f1 +acdd252d7c216c470683a140a808e011c4d5f1b4e91aeb947f099c717b6a3bad6651142cde988330827eb7d19d5fb25c +b9a25556a6ca35db1ed59a1ec6f23343eab207a3146e4fc3324136e411c8dba77efd567938c63a39c2f1c676b07d8cdb +a8db6aef8f5680d2bdb415d7bcaae11de1458678dcb8c90c441d5986c44f83a9e5855662d0c1aace999172d8628d8fe1 +af58147108e9909c3a9710cc186eab598682dca4bfd22481e040b8c000593ecb22c4ede4253ac9504e964dfa95a9b150 +8dd8bb70f1c9aec0fcc9478f24dfc9c3c36c0bf5ff7a67c017fa4dab2ec633fbd7bc9d8aa41ea63e2696971ed7e375f5 +aa98d600b22aff993a4d7a3ccabd314e1825b200cb598f6b797d7e4d6a76d89e34a4d156c06bddfc62f2ef9b4c809d1d +8a8fc960d6c51294b8205d1dabe430bef59bda69824fa5c3c3105bef22ac77c36d2d0f38ffc95ce63731de5544ccbeff +b6d1020efe01dc8032bd1b35e622325d7b9af9dcd5c9c87c48d7d6ebc58644454294c59b7f4b209204b5b1f899f473bf +8a750dc9fe4891f2dfe5759fb985939810e4cdc0b4e243ff324b6143f87676d8cb4bcb9dfb01b550801cedcaaa5349e2 +98c13142d3a9c5f8d452245c40c6dae4327dd958e0fda85255ea0f87e0bcbaa42a3a0bd50407ed2b23f9f6317a8a4bc5 +99f2b83d9ec4fc46085a6d2a70fd0345df10f4a724c1ba4dee082a1fde9e642e3091992ebf5f90a731abcb6ec11f6d9b +b218546ab2db565b2489ea4205b79daa19ef2acbf772ccaaa5e40150e67ea466090d07198444b48e7109939aa2319148 +84f9d1d868e4b55e535f1016558f1789df0daa0ead2d13153e02f715fe8049b1ce79f5bc1b0bbbb0b7e4dd3c04783f3f +80d870d212fbddfdda943e90d35a5a8aa0509a7a1e7f8909f2fcb09c51c3026be47cc7a22620a3063406872105b4f81a +b5b15138ff6551fac535d4bbce2ea6adc516b6b7734b4601c66ec029da2615e3119dc9ad6a937344acfd7b50e4a1a2ae +95d2f97652086e7ceb54e1d32692b1c867ffba23c4325740c7f10d369283d1b389e8afa0df967831ade55696931e7934 +8a5b580403e1a99cd208f707e8ce0d3f658c8280417683f69008d09cc74d835a85f7380f391b36ead9ac66d9eedd1cbe +a8b0c90bff34c86720637b5a2081f0f144cfe2205c1176cacd87d348609bc67af68aed72414dc9aa6f44a82c92c2a890 +865abbdd96c496892c165a8de0f9e73348bf24fce361d7a9048710178a3625881afb0006e9f5ee39124866b87904c904 +ace67bb994adef4b6f841cdf349195608030044562780a7e9b00b58a4ff117268a03ff01e5a3a9d9d7eff1dd01f5f4bf +b9371d59185b3d2d320d3fefeadb06ba2aa7d164352fb8dc37571509509fa214d736d244ac625a09a033a10d51611e2e +a8ef992771422dcf2d6d84386fde9fe5dba88bfded3dfcd14074ca04331b4fd53a7f316615cdfaf10ed932cbb424a153 +868cbc75f8f789ea45eded2768a1dac0763347e0d8e8028d316a21005f17be179d26d5965903e51b037f2f57fe41765d +b607111bcdfd05fa144aa0281b13ee736079ebbbf384d938a60e5e3579639ed8ef8eb9ca184868cdb220a8e130d4a952 +aca55702af5cae4cae65576769effd98858307a71b011841c563b97c2aa5aeb5c4f8645d254f631ed1582df3dbbf17da +b9b5cbace76246e80c20dfcc6f1e2c757a22ab53f7fd9ff8a1d309538b55174e55e557a13bf68f095ff6a4fa637ef21a +8571b0a96871f254e2397c9be495c76379faf347801cb946b94e63212d6a0da61c80e5d7bebbabcd6eaa7f1029172fe5 +902540326281e6dc9c20d9c4deaaf6fbbbcc3d1869bd0cf7f081c0525bea33df5cfa24ead61430fda47fb964fcc7994b +841af09279d3536a666fa072278950fabf27c59fc15f79bd52acb078675f8087f657929c97b4bc761cbade0ecb955541 +a1f958b147ddf80ab2c0746ba11685c4bae37eb25bfa0442e7e1078a00d5311d25499da30f6d168cb9302ea1f2e35091 +863d939381db37d5a5866964be3392a70be460f0353af799d6b3ed6307176972686bd378f8ad457435a4094d27e8dfb7 +835cd4d7f36eff553d17483eb6c041b14280beb82c7c69bca115929658455a1931212976c619bafb8179aed9940a8cc6 +8d0770e3cb8225e39c454a1fc76954118491b59d97193c72c174ecc7613051e5aed48a534016a8cf0795c524f771a010 +91aa4edb82f6f40db2b7bd4789cc08786f6996ebed3cb6f06248e4884bc949793f04a4c5ea6eefe77984b1cc2a45d699 +8fb494ca2449f659ff4838833507a55500a016be9293e76598bbae0a7cb5687e4693757c2b6d76e62bd6c7f19ed080bb +b59b104449a880a282c1dd6a3d8debb1d8814ef35aab5673c1e500ee4cb0e840fb23e05fa5a0af92509c26b97f098f90 +aca908e3bad65e854ae6be6c5db441a06bcd47f5abafdfa8f5a83c8cd3c6e08c33cab139c45887887a478338e19ceb9f +806f5d802040313a31964fc3eb0ee18ac91b348685bed93c13440984ee46f3d2da7194af18c63dea4196549129660a4e +ae4b2dca75c28d8f23b3ab760b19d839f39ff5a3112e33cb44cff22492604a63c382b88ec67be4b0266924dd438c3183 +99d1c29c6bd8bf384e79cd46e30b8f79f9cbc7d3bf980e9d6ffba048f0fc487cac45c364a8a44bb6027ad90721475482 +a16e861c1af76d35528c25bf804bfc41c4e1e91b2927d07d8e96bffe3a781b4934e9d131ecf173be9399800b8269efac +a253303234fb74f5829060cdcef1d98652441ab6db7344b1e470d195a95722675988048d840201c3b98e794b1e8b037c +905ac8a0ea9ce0eb373fb0f83dd4cbe20afb45b9d21ae307846fd4757d4d891b26a6711924e081e2b8151e14a496da18 +b485315791e775b9856cc5a820b10f1fa5028d5b92c2f0e003ba55134e1eddb3eb25f985f2611a2257acf3e7cfdfab5e +b6189c0458b9a043ebc500abc4d88083a3487b7ac47ed5e13ab2a41e0a1bee50d54a406063f92bc96959f19e822a89a7 +a30e15f995fd099a223fc6dc30dad4b8d40bee00caa2bc3223ba6d53cd717c4968a3e90c4618c711ed37cc4cd4c56cf3 +a1b1ed07fcc350bb12a09cd343768d208fc51a6b3486f0ece8f5a52f8a5810b4bc7ab75582ec0bc2770aed52f68eace5 +88aa739fbae4bece147ba51a863e45d5f7203dbc3138975dc5aef1c32656feb35f014d626e0d5b3d8b1a2bda6f547509 +ab570f3c8eabfca325b3a2ea775ef6b0c6e6138c39d53c2310329e8fb162869fde22b0e55688de9eb63d65c37598fca3 +89d274762c02158e27cb37052e296a78f2b643eb7f9ae409f8dac5c587d8b4d82be4ef7c79344a08ebec16ac4a895714 +99c411d2ad531e64f06e604d44c71c7c384424498ecd0a567d31ec380727fb605af76643d0d5513dd0a8d018076dd087 +80d0777fa9f79f4a0f0f937d6de277eec22b3507e2e398f44b16e11e40edf5feff55b3b07a69e95e7e3a1621add5ed58 +b2430a460783f44feb6e4e342106571ef81ad36e3ddd908ec719febeb7acaf4b833de34998f83a1dab8f0137a3744c11 +b8f38ccfc7279e1e30ad7cefc3ea146b0e2dff62430c50a5c72649a4f38f2bac2996124b03af2079d942b47b078cc4f8 +a178a450a62f30ec2832ac13bbc48789549c64fc9d607b766f6d7998558a0e2fad007ae0148fc5747189b713f654e6ba +98c5ede296f3016f6597f7ccc5f82c88fd38ed6dc3d6da3e4a916bfd7c4c95928722a1d02534fe89387c201d70aa6fd2 +a8cc5e98573705d396576e022b2ba2c3e7c7ece45cd8605cb534b511763682582299e91b4bb4100c967019d9f15bbfaf +848480ea7b7d9536e469da721236d932870b7bbee31ccf7ae31b4d98d91413f59b94a1e0d1786ee7342295aa3734969c +b88ea38f9ee432f49e09e4e013b19dff5a50b65453e17caf612155fff6622198f3cba43b2ea493a87e160935aaaf20a9 +949376934a61e0ef8894339c8913b5f3b228fa0ae5c532ad99b8d783b9e4451e4588541f223d87273c0e96c0020d5372 +96f90bb65ca6b476527d32c415814b9e09061648d34993f72f28fae7dc9c197e04ef979f804076d107bb218dfd9cb299 +a4402da95d9942c8f26617e02a7cef0ebc4b757fac72f222a7958e554c82cc216444de93f659e4a1d643b3e55a95d526 +81179cbc26a33f6d339b05ea3e1d6b9e1190bd44e94161ae36357b9cdf1e37d745d45c61735feed64371fe5384102366 +ad4dc22bdbd60e147fdac57d98166de37c727f090059cfc33e5ee6cf85e23c2643996b75cf1b37c63f3dc9d3c57ffa18 +8a9b1b93dc56e078ce3bb61c2b0088fd6c3e303ba6b943231cc79d4a8e8572f4109bbde5f5aa7333aae3287909cb0fe2 +8876ef583bc1513322457a4807d03381ba1f4d13e179260eaa3bddfede8df677b02b176c6c9f74c8e6eab0e5edee6de6 +b6c67e228bf190fbaeb2b7ec34d4717ce710829c3e4964f56ebb7e64dc85058c30be08030fa87cc94f1734c5206aef5f +a00cb53b804ee9e85ce12c0103f12450d977bc54a41195819973c8a06dcb3f46f2bf83c3102db62c92c57ab4dd1e9218 +a7675a64772eefddf8e94636fb7d1d28f277074327c02eea8fae88989de0c5f2dc1efed010f4992d57b5f59a0ab40d69 +8d42bb915e0bf6a62bcdf2d9330eca9b64f9ec36c21ae14bf1d9b0805e5e0228b8a5872be61be8133ad06f11cb77c363 +a5b134de0d76df71af3001f70e65c6d78bed571bc06bfddf40d0baad7ea2767608b1777b7ef4c836a8445949877eeb34 +aeadbc771eaa5de3a353229d33ed8c66e85efbd498e5be467709cb7ff70d3f1a7640002568b0940e3abd7b2da81d2821 +8c28da8e57a388007bd2620106f6226b011ee716a795c5d9f041c810edf9cf7345b2e2e7d06d8a6b6afa1ee01a5badc1 +8ed070626a4d39ffd952ddb177bc68fd35b325312e7c11694c99b691f92a8ea7734aeb96cf9cc73e05b3c1b1dcad6978 +ada83e18e4842f3d8871881d5dbc81aed88a1328298bfdc9e28275094bd88d71b02e7b8501c380fa8d93096cbc62f4fb +8befc3bec82dcf000a94603b4a35c1950ba5d00d4bed12661e4237afa75062aa5dcef8eac0b9803136c76d2dd424a689 +97c6f36c91ca5ca9230bfcbf109d813728b965a29b62e5f54c8e602d14a52ac38fa1270de8bfe1ab365426f3fc3654c7 +b01d192af3d8dbce2fe2fece231449e70eb9ac194ec98e758da11ca53294a0fa8c29b1d23a5d9064b938b259ea3b4fb5 +819a2c20646178f2f02865340db1c3c6ebc18f4e6559dd93aa604388796a34bd9fed28ad3ccc8afc57a5b60bb5c4e4ec +a9ffc877470afc169fecf9ec2dc33253b677371938b0c4ffa10f77bb80089afa2b4488437be90bb1bcf7586a6f4286e3 +b533051c7ce7107176bcb34ad49fdb41fac32d145854d2fe0a561c200dcf242da484156177e2c8f411c3fdf1559ecf83 +8fe2caff2e4241d353110a3618832f1443f7afe171fd14607009a4a0aa18509a4f1367b67913e1235ac19de15e732eb1 +84705c6370619403b9f498059f9869fdf5f188d9d9231a0cb67b1da2e8c906ead51b934286497293698bba269c48aa59 +899dddf312a37e3b10bdaaacc1789d71d710994b6ee2928ac982ad3fd8a4f6167672bc8bf3419412711c591afe801c28 +b2f7916d946b903ded57b9d57025386143410a41a139b183b70aeca09cf43f5089ead1450fce4e6eb4fba2c8f5c5bbe5 +8d5f742fe27a41623b5820914c5ca59f82246010fa974304204839880e5d0db8bc45ebab2ad19287f0de4ac6af25c09e +b93d4a1f6f73ac34da5ffbd2a4199cf1d51888bc930dc3e481b78806f454fcb700b4021af7525b108d49ebbbaa936309 +8606f8d9121512e0217a70249937e5c7f35fbfe019f02248b035fa3a87d607bc23ae66d0443e26a4324f1f8e57fd6a25 +b21312cdec9c2c30dd7e06e9d3151f3c1aceeb0c2f47cf9800cce41521b9d835cb501f98b410dc1d49a310fdda9bc250 +a56420b64286bdddda1e212bba268e9d1ba6bdb7132484bf7f0b9e38099b94a540884079b07c501c519b0813c184f6b4 +80b2cf0e010118cb2260f9c793cef136f8fa7b5e2711703735524e71d43bce2d296c093be41f2f59118cac71f1c5a2ff +adcb12d65163804d2f66b53f313f97152841c3625dbbda765e889b9937195c6fcd55d45cc48ebffabb56a5e5fe041611 +8b8a42e50dc6b08ab2f69fc0f6d45e1ea3f11ba0c1008ee48448d79d1897356599e84f7f9d8a100329ed384d6787cfc4 +aaa9c74afa2dec7eccfbd8bb0fc6f24ed04e74c9e2566c0755a00afdfdf3c4c7c59e2a037ec89c2f20af3fae1dd83b46 +aa9f6e8fd59187171c6083ae433627d702eb78084f59010ff07aff8f821f7022ef5fbbe23d76814d811b720a8bfa6cc3 +a56a3ded501659ad006d679af3287080b7ee8449e579406c2cae9706ef8bf19c1fc2eb2a6f9eaf2d3c7582cded73e477 +81971e077c1da25845840222b4191e65f6d242b264af4e86800f80072d97d2a27a6adc87c3a1cb1b0dd63d233fbafa81 +a6fa5453c4aaad2947969ee856616bf6448224f7c5bf578f440bcfc85a55beb40bef79df8096c4db59d1bd8ef33293ea +87c545adbfaaf71e0ab4bac9ae4e1419718f52b0060e8bb16b33db6d71b7248ae259d8dd4795b36a4bbb17f8fae9fd86 +b4c7a9bc0910e905713291d549cec5309e2d6c9b5ea96954489b1dff2e490a6c8b1fa1e392232575f0a424ba94202f61 +802350b761bcaba21b7afe82c8c6d36ee892b4524ab67e2161a91bbfa1d8e92e7e771efb1f22c14126218dd2cb583957 +b4e7ddb9143d4d78ea8ea54f1c908879877d3c96ee8b5e1cb738949dcfceb3012a464506d8ae97aa99ea1de2abf34e3d +a49a214065c512ad5b7cc45154657a206ef3979aa753b352f8b334411f096d28fd42bca17e57d4baaafb014ac798fc10 +8a80c70a06792678a97fe307520c0bf8ed3669f2617308752a2ab3c76fdf3726b014335a9b4c9cbcfc1df3b9e983c56f +a34721d9e2a0e4d08995a9d986dc9c266c766296d8d85e7b954651ad2ca07e55abb1b215898ee300da9b67114b036e0d +8cfce4564a526d7dca31e013e0531a9510b63845bbbd868d5783875ed45f92c1c369ce4a01d9d541f55f83c2c0a94f03 +ab3f5f03a5afc727778eb3edf70e4249061810eba06dc3b96b718e194c89429c5bfbec4b06f8bce8a2118a2fdce67b59 +aa80c2529fc19d428342c894d4a30cb876169b1a2df81a723ab313a071cba28321de3511a4de7846207e916b395abcc9 +82b7828249bf535ef24547d6618164b3f72691c17ca1268a5ee9052dba0db2fdd9987c8e083307a54399eab11b0f76b1 +8fbcb56b687adad8655a6cf43364a18a434bf635e60512fad2c435cf046f914228fb314f7d8d24d7e5e774fb5ffb1735 +a3010a61a2642f5ebbce7b4bc5d6ecb3df98722a49eb1655fe43c1d4b08f11dfad4bcec3e3f162d4cc7af6a504f4d47c +b3dcc0fdf531478e7c9ef53190aa5607fd053a7d2af6c24a15d74c279dbb47e3c803a1c6517d7e45d6534bb59e3527f5 +8648f6316c898baaca534dff577c38e046b8dfa8f5a14ee7c7bc95d93ae42aa7794ba0f95688a13b554eeb58aeedf9ba +89fca6fc50407695e9315483b24f8b4e75936edf1475bcf609eed1c4370819abac0e6a7c3c44f669560367d805d9ba63 +a367a17db374f34cd50f66fb31ba5b7de9dbe040f23db2dcc1d6811c0e863606f6c51850af203956f3399000f284d05f +91030f9ca0fff3e2dbd5947dcf2eba95eb3dbca92ee2df0ed83a1f73dbf274611af7daf1bb0c5c2ee46893ab87013771 +84d56181f304ce94015ea575afeef1f84ea0c5dbb5d29fb41f25c7f26077b1a495aff74bd713b83bce48c62d7c36e42d +8fe2f84f178739c3e2a2f7dcac5351c52cbed5fa30255c29b9ae603ffd0c1a181da7fb5da40a4a39eec6ce971c328fcf +a6f9b77b2fdf0b9ee98cb6ff61073260b134eb7a428e14154b3aa34f57628e8980c03664c20f65becfe50d2bdd2751d4 +8c6760865445b9327c34d2a1247583694fbeb876055a6a0a9e5cb460e35d0b2c419e7b14768f1cc388a6468c94fd0a0f +af0350672488a96fe0089d633311ac308978a2b891b6dbb40a73882f1bda7381a1a24a03e115ead2937bf9dcd80572ad +a8e528ec2ee78389dd31d8280e07c3fdd84d49556a0969d9d5c134d9a55cd79e1d65463367b9512389f125ed956bc36a +942c66589b24f93e81fe3a3be3db0cd4d15a93fb75260b1f7419f58d66afaa57c8d2d8e6571536790e2b415eec348fd9 +83fe4184b4b277d8bf65fb747b3c944170824b5832751057e43465526560f60da6e5bbee2f183cb20b896a20197168c7 +88a71aada494e22c48db673d9e203eef7a4e551d25063b126017066c7c241ee82bedaa35741de4bd78a3dd8e21a8af44 +8c642a3186ca264aac16ee5e27bd8da7e40e9c67ae159b5d32daa87b7de394bf2d7e80e7efb1a5506c53bfd6edd8c2c3 +81855d6de9a59cef51bef12c72f07f1e0e8fe324fcc7ec3f850a532e96dcd434c247130610aaee413956f56b31cbb0dc +a01e61390dcd56a58ad2fcdb3275704ddfbedef3ba8b7c5fce4814a6cdd03d19d985dba6fd3383d4db089444ea9b9b4d +96494e89cbf3f9b69488a875434302000c2c49b5d07e5ff048a5b4a8147c98291ae222529b61bb66f1903b2e988e5425 +b9689b3e8dddc6ec9d5c42ba9877f02c1779b2c912bba5183778dc2f022b49aed21c61c8ec7e3c02d74fe3f020a15986 +a2a85e213b80b0511395da318cbb9935c87b82c305f717a264155a28a2ea204e9e726bae04ce6f012e331bd6730cbb9d +91b70f44c7d8c5980ce77e9033a34b05781cbe773854d3f49d2905cc711a3d87c20d5d496801ad6fd82438874ce732b8 +884596417ff741bb4d11925d73852ffeea7161c7f232be3bdce9e6bbe7884c3a784f8f1807356ae49d336b7b53a2b495 +ae2aed8ab6951d8d768789f5bc5d638838d290d33ccc152edfb123e88ba04c6272b44294b0c460880451ad7b3868cc6a +89d8ebfb9beebc77189d27de31c55f823da87798a50bca21622cbf871e5d9f1d3182cf32ee9b90f157e6ce298e9efccf +afd00a4db4c2ed93cf047378c9402914b6b3255779f3bb47ded4ab206acb7eaebba0fd7762928e681b1aebcfee994adc +a2e49b6cd32e95d141ebc29f8c0b398bb5e1a04945f09e7e30a4062142111cd7aa712ac0e3e6394cfb73dd854f41ad77 +ae8e714ab6e01812a4de5828d84060f626358bb2b955f6fb99ae887b0d5ce4f67ebc079ab9e27d189bf1d3f24f7c2014 +a3100c1eebf46d604e75ebf78569c25acf938d112b29ccbe1a91582f6bd8ef5548ae3961c808d3fb73936ac244e28dbc +a9a02dcff0e93d47ead9cdddc4759971c2d848580bf50e117eb100cafca6afeaa7b87208513d5f96b1e1440ffc1b0212 +894ab01462137e1b0db7b84920a3b677fbb46c52b6f4c15320ef64f985e0fc05cec84cd48f389ce039779d5376966ea3 +b1e40e8399ee793e5f501c9c43bde23538e3ce473c20a9f914f4a64f5b565748d13ab2406efe40a048965ee4476113e4 +a5a7d97a19e636238968670a916d007bf2ce6ae8e352345d274101d0bbe3ac9b898f5b85814a7e4c433dd22ac2e000ff +b6394c43b82923231d93fd0aa8124b757163ba62df369898b9481f0118cb85375d0caac979a198ece432dbb4eb7cc357 +82d522ae3ff4fe2c607b34b42af6f39c0cf96fcfe1f5b1812fca21c8d20cece78376da86dcbd6cdb140e23c93ae0bcb2 +b6e0d986383bc4955508d35af92f2993e7e89db745f4525948c5274cfd500880cb5a9d58a5b13d96f6368bb266a4433e +b0b4325772ec156571d740c404e1add233fb693579f653b0fae0042b03157d3b904838f05c321d2d30f2dbd27c4d08ad +ac41367250263a2099006ef80c30bac1d2f25731d4874be623b6e315c45b0dc9a65f530fce82fb3dc25bd0610008c760 +b6c0b1ed7df53da04a6f3e796d3bfa186f9551c523bc67898bc0ecfc6b4a4a22f8c4d3bfc740ebf7b9fa5b0ea9431808 +8e78fca17346601219d01e5cd6a4837161a7c8f86fe2a8d93574d8006da5f06ae7c48eea7d2b70992c2a69184619663c +a21f91f47e04fafbfafacf3185b6863766a2d0c324ccac2c3853a4748af5897dbbe31d91473b480f646121339c9bae2d +a464d68786ab1fc64bd8734fce0be6fbe8dc021d3e771ff492ada76eedff466577c25e282b7c8ab4c1fd95ef5ff3631e +829a24badc7714081e03509ccfb00818ce40430682c1c0e4a399cd10b690bda1f921aabcbf1edfb1d8a2e98e6c0cedd6 +87ccf7e4bbcb818ef525435e7a7f039ecbb9c6670b0af163173da38cbdb07f18bc0b40b7e0c771a74e5a4bc8f12dfe2c +94087bd2af9dbeb449eb7f014cfbf3ee4348c0f47cde7dc0ad401a3c18481a8a33b89322227dee0822244965ae5a2abb +896b83ed78724dac8a3d5a75a99de8e056a083690152c303326aa833618b93ef9ec19ab8c6ef0efe9da2dbcccac54431 +821e6a0d7ccf3c7bd6a6cc67cde6c5b92fb96542cb6b4e65a44bbc90bbc40c51ff9e04702cb69dd2452f39a2ff562898 +b35b2096cda729090663a49cb09656c019fef1fc69a88496028d3a258ad2b3fd6d91ab832163eaa0077989f647e85e7e +b7857ef62c56d8bce62476cdb2ab965eddff24d932e20fc992bd820598686defe6cc0a7232d2be342696c2990d80721a +b343d974dfda3f6589043acd25d53aecf7c34b1e980ae135a55cda554ff55e531bc7c2dfe89b0d2c30e523c7b065dad1 +8d139e16a73cd892b75f3f4e445a10d55d1118f8eeafc75b259d098338419e72e950df6ca49cb45677a3c4e16fb19cdc +817b8535bd759da392b2c5760c51b3952ecf663662a137c997f595c533cd561ed7e655673c11144242160e41d1f2dd71 +817ee0f0819b0ccb794df17982d5b4332abff5fec5e23b69579db2767855642156d9b9acccf6ceab43332ccc8d2744dc +9835d2b652aec9b0eba0c8e3b6169567e257a6a3f274ec705dbc250ee63f0f8e4b342e47b9e0c280c778208483d47af8 +b78c40177f54f0e6d03083a4f50d8e56b5aafdb90f1b047bb504777d6e27be5a58170330aee12fbaa5f1e9d4f944acfc +ab8eebacf3806fac7ab951f6a9f3695545e2e3b839ca399a4ef360a73e77f089bb53d3d31dbd84ddfde55e5f013626e0 +96c411fc6aecca39d07d2aff44d94b40814d8cfc4ee5a192fd23b54589b2801694d820a0dd217e44863ccff31dda891b +8249c424a0caf87d4f7ff255950bbc64064d4d1b093324bfe99583e8457c1f50e6996e3517bf281aa9b252c2a7c5a83a +acf6ed86121821a3dd63f3875b185c5ebe024bdb37878c8a8d558943d36db0616545a60db90789c0925295f45d021225 +a37f155621a789f774dd13e57016b8e91b3a2512b5c75377ec8871b22a66db99655d101f57acaecd93115297caabfc21 +92e60ee245bd4d349f1c656e034b1a7f0c6415a39ac4c54d383112734305488b3b90b0145024255735e0a32f38dba656 +acec614e562ccfc93366309cfdc78c7d7ee0a23e3a7782a4fc4807b8803e6ebfb894a489d03e9a3c817ff2ec14813eba +b912f9dd26ed552cb14b007b893e6ed2494d12517e5761dbeb88521270144f8c3eb9571a0ad444b30a8a65e80bd95996 +8375408dae79c547a29e9a9e5d4ec8241b36b82e45e4ca3b0c36d2227c02d17bb171528d3778eac3bbdc75d6c4e8a367 +8c2d0e6e4406836da112edbbb63996408bb3cda4a2712fd245e4bb29a0100fdc89a2746d859b84a94565bc1cfa681813 +a7431bf59e111c072d28c97626cd54fcdf018421d053a787d2aef454b91251ee8ff9d3702d06b088f92b9ad2bbebff15 +8f3659b0fbeb90b7f30b7a49233325e806551a32911a654dca86e290b314483bbb33fe6482387bc48c35d85c1dd0441c +8dca5ba23f0bb76f7dacabf12886053552ba829a72827b472a2f01e19a893155cdce65f1fb670000f43e8c75ba015a31 +8c1514c083c77624eeb5d995d60994a2866192e15c4474d0be4189fae0e9dbd62494ebb4c02fbc176b53be548abbc5a1 +80498d2ed153381baf3b0f81da839ed0eea6af5796c422b8e59be805dba48c4395bb97824ac308170bb4f14f319c5ddf +84f5ebc3bf96362457993e9fa31493c31c4283075e2403f63d581b6b0db8a3df294b2085643f2007f4de38cb5d627776 +958e6e38774da518193a98397978dbc73d1c3827b4996ec00b4183da2c305a187a0ada9aa306242814b229a395be83c9 +ab8b8fbf73845615e7fab3e09e96cc181159eab09f36b4c1239b3c03313c9aeb4bbb51e16316fe338b2319ed2571b810 +977e4e33b33bd53394e591eba4f9a183e13704c61e467d74b28f4ad0b69aa51501a5221cb1e0e42bcb548ca518caa619 +a9bb7ecb9846cc30d04aad56d253c3df7004cebb272f6adf7b40a84adef9f57291e0d08d64c961b9fc406cdb198aab9b +8d2b72dc36406a545a9da44e1fddfb953d4894710ca026d6421a4ac91e02d0373a599f2acfe41d8258bc9679cf6f43d3 +904192fc8fe250f61ecb8a36abbbccae85f592bbf00c10039c30b5a1c733d752a04e4fd8a1000c6578616f8a16aa83a3 +87f5fdfe20bbbf931b529ec9be77bbfcc398cad9d932d29f62c846e08a91d2f47ae56ad5345122d62a56f629f9a76c4d +84cc3a53b2e7b7e03015f796b6cb7c32d6ded95c5b49c233ac27fafa792994b43c93cda6e618b66fce381f3db69838ba +aab58da10d7bbe091788988d43d66a335644f3d0897bbc98df27dcc0c0fcee0ac72e24f1abdd77e25196a1d0d0728e98 +a10ea8677c2b7da563d84aa91a314a54cab27bb417c257826ebdd3b045d2a0f12729fe630bbbf785d04874f99f26bee8 +acc4970ef2a4435937a9b8a5a5a311226ca188d8f26af1adfcd6efb2376a59155b9a9ff1cff591bde4b684887d5da6e5 +8dc7cf6fcca483c44eb55e7fb924bf3f76cf79b411ae4b01c6c968910877ac9c166b71350f4d935f19bdffb056477961 +ac2dd1182ded2054c2f4dbf27b71a0b517fb57193733a4e4e56aca8a069cff5078ffd3fd033683d076c1c639a4de63c7 +932ec87c450cd0dc678daf8c63cd1bf46124fa472934e517fbbfb78199f288ff7f354b36e0cc6c8739d3f496cfe0913b +b0d631ced213e8492be60ea334dbe3b7799b86d85d5e8e70d02beef3ae87b1d76e1df3bdb5f7ba8a41904c96f6a64455 +929d7239ead7575867e26b536b8badf2e11ca37840034d0e5c77039f8cce122eff5a1bf6e0bcadde6b3858e9f483d475 +aaae5d372d02ee25b14de585af6fbc48f2c7cd2a6af4f08352951b45aa469599eff41e820df642ca1a0f881120e89dbe +b23c411741a6b059f04fa4f5fd9dd10e2a64915f2de6ea31e39c32f2f347a776a953320e5f7613fcb1167efe502f5c5c +a4581b0ae633fe29c6f09928e5efb16db019eeac57f79fef2fa1d3c9bee42ce0e852bc60b9d0133265373747e52a67a4 +81b33afffd7b2575d4a9a1c5dd6eee675c084f82e06b9b3a52a3c9f76e087f12dca6e0ffddc42fb81ce1adb559d47a38 +89cc890f06b424591556aabdfdbb36d7a23700425e90c9cfed7d3da226b4debe414ac5bdf175273828ce6c5355712514 +a4399438be75cfae2bf825496704da5ed9001bed8538d8ac346c8cf0d4407808e9ee67573eb95fe1c6872ac21f639aaa +ad537f7ce74a1ca9a46fc06f15c1c8a6c32363bd6ac78a3c579ed8f84252e38a914cac16709fe65360e822ef47896de4 +8e53b69f5e3e86b86299452e20ea8068b49565d0d0ab5d50ce00158a18403ae44e1b078a3cfd3f919aa81eb049a30c6e +a59f2542c67a430fd3526215c60c02353ee18af2ff87cb6231a2564fe59b8efec421f18d8b8cc7f084675ecf57b3fd05 +b8d9bac93ef56cb4026dd1c731d92260a608fd55b8321e39166678e1dab834d0efddb717685da87786caeb1aaf258089 +aa2df56f4c6fe9e0f899116c37302675f796a1608338700f05a13e779eb7cf278e01947864a8c2c74cc9d9a763804446 +b0108ff2e327dcb6982961232bf7a9a0356d4297902f4b38d380ff1b954bfbcae0093df0f133dd9e84d5966c7b1aada7 +b06b813b01fe7f8cf05b79dc95006f0c01d73101583d456278d71cd78638df2b1115897072b20947943fa263ddab0cd6 +aa41e6c4d50da8abf0ea3c3901412fe9c9dff885383e2c0c0c50ed2f770ada888a27ea08bbb5342b5ff402e7b1230f12 +a48635dbb7debac10cb93d422c2910e5358ba0c584b73f9845028af4a763fd20da8f928b54b27782b27ca47e631ebf38 +80a574c208e994799e4fa9ef895163f33153bc6487491d817c4049e376054c641c4717bda8efbeb09152fa421a7268a7 +b592bfd78ae228afc219c186589b9b0b5c571e314976d1ed5c1642db9159d577679a73c049cfc3dcfefcd5a4f174eeea +aa1f08af3918c61eadf567a5b1a3cdcdfb1b925f23f1f9e3c47889762f4d979d64686ce1ce990055ef8c1030d98daa3b +857df4cfd56d41c6d0c7fcc1c657e83c888253bae58d33b86e0803a37461be5a57140a77fb4b61108d1d8565091ada1c +8fae66a72361df509d253012a94160d84d0b2260822c788927d32fd3c89500500908c8f850ef70df68ddaeb077fd0820 +aa1dbefc9aef1e7b896ff7303837053c63cfb5c8a3d8204680d3228ac16c23636748fe59286468c99699ae668e769a0c +b64b1cb2ba28665ed10bad1dddc42f3f97383c39bad463c6615b527302e2aaf93eb6062946d2150bd41c329697d101be +b6d35e3b524186e9065cee73ea17c082feff1811b5ab5519dd7991cdff2f397e3a79655969755309bd08c7d5a66f5d78 +a4dae7f584270743bbba8bb633bdb8bc4dcc43580e53d3e9e509ff6c327e384f14104b5bdfe5c662dc6568806950da37 +aae84d3d9ad4e237b07c199813a42ed2af3bf641339c342d9abf7ebec29b5bd06249c4488ce5c9277d87f7b71b3ddd37 +b82a463cf643821618a058bddf9f2acb34ac86a8de42a0fa18c9626e51c20351d27a9575398a31227e21e291b0da183e +8b6c921e8707aded3ea693f490322971b1a7f64786ef071bc9826c73a06bd8ae6bf21bc980425769627b529d30b253ce +80724937b27fc50f033c11c50835c632369f0905f413b1713a2b0a2274bec5d7a30438e94193d479ba6679dbe09a65ef +a1d9b259a2ca9cff8af6678b3af0a290c2f51e9cf26d5fe3c6a4fa3d28cbf33cb709b7f78b4f61cb9419427983c61925 +96a3e69a5ed7a98ce59c4481f2ffb75be9542122ad0eb4952c84d4536760df217854d4ec561ce2f4a79d3793c22fa4f4 +990c4d9a4a22d63a8976d34833cafc35936b165f04aed3504e9b435f0de1be4c83b097bbaa062483cf3dee3833b4f5b6 +b9bf5e4b270aec4a0dc219457b5fed984b548892c4b700482525ba1a7df19284464f841dab94abfabcaa9a7b7a757484 +acaecf49cb4786d17cf867d7a93bd4ffee0781766e11b5c1b29089ae0024c859d11b45828fbff5330b888543264d74a9 +b0e1a0865b1e6f9e4a0e31d0c885526ac06678acc526fda5124742a2c303bd0e8871a0cb7951ec8ed9540fc247c8d844 +82b3d327b3d1a631758451e12870816956cd0cef91fcf313a90dd533d5291193a0ff3cc447054564ce68c9b027a7ffd7 +a2843602abb98f0f83e000f3415039788da1e9a096bfe8fed6b99bab96df948c814560424ffebe755cb72f40436fb590 +ab1c7b43cf838798d1e314bc26e04fc021e99a7bfbfc8ffde62fa8d7f92139de86a377289d5177021154229de01ede15 +95e5cf5dd87ae3aed41b03c6c55f9dfad38dc126b17e7e587c156f7745c8da0bd1d60acb718fc1a03b61344f01e3de4d +86f021a3762bb47167f80d4ef1b1c873a91fe83409f9704f192efeebbc3ece0729cd2f92f63419907ea38ae47bc907d2 +aaa1445dafbbcd645d4332d9806225e9346ee5ac6b22ad45e8922134fe12f3d433f567a6a4c19efdd9d5775a7de1e92f +8fd7e15688eef75df7b8bca3d61bc9fca4f56e047cdb6d0b864e7d1c4966eac27d6094b0c8482b49739f83ec51050198 +80aab8b4d394eb011d4ec6a4c2815617308c9b847c6fa6a3d7e6af1c79420ef6ff2a13934a398581c40ee4cf1cac02ac +8970b97ac076a1d8a321ce00eada0edf974a46bf3cc26f6854e4218cdfc8d2b0c32199d9658f254b4fbae5a2c5535f41 +a1aa2ec5b03df0a630e73dd048680ed6d3032c324941423f45cd1f16038789e5e75b876a13948732e9079a422f66a9fc +b5fe5f5e2f2ae2beeb8e95859a02fc45f01f9fb0ebb2bd8ec9ec976b3e806228821a9775096d341d662bc536c4d89452 +a2bc1f170b62d0d5788b02391337b2ab157c38e725694e80aeead7383e05599be0e2f0fa27ef05db007061809356e147 +a8a69701d4a8d0d972390e9f831fd8e9f424b2c2ef069e56bd763e9e835b3ce5f7cf5de5e5c297c06ace4aa74df1067c +b43d551af4ff3873557efe3f3fb98e5ede9008492f181f4796dd1a6bcda8b9445c155e8146966baa812afae1abe06b48 +b4b1dae44fd596813f30602ab20e9b1fb20cb1bd650daacc97b7e054e5c0178b8131d439a9e5b142ca483cc012a362b3 +b95b8a94c30a831eaaebea98c65cc5d0228c78afd6603d4aa426d8186aecc951f1a11c33951f51df04c7e6fa43ffb5ae +b100059624cf9db371bec80013a57a8f296d006c139a8766308f1ea821c7eccc26cad65bc640ab3f6cef9062653bf17d +8e5a2cb76716e0000d13bce5ef87acac307362a6096f090f5f64e5c5c71a10fddfdee8435e7166ba8c3ad8c3f540f3e4 +93d2c43e21588c1e83c4255c52604b4ac3f40e656352d1827e95dd5222a45aebff9674e34fbbe7ed21eca77bd9b8dcbc +8aeaed611546bb9073b07512a9a1f38a7f436ab45e11775a0f9754baaf63e9bcc7bb59b47546a5ded5e4ba2f698e3b5f +af9e6792e74a1163fe27612f999a2f3cfa9048914c5bef69e3b2a75162bb0ce6ece81af699ad7f0c5278a8df0ba000d2 +850bf2d5d34791c371a36404036ad6fdcd8fb62d1bb17a57e88bda7a78ea322397ce24d1abf4d0c89b9cf0b4cc42feb3 +87f7e2a1625e2b7861b11d593aaac933ed08a7c768aebd00a45d893ed295bbb6ed865037b152bb574d70be006ddc1791 +8dcce8f4ad163b29a2348ea15431c2c6ea1189ece88d2790e9f46b9125bd790b22503ec391bc2dee8f35419863b2c50c +b4bf5266c37f12421dd684b29517982d5e4b65dfdfba5fc7bd7479fd854aabf250627498f1e1188a51c0a88d848ec951 +8651623c690247f747af8fdffdc3e5f73d0662bc3279fa2423a3c654af9b6433b9e5e0155f1ce53857e67388e7e3401d +b155120f196d52760129dde2e2b1990039b99484cdc948fa98095cd23da87679850f522e5955eae34ac267d2144160d3 +aec8115e8d7b6601fbceeccf92e35845a06706d46acd188452c9f7d49abef14c6b3a9a9369a8bab2fd4eb9288e2aaca5 +998a8ca4dc0f145f67a8c456f1d6a7323c4836fe036dcbb0f27eb1c596d121eb97369638a9908cfaf218c7706f266245 +b235fbafac62802742ee3d26b1f4e887f7d2da4d711ba7f9bb6ca024de7beec1de66bb830ce96d69538f7dcb93c51b26 +9258d2ddc21ab4e3edcde7eb7f6a382a29f1b626003cc6fdd8858be90f4ad13240072d8a8d44ef8de51ca4f477fa6c45 +99d038487821c948142c678acd8c792960993dd8cb5e02cb229153a1ee9f88249f4ad9007f08e5d82e2a71fb96bb5f32 +a88ee9dbc73d3d8e0f447b76fdb3a27936bde479a58d5799176885583dc93830ac58bca9087075950ea75100cf51af23 +88b9b15816e5a0387153c1f4b90f613beb3ea4596037da01a81fdd2bcbd0baf5598db99f77e7694e5a0d35e822758108 +907ae4b637d06b15846ee27d08c9c9af42df261c5bdd10cf5bc71f8e5ca34b33ac2405307023c50bdb8dc7b98a2cd5fe +9393d6900e1d2d1a1e42412fefd99578d9ac1d855c90a3e7930a739085496448609d674ca9b34016ad91f22d1cac538e +a28ac56b216730b7dcdb5ab3fc22d424c21a677db99a9897a89ed253ea83acfd9d83125133f5be6d9cd92298df110af8 +b027590ee8766f1e352f831fda732adbaf77152485223ad5489ef3b0ce2d2e9f98d547c111fe133847ebb738987fb928 +a9cc08fbd5c3fee8f77cf6eb996a5cafa195df5134dab000e4d0312f970a5577942ee89794e618074f49841f1f933a42 +a8b3535c3df0b1a409d3fc740527ee7dd5ac21756115cde6f87f98cc7623f50cfcf16790689cab113ee7c35a5bd4879f +b61420227b97e5603ae8a716c6759b619f02b8fdc48acbf854352aa6519dad74b97bacc1723ca564cbf3ca48539ed773 +853762498de80eebf955a6c8ddd259af463e4e25f0b6ba7b6a27b19bdbf4c585de55760a16e2d9345cdba6b2a02610f3 +a711c1b13fc6c30745203c5d06390e6c82bd7c50f61734aa8d99c626faba30119bc910be63ec916c91ba53f8483c05a8 +b488c0a793f4481f46b5875d96eecd73e46209a91677769f0890c5e002ecd7d4b1c9f4ba68c47fbed40e3857b1d8717a +a651c5e812ae65b1c66d92c607e80be330737ea49c1dcfe019c0ecea0f41a320406935bb09206a4abff0d1c24599b9ad +85e34e7d96e4b97db98a43247b6c244383b11ca10bf4777364acf509a6faa618bc973e2136a4693fbc8ab597e308fd5a +99837214102b394fffa7f3883759554c6bb7a070f5c809303595a44195e02b9a169460dc6bbffb62bdc0e7ced5f0a5c1 +a952f89c0afb4bdae8c62b89cc3cfb60d0576ba4fe01a5d99534792f38d8848d919b3fc7577435d8443a044d2ee0bcfa +a1ac1f81acb29798acdfc493854663519e2d1b0e9d23d286ce33882c34b4c1c0bb43dd9638166d8026315a44d9ec92a8 +ac9c58aa38219ae659d23007cc7b97fd25b7b610b2d81a8f9f94ddb089efc49c049a8ea4c56e6eaf7b6498f422a97b3c +87e61d501c242b484fb9a937ef21d485f6678d75257fc8fe831b528979068cadbe7e12b49c34058ec96d70a9d179ab14 +aa45f6852f35cc8b65a4a8b5380641d2602a4fa4e3a035db9664df3ac2e170b1280c4a8b7b55161430063e54de4158a6 +a46975614ddde6d134753c8d82c381966f87203d6e5a5fb99a93b0d43aa461466b37f07b8d0973a1abd6ee2b40f24348 +8d35f97297773422351f4d99564c1359ef1a10cfb60aa0e6c8985a78f39b4268486312c8ebf9dd2ef50a771aa03158eb +8497c6242102d21e8b3ade9a9896c96308ab39171ab74cbd94e304c47598e2c2a7b0a0822492ac5c076ba91d4176481d +973f8fcb5f26915b3a3ef6fe58cc44bc7f4e115cd0ad9727d8d1b8113e126ae2e253a19922c5433be4ab2311a839c214 +ae3ee9f1d765a9baf54b4617a289c3b24930aa8d57658a6b0b113bbf9b000c4a78499296c6f428bbb64755dfd4f795d2 +a5be7a8e522ef3dcf9d2951220faf22bb865d050f4af2880b8483222ff7aad7c0866219fcc573df9d829c6efbb517f98 +a5f3c7fabd7853a57695c5ad6d5b99167d08b5414e35ed1068ae386e0cb1ee2afbbe4d2b9024379b6fc3b10c39024d36 +978d5592d4798c9e6baceff095413589461267d6a5b56cd558ec85011342da16f4365d879b905168256f61d36d891b1f +b7b6eaffa095ecbd76d6e1e88ceebabaf674d9ef7e331e875c6d9b9faa1762c800ff1ea597c214c28080f67a50a96c1e +8a1ab53ae5ceaa42e06e58dd8faf6c215fc09ba111ca9eeb800612334d30d5971448be90fec62ed194328aadd8c8eecc +a9ca532cac8ace9a9e845382f8a7840bf40cb426f2fcad8a2f40aadbb400b3a74021627cc9351b0966b841b30284962e +8dddeda8854c8e7ddc52676dd1d0fed1da610ed5415ddd7d25b835bd8420a6f83d7b67ec682270c9648b2e2186343591 +888906aac64fd41d5c518a832d4e044fdc430cfe142fd431caf4676cafc58853ce576f098910d729011be0a9d50d67b5 +96a3f886a2824e750b1e2ea5c587132f52a0c5e3ff192260d8783c666206bd8ebd539933816d7cdd97e4bc374e0b1edf +a150a29ffb2632cc7ec560983d9804cd6da3596c0c25956d27eb04776508eae809659fc883834269437871735de5f9ed +81f7ad4d2959d9d4009d1dfbc6fee38f930f163eb5eac11e98dc38bd2f7f224e3f5c767583f8e52d58d34f3417a6cf90 +97ccac905ea7d9c6349132dd0397b6a2de9e57fd2d70f55e50860e019de15c20171a50b28a5c00ef90d43b838253b3d1 +95694f00c21e8a205d6cbda09956b5b6ec9242ec8c799a91f515b07dcc7de3b6f573e2c0ba149f5a83700cda2d1df0f5 +82bbc3c4a3b3997584903db30fffd182a266c7d1df3e913f908d5a53122fa12cf5acd11d915d85d5bd110fcc43cee736 +8d3f24b4949aa1b4162c28dfbb9f813dd1d8b330f71325448dc45ea34d59b69ca95059402aae011e1b5aba6e536bc6ec +92c734c19752d24782331e74c9af97a8399ddfdd32954e91cda7363dba876aca4f730b451c50a8913950420682da8121 +8653d2c79f77b8c7dcdf7e8dee42433998aeedf1b583abfca686d47a854de1b75e9a4351580c96d1a2a9532659203361 +886f0e414cb558c1a534a1916d3531320a9b6024639712ffe18164ce6313993a553e2b9aafe9c0716318f81a5d0bb1da +b31b5efaba5a5020c3bcea0f54860e0688c2c3f27b9b0e44b45d745158f484e474d5d3b1a0044dd6753c7fb4bf8ace34 +b2d615bbdfdc042d6f67a6170127392d99f0e77ae17b0e1be6786ff2f281795f1bf11f83f2e0f8723b5cdd1db1856e09 +a6e014cca531e6ac2922239b5bee39d69d9ba6d0fa96a4b812217dd342657d35606f0b9c5a317efd423cdb1047815e3d +a8921736b69c9fbb29f443715174bac753e908251804620c542fad6cfbfda7bdfe287f2902f30b043a8a4b4818cfdeef +8d73a9949a042ec2dcefa476e454cd9877eee543b1a6b3b96a78ffcff87421e8b26dd54d5b3192ac32073cb36497acc3 +b936a71ee8df0e48867f3790adf55dc8efc6585024128de2495f8873bd00fd9fa0984472125e801ed9c3cdce6698f160 +82f69c06209c28f64874e850601dda56af44ffc864f42efa8f9c6a0758207bf0a00f583840982dec0a517ab899a98e5b +b7a0a14411101473406f30e82f14b13e6efc9699e7193c0be04bb43d1b49e8c54812ce0f9b39131a20379c4c39d3bbe3 +81159c969f38107af3b858d7582b22925a7ccced02fae3698482d7e9cdc6c568e959651991c6cf16c53a997442054b61 +8bf1116a206e0ce9199fcab6ed2b44a9e46e8143bff3ed3f1431f8d55508fe2728b8902670cfd8d9b316f575f288ed9d +a279b2149824b64144eb92f5a36b22036d34a52bd5a66e5da4b61fbc95af6eda8e485c7914f448abd8674fc14d268d9d +8b98279b5f3588d1a2f8589d2756458690a502728800f8d94b28e00df842a101c96ab9c5aee87c5bbe65552c0c383b80 +b4a27a351ec54420f94e0a0a79d7c7a7337940399646631baca93eeab5fd429d7fb39428be77dcbce64a13eaa3c8ca1d +90c08baa29ec8338ffce381eae3d23ce3f6ba54e5242dec21dc3caaed69cac13f2ab5e8d9d719bc95720fa182eee399c +85156d65bb4fef69ffd539ab918b3286105ca6f1c36a74351ab3310b339727483433e8f8784791f47b4ba35ca933c379 +923005013c27209d07c06a6b92b0cbb248a69c5e15c600bbcc643e8dcd2402adebd94dd4cafb44ec422a127e9780aaec +863b23eb5463a6ef5a12039edc2f8e18e3c97b244841bc50af02459b1bcc558367edf2f6e4fe69f45f37887469dd536d +87a4a7708a112724ff9b69ebb25d623b5cae362ae0946daed2ec80e917800dbfcd69f999c253542533242e7b9a5cc959 +8bf4347ceea7f94b53564f26b1a4749a16f13bf71a9e03a546f906f7c423089820ff217066159b0637d9d6824e9c101c +ab07eef925d264145971628a39e4dd93ff849767f68ed06065802cf22756fc6bf384cf6d9ab174bfc1a87bcc37b037aa +8e3f10a42fad43887d522dc76b1480063267991c2457c39f1e790e0c16c03e38a4c8e79a0b7622892464957bf517ebd8 +a8722fc7b1acf0be18f6ddf3ee97a5a9b02a98da5bc1126a8b7bf10d18ee415be9a85668eb604ef5a1f48659bc447eb5 +878d6b2a9c0aca8e2bc2a5eb7dd8d842aa839bbd7754860c396a641d5794eab88a55f8448de7dbddf9e201cbc54fe481 +ada881c167d39d368c1e9b283cf50491c6bfc66072815608ba23ab468cfbd31ca1bd7f140e158e0d9e4d7ebfa670bc2d +a2b48578fa899d77a7ee1b9cb1e228b40c20b303b3d403fd6612649c81e7db5a7313ba9702adc89627b5fd7439f8b754 +8e051280e10551558dcb5522120ac9216281c29071c0371aaa9bde52961fe26b21d78de3f98cb8cd63e65cff86d1b25c +a7c5022047930c958e499e8051056c5244ae03beb60d4ba9fe666ab77a913a067324dfb6debcb4da4694645145716c9d +95cff6ec03e38c5ab0f6f8dccde252d91856093d8429b7494efc7772996e7985d2d6965307c7fdfa484559c129cca9f9 +993eb550d5e8661791f63e2fa259ab1f78a0e3edad467eb419b076a70923fede2e00ddc48a961d20001aaae89fad11e8 +abb2826e4d4b381d64787a09934b9c4fe1d5f5742f90858228e484f3c546e16ee8a2a0b0a952d834a93154a8b18f3d16 +a922ca9f2061996e65ef38a7c5c7755e59d8d5ce27d577abcdd8165b23b4877398d735f9cb470a771335fc7d99ecb7fc +90f22862216f6bc1bbf5437740a47605d1ff5147b1f06f7b13fec446e4c5a4a4a84792cb244a1905f3478a36f8d7065b +87f3d9a86afef5b79ea1ca690ee1ee4bb9754b66f7c50a42ad6b99af7c222c853ca161f440a0a2a60b3b5a54e3493240 +80a9ca9a2d33b9cf61976b3860d79f5d00de89a06ef043d2a52931809018aeb4ce70423cbef375b29c2c750c2c8704c2 +b4e798ef1d615896108dae37ac50c1e859216ab6dbac11653e44d06ce5209057b4b0dd6d31dcfcda87664a23c8ef1cbd +aaed6d1e7c5b1db06f80dae6c24857daadfb0268f20e48a98fba4b76de1ebf65fb84c3be95fd6a418b498f8285ec63bd +aeceaa316c6369492c939f94809bc80e0857abac86c0d85be8066bbf61afbaaec67e28c572437a8d35c49dd596b3134f +b791c3d53ed34a7d1c8aa89b7953e3684c3cd529230824dc529739a5fbe74b58b87f01e56e7a169f61c508237ef67160 +9351f8c80634386c45c0050d2f813193f9d839173be941e2092d729be5403632a2f18dffdc323d69eb0dc31fa31c5866 +97693184d5c0056ae244dfb6709cafa23a795dc22d497a307a7f9cf442d7452024023c54a8d6bda5d90a355ba2c84f3a +85362daa003d23511ca174a8caafe83d52b6436dc4e43c4c049e5388d9211b5cbef3885896914d86d39be0dd1f910511 +a2511b5fa34b24eeb0e1bcbcf872a569d1ff5570fe7b0fb48f5542f7fe57bad808d34b50afa87580866a6cb0eba02f27 +b382e3327eb1401f2d378dbb56ac7250adde0961bd718575a64d264ffd44772c20752d4035c3ba60eb435e160b375e20 +afad8a5d40b536c0720556845a6b257ed42165c14fb4b4a874717d107752f49ed9380c5b048df3aca67287bb8fc411a8 +8fad0c98434ca5373c2d767868f679b76b4a8d04bca8240ea3f388558262c2d61b73b16fc1160932652b5688c25fffcf +83898008b5cbb6f08f8ef3ec179427869682bb4e8d38f6e6a687a214d4a307436afc64ee67d70a5a8ba9730bf839aecc +b85232e79913785fd82b06890706972b4ad7a309489930ae23390d51aa5189731f8a2df24800409a8c36b3dd6fc91275 +a24ff26ec792f3701da4c5638c1fca4fa4dae95b01827d6200d583c4caf17ea3171393ba2a8c23d1ee8b88402916f176 +adc5c7a7ff6b41d6cc386b7fc69d7bb04179bdf267864f9aa577f0f6a88438191fa81ebaf13055c2f2d7290be6421ace +a05e835abd502d31454d40a019010ff90b6b0b1f993075a35c9907aeab7a342ac0ba6144dc9379aada6119157970e9b2 +85ff07ba58463e7f153fc83f11302e9061e648a5cbd272bb0545030b20e11facd8b3ff90c9ac8c280a704fbda5c9d1b0 +a6c735ada8f4587da8cdad7ea3ada01650b5a3ecab8d81daa7a5f5de51ef4a6592b524692584306f06be3f6701f2870c +b138deee4e53ae8d677fae104f713ef1b8babfecec16b6a85785a66a72784eb09d44c3b63567222ade714e98f7d1604e +ae79c1a49dafcdd972acd95d8ad0a35c02adc7fd736d4c44c3cd13df5789d339b5ea16bddbbd43e486a061ab31baa5c0 +ab3cf2371a1d7dcd0ffe3869a0178230964b06694bf258b2073ea66a2afccd845b38485da83d02e1d607d4c5c36b78a8 +ab9609f28a325fd01cb39540e3a714506c44e52ef28ee640f361deb5760aadbb23e804663b0fa20a66e239c33f8d8bb8 +8ed95ea8e76e1b42823d7915a6aae77d93746f846bf602841dfce0e47543a36efb9ee7e5b42c73c3209d911225cc471b +a80b6162036d43811482323f0ce59eb18740e33a63d7c7bbbf3be206985919e5342d53a69df537d43e8b7d7f51e8892f +93c03d0a5083408ba00c125a8a9385213d4c860072f0297857b1235045819b904e07f2425c13a661d0a01d2e53347f4b +a6581200f00f96c461621e1d26b14a23687dd97eb9f7df4ba641a84340ee7306dc1796248fba4804f185947ad13b4385 +8be174018fa40f7e0cedc5ae68f38969eb7695f2205e9c573641e533d56f68c20abf38a23d2f0dcac371e60b21b18615 +857ad4ee3218c647c58f09b8ab22bcc8976f00a768ab1f708618e868e6143474be846422ce2710a0ed39b5155b6f13a1 +a490bec40f322d599f26bcefcdddd8f2ef6576aa737d5ce7e8d5d422741abe749e3e6a48489aed8c560633f72857e3c2 +a9c0ee339621f1c4a2410f9b4d2f03f1b558dae2973807b8bccd920e8feb7f65dfde3e79986b72ad21fcc4567240381d +8592251568e750a430f7d2c6ddbb3ec82a4dd9fd83efe389e69aa177fd97ac2c96c59a6e86db20d8e6f125d65b46c4d3 +a4e2f4aa6a682913b423b097c4069c4e46a1f3af9556b1bfd0580d0fc01e3991488458049e0735b2a629684a79271c8f +8c4f6a3e738cf74112b08b1680be08158013ef8a515a81215d8a36c9b756786d1b4cb4563923463f3329292f4b48bf6d +8bace547353c02ea00dd547eeda7259aa354d4772dd5e0c486c723cf88627b7112e196b879c3c92a9561b674d9fc486d +8d372f4901e25e8db64fa098148d4a4e709b0e9dcb756d0f90dad99dea393054193ae1a33d292a3dd772ff7ba05e4b71 +a8c7ea6a6a031ed23d65639f01f5423190775558f479700597df7ae7e338a6ae5e9b32f470aff20787ac8b7eec84df6c +b6e9dcba240fdbbf66033410a79a2dd3e9e1ffdf2eae949b3a9ed720e939d92339991dc3e70a5ac7d5253f317daf0b7d +974dec4cd61af75721071752c664d9c2a5121f06ff1515c56139a177a3ca825f763b69d431d4607e393fa74dcc91cc58 +958863e6ad583a9d370a6db3639066982e44766904e7afa849b132f6666b7d08ab931131b3bec7a506d6583e93d56767 +8b93a33b5da9b3300c20a96d80b894e3789c77041183c2cb21751579c8c96857f60cfc2f075201b64e95a78985c5b321 +b726cb9f7ef34ddbc2fad82b3b0af0b30cc913e26c5a614ae5c19cc9c55c8e6dae069db5315a8dcb6d987415bb550ca8 +a730f515398a71bddd66cab2ff996659d4e47dfbb08ce7958a41021f76d269b91c7498b708cd14b183a8ef469c772803 +a4eb3b18132eb0f5337f14e01d63ca0bec0db6a43870f800e5491db756c2f5fce519d8dba5528b4bcef550d06b33699c +b1ab6621eec1ee6784e632e214693f39a14f3715991996b883d66200963e065c86fa0667f7bc36b93b40b5d90ff708c2 +80486a26c3532ad6e19f76d8c9344e2626c07363fd495264927cb5935fa9565ece670dc98767afb04af6a9a5c9231075 +8ee20e0df3c84a1c6b0e21bcc325cf99235b747ffe47f17fdfba548a358ca75cbcc331dd50db2311b400ae882256a608 +aef4268959e5541e7ec69c921a1e81a8374d7e44bf1bb2debf4101cf3cd6b7d6ca7f441758b388de96b3e0edb5b97be9 +8793629bd29d689ec94b016de8886cac6e2ca6638911babb22db4a787661422da0639a4e4089ebeb689d173abfe75950 +b487b3551c20a29e9a5abbda8c50ff594826283e443c09e3ae09b914e46060b3f9abf70434444ce1487e2a74e562616b +8f11531cfc5997dd04b997cb87ba1831aa7041d5434fe72de66304e3f165d882fac891391fbb1eb955c65319e65293b6 +b195136875fd02a75676c33cb3e60504d5964f7a9e81f4c8c8fd38af62e2145c55f765b3158664566191188ac678f381 +b374174b0b3eb04fa49eb4ece45173f0db5d829eac370a20a62309566e0f98b18f72f3633626893c053b7be6bfbd2366 +b2a2f6b0cf652775679b2d677048f2ed8c31a3269e6cddcc7a10e3e6fee89e486b50d9d55fbe452b79c4157c0270fb77 +892177c364dc59032594e7a6fd032286ffdf4fa0b9e3baeb37ec839faebfd2fd46c57b2c9bfe9977b59c93a9cc0ead1d +8ab7c0038a7dbb2ef200dbbe9acbc875829ecad4883792d5c6ce283de67ccd9aa935a9cc7b30b2bd9de7fca7bf2a9a05 +83745cfc78ca709835aa6c6a233c2b86fb31e3f9f6a8becf63e501f2841c4366fb7d131b746c9d3291afda714ff05579 +a723dcb67925ef007e8339dc578d2622d9bb77cfda87cca0088854a59414c02338752c56116a6c1281917842e8467c38 +8a098142da0af2254c425fdbbd0d1b1a17b2bd781391ab37f181775524b8563c64ab8a1602aee2ac6c0a82ba11a8b1d1 +b13bd7529a9b351c5d395c794c28bcb0a3167f1c992e8c062eef47be9be27895945231d249c73a0b6949daa295e14944 +a20dcd2fc2222eaae467d9f5db861040f58bcb991a26e5663ac3aa5e1ff13d0010657c5af586cc4621757add2b905073 +b818f660c3cc4e9f273c25ceeabe562c8afa8ff88529c26f2cf45ae6b2813cca5f350e3cbd56f6257c4df41722dabd25 +b225d5987108b24411bc389276f12509a45e86d5ad6b6d929af5274df0be11109c0fed329669a0acafdf3b0beaa8f2ec +91fcb6d04576d3c6bae947bb7843b430e5fb0592ae49b0a65dfa5791f4eaa4bf2c7f436c8de7360f217001c2b4e5c67a +8821f7a1424ca3fdc5d4a5606ad10dfaba6094cf36669fa9f84cf7617e50425405d14980780e1e18a1ecea7913cda896 +990dcb7f38f56521a70cb71bf4522649fcd46ac052c7feabb0748dfcac9f9c0f95d29e070d32af3cd0adbf869535e17b +b0fac1029fe2c1100f24e2f4bf10c7672199fce53513c7dde2e8d9b00702edf0143e0e1dc7ceae7dcc6994edc2422b6f +a514ebb1a33451b4915c05114db0b10168393613744df848b24e43e09f0bda23baefd9d731075198aace586615ac7911 +8b77f7953c2e67049fdca3653b8d8cf3f799677f79b954da02bdad8cc4d6c855c1c7c16b4f6f9ba35f46426ec28b2d84 +875520cfbda16ec5b1d1d00f578a910d0fc052f17870ba093e22e310bb07648d34817cc2b8811b6f52de535f7046a0d0 +b8c77b4be0b430851c4ff69e91cb770db1935d848198601393810ef395efab52deb9d5c6525472bab720273d5e0e7a79 +b6d4d437146671bdea62fb6545395ea3df39f1cdef21b8476b68e7a25aa7354f847740576d6c9f187bbae9941f0ae450 +95c642f1bccdb62cd6a2212dcdd6ff8d49aee426ca08b7cf3a9d15249d24a9eed5533f92a70c84498c0797f8a57efa27 +b617978047ed0f748c305aa7f30c2dacd0db00baa67fe0c5ce346ef0e6991dc7e05f18dcb2702467421f8390f27aa815 +86411c7a00b3e8b43bf22fb061b1f54ad9bbf632cd74395a478218389c0f544668acf3dd7726532d080ca7da9a5f8608 +97bf684a8849626c4710a6992f6c11f6b5406fd4dfe9e6aa502425aaafe9827e2c435aaf9a5d3d2ba3a4c0e8aec79ba4 +8b178e2a125b461d3180906ffba0af3dce614c64058501fdd35243ababf892d6fcdea4834ce42c25d5569452b782a709 +8ebed2c8a25c61da6a6a8cb0d8f5ea179e28869753eacc728f2c076f7aed8598cd3aa0981f120f9e7ea55b3a689ae882 +a6f235b8e655ca3d634740b53d8c0a757ecc75d2b8838b7948997c1985473d01943d935f687b86cee56cd47c8e773443 +a7959c465a9646908b9d8032a589e41a7dd999f2ffc54bb42f22e5f8a4d8c493a31bcc7ea2cac6c8dbcc59acace7181b +96d0532df2e12da20a57cadb6cf5f6c4ee1aa4775629358c25f1d51677a3e96d1fe3b232532324b4f02f941952d4cc68 +90f493473d686b639a30d1ddc9c72eae6e983f1236e162e58e967a477c0654973ea2e1bdf4ba1a44d7247bc1befc2cab +8b2d87876d9c4085102a07ebb41c565ba69acab99ffc03efc18f20e48d3f3bbe4fc6ddab9c78fe479d9ada80504d85ba +829a0fb3200a28e09cacd6c5346000e7786116ddfd898f37dfd17bef454a8abc0fe939ed8735c00769f7f2f33cd4f906 +86194ec9e88ddb7150e8b03e7a535b6e99863fc6762835601efd03615aa97aaeb413cb210e86035086ed852b39c9d019 +b02efd116a7189cb317ceae392bc301ae55470f0489fa89934e182aeb8c67e280299b975786fe9a470bff46827defb9b +87d7c3903bd22b12d815506f150373f518d47dfc6e5fd74347d88b518124c9923d1e4c98defeb3a45d53d50b423e2175 +a1a430406b28254a7d6348bc98e697e9bab43839aa05d53faee97546f84541ea0b559162619b2045182938f69bf61cae +99d243c226c61c6697fb3d2594f3533fa5dfd7cfc87107908cacde337d7a077fa5a9dc702d26081b065edb1227498e65 +800ee5006ab6217161f42db0cfc552a81728bb4fbd7af6e4620ea099a65ef6664184af3f65a07fcec7e965529c5b49bf +91bfd307579cadc8f81009558605be3edbcb8dbba271475803484017f40130b2b216aef4f620d960193be681877d3a53 +96a060459dec458d19a6f8af6e49dc6c7c58c55dd18915c5fce5e0f4b4a422fce3b9632f6059388fe760289abf70f173 +9921a37f3e657222c7fda3588418a9071409711d9f1fccede7494429f02a45fbc52d79fbb64e9ccd518f60d06d0520d3 +81052b0d15773cb75975ca9230ebb2579700e489c7e3f07cd9cde206fef38b8139bd4976d2b4a7840495fc645f96df03 +88ac37ba66d1de5e23878c992e4d54023729e97e77351f50dc5918d738b5a73faf1dc6feec7e85784761836ba1c6f778 +ae1e6072c13060775f6086d1ae1f88b627ffcb810fc0e0e97deea1f3a15ef0aaa52a6dce2563e4beedadc131af2a8281 +8b60a340f5e4f90badf83001b495ac9f13974c3d2054ddcb3e6b8ca99dec5cd63a263e05c282454191ab2e087d5a2911 +832e2d56ba69dbf817b2b9dbd25c1538d5b8dbf5d9bc05e6be85054a423ebb66a71b157e166e0b9444ac171b34b7ccc9 +8586036fc7dde1e7e3ecb61663130c4529866ae9f5f5095b9fccd24a4c70eea899aae5f10ea1ba66d1665b2d83be35b0 +a77969453b5c083a207913272b5b69d4ccbd8718bdf54be8fbe11b4bd0a2168aae3ba8f9362afa69c0ffa28d7e5a2340 +b7fe9568c214baad0ac5f83745611b481f744ec1c4fa78a549b180dcf79633e5ba75dc20055012a13d849eb7a9be57d3 +b01cad1d2a6c51c0ce88243d1f52f95fb5ee315a905079688027511f0c4ecd0563a3a81846709d272fa5ccb9665e8043 +8eae0a21adfc569aa57237654021c2bdb2c6f0f52ccc90a126682c21a1f9413c63d285f92b2b2f8649150a9284bf70b7 +942acc947192b5f3cf60e92383e5d35f79e7a5904e8e9fd1c8a351676c83ad29b0afb6578d555457cf909f8f4d27adfd +a74e092f8628fba9abcabc27e2e9f3d5a9a941dfe50a2dfde2ad179aabc73afd196676925c2d98643ab8b3d02bdb66ad +896159daa2afd757cf3f9d34af248ad68bb3c62e4c9ac49919422727479cf669098f270b9e645607a7d11adad4c889b2 +a428d8370813d78e7a2a24eebd36e9da2f8bb3605e5a39b5fcda939b531c35a8ebaaa642ba556250a37bddeec90326fb +a5fa04eb60a1d5ee9820e78f42f7be15e1c02757b539aead995768c6209684d6c183c71d282e0c12a4c15c03f9a89d4d +93c77d5d220e40affa7269a6915c076c9aef4db552c643ae5d560a79c955b491c6346ca4cf11cbb7fe1894e28d47b065 +802e605d2de745eef6981d88e7a57ef4046a2062725e8080995374cea2b3273c27f35b7774d0dcba014710d8d6c501f2 +82f7169e6ec9b3e2bd450f35ea2e66d06bcf900acf5b73139677b48e078ce2e16599103027b2326770c99c0a690f2015 +b0c8581879439f9b997551233fe2de71aa03604f9cec37a7b18c5854342d9b67be468f3cac4bf6f64fe8a0066248c498 +a3f626848a4db6e9fb01cac90d3362ec521e969ebd5228af694ea3671061476149f13d652942ac1e39f65591fed740f9 +88a8e759b9cbe16a7c16e43f4afa2de6100d2eafa4dee75ccd653ec38c919013d0a6b35c1ee1eaee7c1985b58bcc9e92 +a3d5fc7aaea072798490616552d947e95f49cf02a420314307aafb555287ec607d75589ba24b009cd68299dc6f7942fa +a809cceeb84f9bcf3c3ddafde3041e7bc3b1d14df8830ab849002176a0725e6f16f70774d8962cb0b8ac0dc43c4ac66f +b8f2e46c031cc8fa160a08c2ebdfa85345ed14771b06daa9636b0e7792b7fddbc501dfc85cc626a01104a43a7d3230c3 +b5367e2a521c318b802ce16ceac80c4b8139f73ddb10ddf38433397cda70a86ea1f051cc55626a4e99d27f30f3975ff5 +96d963660121c1441cd13141279cd371a6a0aa18b6a20761b18df60aa9c14e13489afd83695a0921d5232efe72045f07 +80818d492fd85d666bd91aaf6257b86527fdd796773c793407df1d4a0f91d74649a6bab4d15155c36ed4c6e0a32c5636 +931e22918905fd6c230d3d867ea42861f3074d320d14e1929031924c8ac209a5c552b679b24563bb12f9749b4ee983bd +a4de2c333e74ed9bfa3c0bf6a0beb90427abd9aa4221294cda74331646b58ef46ed57cccc8798ba2b9309894b17cfd69 +883881554c1d88c0ed8d3b6dec3d200f6fea69a77ace3e4d6f86b41506a23724b4394ec8384075f9c75c3868ba8a8e8e +aa0539ecf6ec9bf06f24443027f8f24b6b3d8c5b2084248eecd4bcad3c9a69716e1a0d01057f09a65bff1006ac5e157a +856d74d44c943c9e809b42dc493dff20eca03cb0cf5ed45108c69b1f90d8592a53ae8100e99380a274fafad23e74cdfc +9188257446661c88da093b7c5ce998135913f63842d7c1586065377b169ee35b062d925367fb9b909ca971f1188667b1 +8d3aa57cdafbe998938787479f5d590c1484c6dbe94e6c487e57a746ef5252be0eaa5976d6270de7db64b6b92e57a0f7 +b8f4d6997240f9eda5aca0c43323a828d1563c491b3db2087f60ac4120a3fcd06075fb42bb19d0339ab5ee3fb7db25d2 +ad247ea94b8ae1e81eae4c9fd7b39e6601b53cff47b2547ff90a3cca87192eae28408082774a1fd14bf9ab459b7a4f1f +9598598070f8bdbcc49056c40971e673726cd8c1bc4baa0b5124dfb5fb750e7baa7a7df18eae2bd91955ddcb1ec67955 +b874131ab1608667fa60ea29092d090859eed1812e90c609afff96d79e82c5ba546f617f4c96fc32c9bba97431c1e9af +b00750a9cdc75c2a54f0d3cc99b0fe02300754f25166f7ac85ff41ab5e9cfcca33a29be76a480f12a2d410c7cd5032e5 +84b5bd1c90bb6c66755b28ba4af493ca1b0c3a4df9f436aac67d2e07289053f925cf6a149a84e74e1027dc8758150179 +99caf64bd9d193ff306e8ab5da3f1bb2a190a60c3a82099b8d03d17fa810dc53d176c21379f479e828f60d25beb3ffd0 +a8fd9de502f1c261d5733430e5a18d8b7892a98c9529a016fc2ee53892ae965dcd9c75850bcda4c7edb980b8d88e60ea +848c02cac636e047028a3fe8c1bf4066fb7591b96b0340f8fbd476ff01b35fa3e37d309333771a134f24800e5f3f9289 +a1eab1a06dcca3439f0166441e7e7f2f5b56f5f8aa9f45e411c561f556e0fb71c514c06c26ac53b49a576caca5faac3d +aa603f970dcbe953e700e61c151182c8d32cbbb53ceef572ac93383db33a4b098b5c7b267e42d514ca66b740c0925efe +b55fd5301bd700ddb0b4f72fabe9a91ad49759506101fa802ed1677e9553595aa4d2c66f7574e78d21ce882ce0120ae7 +829137bc4da7b4886d3d04d2c39cbf4b1dc40c813ac1adb425c7b9abf9142b516314cab79c68454df5d71994ce416144 +b83a3a22735001f783dd48a01c4fb3598a51ff3987e842b8045c71c035b9e43645a55254ca5911a5676ef4a8af12d056 +8ca8d463deb13f9eef5e533bc39efaeb0c15631282c5c0deee1673b0053a7cccd514af09801dd6c158caa159fe9351ac +a9ffb1427828f3c456b9c8cc50782de1ab0029b9233a0fd998bad0fd014d27e15c4a32d1e16ad41bff748378b5abdf49 +9627e29f725ddd86456aff813976bbc4a836f4deabf5ad9f73d1a260ceb30948824df9c8841e6b3c529652202be181b3 +b52c988647fe3d9276eed3c262e1044f57fbb116c64cf4f207235c205b3fda0f3d789bf90f5217401b468d85fdfda404 +833bbd6e2924f5c4446cb76b881d1434a5badce9eb9b003f85d076e297ad7ef45b822069fe54d17427a348c3263fb838 +a067a36352db6f82a116cb87d3db5f60b18576852409e2076cbbfc7843af78866313a4969385a40271051dd195d51116 +902b99545971f9a103f99d7399acc347ac46fe156166e51deefc0e92aebf5893460c69aeeae11f5af9f49418e289ce6c +9206a0e9ce9b9880f29ef0417c96931985f5d83bb17cebdbba4ff2af81a3d37155b04649426f698aed372e4f669599e6 +b54a5d7c976e45c0b1d44433595eae9d1ae9aeabfd58cd5ecb0c5804756a7b01c9a517754423b4714a3695533a3114c8 +91b612131e84580ece228b81ace83da0269b53f94d3c02a1a0879ebbd81bdc252064b3d03a7e140b43a90f237d9a45a0 +a6cead3b8607eaeafe37135bd6de8fbd16f806c131eb71c8d36bfbe295d45b070255e50dabf076e2c3f6b8699be71d6a +931da21e67b11ba6ce438546a24d063bcd51aebe39b4220a78d9c0aab88b2d37969b5ef3502d835507f9c8d6d006714c +8fda408caa9daf01122a2308b7b9d328f52e1e2f138a8bec30492488f4d710e5e52524a6455a3a2ae2818ec8a610b650 +ad8ad5c189644352d90c462731c46145410e5adf38682bb80f95495dd64d9d13782537d68690847bbb06c6be7175dbc7 +87bb5cc466ade60feb0961421c3fabdc8a7e20f11df8437bfff63d3f8bd25305002a396c9d0fa4fb9a9986d4717f12c4 +827cff72870ba00c29064a7d2b4973f322d6b6de7924c93d8bf8825e7a0e8478c7748f90f5c716bf83c55b2795d315d8 +a225895a8e94229776ceb51b05356291f2dce748be17a60d5aeb33ef8507c368bafe5d1d6eea927f28b9d1422b661b9a +8e011323ce670ff51c964241a6b72e0e0ffbb3ff9bb2762492323fc3a4abf4718091be0945287c7329850e4f74462cde +a2c03c2e5f4e9d3ef361f68b188451994ad1b24de9f323370559c8abfcdc7bffd289d92e78a5f6b104b0a12c84dab2ef +a22b4771116ce22276fab1fec6826610707ce8a342f9f60b079c4e0259dac3cc41c96c560dfd0ada6edd2828f7c0e8d6 +97c17441d0af9be83b42097aa8b7cec84a253b9a2b957214b8fa93c26d2add46144faffa7b8a55312059b10690f711f1 +94bdf348849f31a2737cbae5e5848aee711067bac85c11c2e68b44c398cfafbf3493a3226cd1ddf7a916e7613fc7b6f6 +838f59c6e8469a8ec6fd40b978a3607439aaebe1e50ff707eec72c0b8278af05b477bf12a384b56d03e3d4eb91e56f67 +a1940f0db58185e2b3aedd2b0bc2b73b4a65c68e09b046f38e9dcd4e13c94f5406bea92635190bf315e48ec64eceef2f +b2f4e0ae44e1f1210a91d8f280f17091fa994034ba8c991583f8182a323e9b3001a712e3584fc2d64ecbf2d319d076b2 +9342b89c721338d02c7854cd7466fb24d93d7313b6114ea591e6607439c8ddb911d1cf35f01898e9c557982bdff8f9b6 +8583fcab15be1dd14d5a415f4b14d706c8c62f058500f1344b37730c8be6741779691f87ded3cbcf6516468b373cafb0 +8fa9587c7989646571ad9032f34cedd353caee14f5be5cde1e9e0a1710f90c08faf6fa96a60e1f150f761c9c8ae7417d +8d9ff904cc08141f5a9879f5f77dc600e6edbe859082231a4d819953890199bcc5f940b730ea688332f07e5279d49e1c +b5f82b46e5ef9a2df8d144202d6e2e4f3bdae8e2048d2af5ea7deb3f722fbe6d370401954e74ff0d8cb1010ffb1f38d5 +a3b5b57d435b06ed70530e060002a8fea71746ad07d969ca23f22b5e52624527595b6a6d54b4e953fb7b7596bac378f0 +b90f89390df6d4b7879b915aa3c29b8d779d035033f8873bb7ac54a14ec98f0d08c0e3bf696e2ffa7b5730d736f571f8 +8e81e371b92887e43d95c0dbdcc9575282b26ccebdc8cbf46587e4f2a83b61e9bc0c6d7d1f114b9d21e04fd6c180b12a +8d682947c51dffc6e0fe0a486293c9ed121f441805168236393087cf62f2a429cca60bf0e472564844347d32c6bea27e +a8341ec7dd189fa7168759240224192c58209b53fc961c18082deba217928c399bde08ceae42bffd37c1135b4d14a845 +a94bb076dcc5ee5ec82fac57c5b384c690df12631882bd1b960e1eb8c04f787bc22b7bac315b9dc5a8a098f17f051a0b +ab64e1c6f01b87706c88a3bd974454a438722768de7340b834ccf93ea9880c14ee7c2181432acf51f980d56de73832ee +b7b0058bb724d879e5ad7aed6230297c54cb599ef659e86bf2cc84c38225899fb388391df9b2e6fdf063171937fd8c72 +ae856f4fb74c27cc98b67429186e7df4feb01278cd57bfd3170af6e52e0a23b9e926bf9565a890cfb4ae8f2d590b2cd5 +804b9c6702f0596d328f92fc1ed5a30a7ba17b9204524135001b569233fc4937035031d079f52fd04968f37c24013898 +84274ed1af6bd6a968583995622b4d18c6a2bc703ce0d0edce45bb736529b4836343dcd11911a94a134dca7877e6cab8 +88808098463f7505034c3b6328c8a08186b33f7a981c08376e429dd64b79b97753170531ed078dd265ded4ec0a1ed8d5 +92823bfb23a4eb84d3759e7d717f0c8641ece0927cd2ba8c728c26bb35df2629a838002f353c8d3d75eb19520aab5f25 +8db36bae4d960cdb9c51f419d7ddc81f372e56be605bc96a9d4072b829f05527c37c8f255cc6115300a2a0d2e6568d89 +a8fcdbd7f3b4d7ff04149a209feb75e97149e7efceaa42d66a6b8e432590fe7bd01f1a77fa8b47108f670b612e33fee9 +a9f4c53c62db7e5dbdea6918862d3c6d24b5bd8732a218edf0ba61e9d1861182323d8ecd7bef8f895b42970b492f6e40 +8b95bc7f07818f4d7b409aff8da0b2c2ae136cde386f53a71565cae9fd14c73c13cc1cfd79c0f97cd77839fb738c5b9a +adbd1d11adc756b51a571ddbcbf4392415231ddad93da09acfafee03a9e4f9e1ce3826110619e5271feadfaffce3e793 +95d327c8bb195cdf25fd79c98f9406a6b0316214b1630ebcce95bdaeffafa36fc1accc6882e0e5d13a8db5c0f3c0e61c +8cb2f1e2fb25558869afdacc7bb866544cfdd566cefcd048b48d458a886130bd086ecb7600a960a7f2563c61cb326510 +b3aa8c4bf5b933d89cd74ca7f7176d6624d562d7d58b041328b49d7562a30b489cb606abb3c49e85baf04c28e9cd1f44 +97f9053a85250c420599827297453c2cfde087065b823d9e43139e6a9cac3a2ec40a1b6e2f0726bdc870fff215462f0b +878d5dbe6b881389c2ca126ff66d87127c9aaa3f62f0d2c1ec0ea2b279ac95f8a06710dce166415db227655e2345a04d +b2c33a6b4203e3ca5247f0890e475518317ffc44cfbb1da9a1ba02114e8b752bea618050b876de5cf3b1906140a64471 +a56170c8313d2b5541a795bea9934d4425b185b5c409f0484df6f44f0e4bcbf50b860ff46b7245cd99c1cfa8fc1965b7 +96e2b658e2876a14147385fc423d2702a3cb76962b6b437222cf9cea39ebf4bdc03bbf434b747866d4bf72b4ceefa639 +89c4a74fa2f067e7ae49c84ef782c331bcc9245db7e941804e2e99d12e987b4d25cb827778ad4c3566c4fc68018650b6 +a01d30cea7d01c80ff26650020fab02e78fc3842e2398a81b44b21d58d4e9816166ff4ed2418831fa995a28ff35cb6f1 +b960c80b55a8845bbf24bc3f23b0110ca701f9544ab6a5bb7929330213cb471321e55c390ceca3e24bff69bdb0d331c0 +802c5b13f22be7be0e5db11eb3be0f0ea7f9182c932265060ba05fba20ea093dd2810d3b969ee3e387e60fe6ee834e8d +92478f88ef7435d15e39a97916c736abb28ea318394b88678fddbbaab3eaf31776110936abad116a8ff6ca632dd12043 +a6d3da0370c303001d5ed99d1db8bce1f26b0e442f0f042e36db9674e92dcd6e80465e772f1e669f99221caee3392fe9 +938f04f70a8f947d6df2f0c0e9af3cce0c06edbb3c131970dd60884fc0b0a0959c504a2a36c3ff76dfe919905671626a +a7117e55224230822e9983df2132347eb7208cb6798f291df926ab51e04b1a1f78d5568c9a8924ee6f57426134360f20 +b91074c77ad93fe48dc2b10c0c5a62ca3ab7d98345b919c52d84a9dc419b59fc1b267e1c2d4b2e120016ef84bbdb0cbe +aa175c6b6edf02fe8778762c9575581c0ee6efc9dbf99c291a41444a23a056b893be6c45333d907d0bbe9fb0eef84d08 +ad36dcb4e2ab425aa339ae464b038d550cb11186741dcf257f1b8b80ed4f32ffabbece45e2dc1525d4c3eeed819ea04f +91cb35c1ffa9cd5aebef523edb8325078da3eb5cf9e95c675a76446fc7692aaee6f949de064ca2f3e0f082cc3fa93e20 +82622f9410c143a86bc4d756b3c7b324dc295231ce865de020d61cc0868f2c150a473cea3a5b756b36771ce1032415a5 +a5c29996ad3a53468ece9356a5b4ccb68971ea1c89cf39644f1da2d4a477c2ea99bf791ef902b87c225d8c53d67c4c92 +92893eceed1af34fa92b23dcbab175b6a0188a27dbac9ad3317c4e39955a763cb383ab13fb1c519cde311d8a4d12e8b3 +8a093cb191b94b0200e38d31955f9d240e2be1edcd6810a2396a061f17c3ddc9c4f4d56766ddff4e121be7110e03b869 +93981473df0cb1f4b47c7d9b64e3123dcf1593845b401e619f5d7c70b5dbea375d1ca43fca65845fcf0a6b2e0af43791 +a6beb6b0697070f9562910add88d9ba91992f8da127b27be81868b1596d1012f09ea7ed601b4a6474c921a1a1a6d866c +92026b1ee30f2ed61c9f30337c3356844217926aabdff383c19ca3c21e0bc49811ca5b308012bee4ef250cfae1615800 +ac0ebaea6d35f84dac4ce648af096305ba68a7a0aea0a11ab2fbe3162075444a158433c98141bc92ef3b3400d6deb46a +83046f482dee24ac3ca83373f0d1b82ac1c4beda0f229a9011a81ec659ff5fc1fb105e219975b5c744308c77a24f71e4 +aa5a312c47ff7248dcb9c6ffbe5a0628ccd565c07365c4413734d415cd4fb35772622ed833862dddff520a67c509c6a5 +a02fb88805c34018ac33582e19ed0a7e4616acc3dd0867e5f21914c2031c05c6dca30b8b35b57c2b137750f3878a6f8c +a60528f1f14bf0c496491d46a0fbbd6c343e4eb3f1631e92f96a3c5e5c684091aabe5801df7a67f7c6dfd1b0d35269d4 +a1fd8e7fad8ca05a340c05a051bb0eb4197eed345f4104629a9e38e234b09d789cc5537024615feb4a6177d32d39e39e +8e70e36c1aa070815440e19443f1f04aae23b1b59fdbcba43b47b94a026c82c8f66c5dfe54f826f4d95ee1930cdb8008 +8234c1969fa7e9079661e4ca309b71b1aaa10f4372be0b963205c23a81f5a3d52ec08ba9ff65b37f832b52d631580d61 +a18cb4134127fb37c4abca328cd0047378a2e1423490af2bd3eba9ffcc99ca81a3c22404c0886f21f65c7b93c41d7981 +b46fa45fe538816de776eec086e040005706cb3eca097e290abfb6864e745c879868aac8361894f3c3564373ef9ad55c +b96ca43b96c59e95439f75d1e726a35a9362f0dbd34963b156e103e080a8126a8dc3501f9fd541ff3bcf4677f5c4a86b +a8e8c87c7301613818d57387009e601a7ab5cbdc2890f63d985c30c74f9cea2d0584c116baf0d9cd5594386ee93fc661 +b47e4f1b9153ef0981f813948150f283b47a7346fd9921d51fe8e4daedaef78ddeb4fd467c2ccb7cebd9816243da1c6e +a370c202a99c8441ffe96fad0f801086d4d7cc7b960f6e98cca29ceedf492afddfd0f351c9c4d29ac008bc255ec1a2a8 +8f5e6ce1655d1c059b006174e3f5a55c88e1821c97f9702ad8e8455d46c2a83ae4482f2d43edda74a835686ec45a8a15 +a30421e694930a3b65d397b2720d5f8e1eec2b6e2bb5a28d3f9b0a84db9aabd83850268bae64c2b10e313cccf120151b +8abe87163046f7a9b18e2a3c0b66e258facc1b31431420e0b70354b7a60ebd250a784634a76692e7d6f4330b62114945 +894f033cf077d4eb312e3258d9dca414356271abce1d6094ecce6d018c5fadb1c15d8d69451574ad0701a2876db191c5 +b0923d64f88ffc872654e1a294bb1af8681689c21cf08f39afe51448a68e60a9a0a74ccce9969276a932a52c07d095a3 +b9ca23b5be8725fae7fa710eefd45522889c50c29c26384e00b78a962384f0aeff9d15cb5910e9565da12a577eb7e5ba +b242ccf292757197a9f470f2d80ccddc48c7f1235ba026bc68a93be2738bc968e8a200aff3e2f4807216442eb3fc50dc +adc2c3b375b308524b79a024ff87d122055440643fea6fc0a651bdb312c7cbe6a456afa9d342bc76446d77d8daf08bc2 +ab645955356c2ebf2f3df9da275e01daf0b44a52afc309277d6d9ad1b05484e5ae0d9d41ad485fe481e5e362826a86ae +8de96ac587a4449fcc8b7fd0a51b4b5185d9c2eb3434f94cbadd092de1e26b0f6b3f7b15a37e8424b1429121ddca0ecd +94c70ad4e9b871566f3da98170b665a09788d421818299857cde0853789fb943cbcf7d4b2c95246ea7b72edc56a8e36c +b2574be63497843340700b701d5cc8be6d23125bd62058802ee67cce1f3b5f5602b27c93fea5611f27dc695ac563f042 +869ec89da7850cedd88bcb3a50a15cece233119b31b64a61bf6b2310892ce42d8b473b584b11e61db29ed24ce8033f83 +8fbaa269da8e28e9adf4c1b08f109da786dbe9cba871c32eecbfb10619b7a5d65a26f9bb33e201a8ed20b3de94003fbb +8bf7a059c37242caf7f821a6314e4e4adf799e0dd86b37892a7172598892c07272acebd05b534755c57b51556b2d610f +b4e72645fca459898cdd9214892ed08b5c99f82049c0a30d72bac0b9717caa9c6cc16c3dc7aa6ea4d42dcd2a6c175df6 +a39170da87a3495da55bbb9701c5461f3403447174ed6a4af75712f7ba4ac35f51a4234bc4b94da888a0959ee109c0c7 +b45675b2774ea7696089dbf7a0afe6c22e85fd0e4ef3db508fbaf96c9d07f700c991789206da9309fd291be696357c5f +b52899e3e3f6341eefcbe1291db6664bf3b6e8021d32fb9c3e37b6258a35c1da927747b2ce990937d6f4c6c3e7d020d2 +84e5bdb3dfe19700d79dd3fabb0159ccfa084f7288db836c855b827613ce8071067c8d7ac5cc2b4e88ed7f84b690f6e1 +801477d200b6d12fc6e0a9bab1c8211193ab06e44551e037a9b4c36fc2d4f67760b9ff4eba9a3bc7b6e177e891f64ff6 +b6b71a5116d3c22af26a7530f535e9b7851f25a84e562a8f17a125d55b9b3fc1bd8cfe65bdcbeeb328409521e802051c +8687e21c34d7804c12489d30680d131ce2133e2981bfa993afd8a8eeda958ebd5e6881d342d725338659882d9f21cf98 +a024e97a7c4de32b6383c34431994abc533ecdbd6be9bff836ec1af022f5a86773bf345c6f33273797a61fb70a8fd5d6 +83f784f095da20ce5b31f54d6cb14b32a8a12675f0029289c9cd036b7c87a8077be2d04a62618685720e6ee69c875e97 +b4e9dfe7cb9d9efd3fe00d99ae5e48769d4af4bf43d4e05c0b54c9cfd8bc854de96b8d3ebf4dcc06b9dac66b7471a0de +a08b79f9d4673afcf7f38b57f484f88feb7c908f597663a2417f92c348150c2be6b5603f914eba0d9d5bdd4e5c5572c1 +b0eaf919589988798cb01ba0610cd1b7fa3c08715675ece8ecd5f9ef6d5d7b2c4c8ae1ea7dfd202237171aa3e6f9de74 +abff99a98baae4dd0954052503ce81827781694a5ea8c1149f96a3adde75dc2d630e138598cd2ae7fdc7a654aa17df8f +83e369b8680d8b9d995222b033b4f4f3e3b20e782113c941325c7fa9c742feef8747e4a212d9aa23285a259cc4faef8d +b16d5855dd2716613697eba36e2fae0872aaea6999e91cf6552f93f9a0b85ed4f6ff922a91b50816bd6cf8e7a4513fc9 +848373db600e32e741aa1d37726bbb28956783f89ce2d781e95fb1ee1adf4359968a141678af268077eae4c25503204e +93a0dd0fdac18a31875564505b4e28f9e8bb2915faae666538597731ac56cd77f23f2456461e2f672983fb24ad91f6e0 +ab1ebbe49fa56524b564bc2e43784147073e6ea5d27a9540fbf2e04d0f87c645ed2fd28b3e4982cc4c0af1734ee47a6f +b3ee30b733839edab6f61f0738e3f4afaeccf700d8dc7415684f193b36d70d07acd5780cf539f12e0fbf8d4683be773a +88388f2cbdec47a6b3ae460b69eb0d2130ac14de950c22fd86de03e40d02292bb93cebe62432da39d509c1289f785fef +9370c41a54b68ff486b4cc6329c3a851716ebf1d088d77a6c56dec93a18b8a77b596cde74cc17d2adb2b2f411a2e4bbb +b9083b60dc16531f77b05a955b51a237a8f8c0173d72c352c5ca441b55abbc890b14937e457aaec4be5cbbf80cae0099 +aafff8f6c6ebaad952c65054dfc7c829453ec735331bf8135e06406b7a9f740c9a200dc48bb2175516b41f77dc160121 +b43d31fbbaf10526809e9e5bd8bb47a76e0fabd7852ee7744404559ab89f0f215ff518f3271a6aa972a459cab82ac558 +b581ede48c6ef34e678f91dc4b89507413e00e70712e3e8c32a80eed770ec8d8b98caee9702d068aeaca6f704be57bd8 +8cb0a137e68b001a5ccac61de27cac9fb78d4af7b2f5a00b8d95d33ac19cc50c69e760c5e0330a85c0ded1edce0fe6f9 +b947fca07c7aa6c2bf13048275402b00b77b28f1d0ba4b589fbcede13f93b5b931c588560ab8ceba23bb8e748031b55d +81753cced5ff819901740a9a584334e355b497cb699f0be5a52cd555a4c9f149535c7bb355b54407f7f0ec27de6c2e19 +b3d59273951ce97838c4853ec329782a255b5fc7c848e7992ded1be28a5ada7fa3254123afe32607b9991ec6e0659b08 +86b253de246f82be1cb0cef01e87c3d022ca1829d2cc7e6a160a5afbd3ca6b94d75739b122e3bb16f8bde28a8f3223ba +b728b659fa2d8487e061a37f7d14a4c2d70cc37497a8715695d8d332cb274deee2ce23b9b5f6a7408516c02c3d526a49 +81277b46d98848a45abfbe39842495659dcbb80dee985a4fc91d77d52b815487aa8bb455f411fcce4c3879c7a075a93f +b05b6f1fb4a6e654f0ee6b83e08b58b57059bb0b7c490405bc8d963c4a2d6be39c558917977e554e1e9e3169961cbf3e +88f75fa7d016fb6442551ec071cc1e2beeb3ccd213d16d744f573a82f5d70f41dd1b18af71d5f9e73d87f2f6b7dbe889 +81a46434f1bbd65a661a0ff45a0295b8fd8a42a7969c5953721bc98698b64bddee3f806876d1e9983063fdd0c11f99df +8b4f6d33c510a4c9c7d623d9ae0c9aa631fcb987704726b2a4d8519372123bce3c439202f25b5b47045ec14ce39a21a8 +8d5112b330fb63cf6ef3d2164b404c14ff9907d685015701399a260951912b19b8f270f869df317e9050a127763d7980 +aadab394e84dfb82db15ecd2427f39b62352c3e1647c3bcd14fb24ae830ad0116f0fed87ddb63963b424a4741961386e +81ca4e5600d00a3bda24cbdea7a532a4cbbd893c10e7ff10667c15ffa8138b91667abe5466b31a3dcdd60155c48538c1 +ad943af1b8a5fcfcf309ed8f2f916339f254cd555c71a407a47365a139306286a05a8314e1c70e20a65fccd75d36fa12 +b16597a0b437060a390467bbfab94c0bdd695ae898894f4689f939e30cc2119cc08ecb594546304adf876f4e275ebcd9 +a44a4e0a6693be356065891c27eefa040a1a79475be53d54d5fdcea7e0668ff9b35f850974000ed119f6865aa6faa721 +adef27d1b6e6921f4eaf69c79e2e01f5174f7033eaafdd33edcfa5119af23f3a834ffe1bdf19576581b797abd1865b34 +90c1e9202f3ffe28f8e1f58e9650dc4ff4dbc158005b6f2296ec36147e524b4f2f87f8aafc39db5b006fe0c491c92f45 +ac817cd54288b6f7fe6338415344fc9e7b669414051631ab2f27851c052c044be06bf7235d668e194bef695923256368 +ab14944ef653a14456d4ebc12e3196df3f1b4707c4e50b317b5ccc8ca3a0720f0330609f0e7e71793f6ca01583f38c70 +ad5353f2f380837e5ffdf079350b3d42935a0517861d03af98db5ed3ea8501abd68885c8c65f5a66e944b1874826a450 +8b5583863f84af8443ce8970b02e26cc5d959e47efbf8a66a54106ab165f1f76b36423aee74c7b5402fd1c4d7c1adfe6 +b3b46037eed9fc30e4f8f0da8bdbdcc40a38e22e876ce9fde981883017854aba82c18eb00887d92ad847d30082fe7271 +98a2b6fc90b7ad172e4368c1e54675b75c8bf2096d91c9f2b60b3397d3be3b705aed5389845dbd68f0f84438cd0f7687 +b155e800852a5f90a2eac69cc4483428da1dc2c31588a13c924e60a7616ce9baeb7d4b829c772b260277cadd8ed84719 +b8b92c520a1302b0cf7d993a52e1dacd7f27bda9868d59c55687d995ae676b7070af4c0792a9bc1c2635d44a4fee01bb +96dfe9bde526b8fc829eda825f55168b88e8f4e43d4d708cc3060df03437b46e12a8ac70d7788aa75760f6294d3e84d8 +a3fa66c54e2fa084ced3bd838614c6c33042f492a5745d167a723c60d5e7d6020ffd1747981a23f8b68df21ad8f0fa77 +b573ca10cc41fc04a642f6f62c355a4fda69b94b8e95dbb02fd1ccce4bce1191356e1fd66d372159944eb36a7071f005 +acd0a1c9abddfd0ea223eda1722aaada362d34234455bd1c6be115d41e535b16f12ca428da7820a757fa4c98884a385d +96f242eee99c4db383b8754fa7987c0c159652e1866faec905a8d3f010e0a1ad05bd77b9ea8dfd653738959180f58430 +9215a9b672a5d6e435e0e0a45156e0e20f75cbbdf1d14940fed3ddb63d433bef643796c7a4fff881829ebb2b2eba9460 +b8ad9bfceaf08dc5a874387219ddd1170bc3a5e25ed72d321d59ae713be5ddf9fdfbd3aa7ab163be28dfa0dd14614e19 +a19a1050590bc500b32c502f393e407abc3d8e683d6f6b978873aff3e3299b18b1f6b59e2b0fe237d819dbdfcfdc98ca +a6870fb11d4429686e52e1f44c8dcfc7ea24a020df9570c021578dbc1f9bdc8cf797cb3a72d7fc52805dba35d59f2cd0 +a7be733b64d5c06c127bd1c87250e42bfe30ca91ed8ce51e0b6e377f454e8f6fef7f99bff650695df2fd10c375da349b +a1b97145dab30330eea2cdc8739b2446a3704b64505fcea3dd8a9b4a72edf222e98d967d6fd7f76794acfd97aa091065 +b2127049907d2a3b654d1c940b740bfba3dbaf660f86ea79c2f909af7c9fe2a07a1caeb1be12370aeffaf8faa50f1582 +8a207701214bb28e99b0784e9228b1c34afa701966267fe7110f6f29f5bb41eaae6cdb98844d0400787978fabd224de8 +9925147a383b6f5f814520220ffdbf20b214225882c3ef49b1a1ca677709176ec82466fb9c4be2dfbe5640afb63b014a +8416ad93871623fb555b5390b80de99edaaf317350cc0c1ae9d54d59517074d40061f315cce8ba2026d9c1e6f6a1009f +a315f943deebbf0a2cdbcf3f8323e215a406e9cbfbcc3f6288714cb3a6befb1bf71b2a21ff7a2ec4731c65044c45b6b5 +8213e0c2539c24efd186ffa8b6dd401ad2233bc19166a0623b26dd1e93614bbf792823f5599ac116231e2efde9885709 +8e5cafd2f34a127a4a896f05e4d929eef06972a1826b3566446942198df26d62f7679b987db2b3765d9d8058b1cd85c2 +b5302b399c9cdf912fd59007ad4737255552663b1e56dbe64a7b2ddd88d2093c73ea319b45db2dd49d1e03f5bef1a0ae +a0c2bcfbed4b008e1a56e5d2f2419aa59d7dd0ebd990f1c18588de702ad0fa79f445d69965fa9381e700eda13b309378 +80a44eea1ffe24c26b16b8e2e70ee519258b9ad4b3e83cc4e5cca88ebc48d0160066f8b91d0581095b0de2428390c8b3 +84a90cb9c7d2f799f1c4ed060387a4b793ab41c5c3eaffd3b60face9b9c3bae93cd2017283bf3de1e3dac63d0d84dd42 +81d22febca276a05ba9bbc5591ee087b0491beb35b4d9f8fc0d041d642a574667ddc57660b20f5c568f7d61fdcb41bda +a3ac965ac27a28e102a439b74fbfc157e75fd57620e4c0750a466165f8aeecb2191dcf8e656f7525aa50d9c7c69b0b5c +913c17434ff0d9fc52e2ece4fec71b37d4474a18f3ea26925c1be2b250434d49759f58033ba0fce1c6862c6197930dc4 +ac430559c151a5e461f67b49c7786c97e1653fa8698e9759ddbdd99f5daf17fc5a012ae6330739440880728f24eba7c9 +b10d8e9f8aed9361b042d1398ec74364f7c7c1cc5c7f917060572761138bdbe89bf409389ee3879f93bc8032dd67b308 +937271005a4cc6a6ec134870c1b56471aa84ed4f4af1b3d5f334bc0c42762fae0c9a6a2828d3de6151a76dad7b72781c +a10e4dcf51889f69e6bd4c052f8d4036b9571ced98a3d7d779cbcb9fa5c3a82228566ea7cc1d012bf56dea0a40c5a64c +a0ed026528d9a8bb3201bc9dcd20598933e8c72fd315deea8da63d06e97392aa729d98a55a8a60fa4d5573513ba5c9fe +b723fcd04cddbd4c36feae827a03746ffef251c4f4c55a88beedaeeee194430a99f566f483668a0d88b13e7a4a37f1de +84a2cdceed44828c7c05a6a762edec0165e434e7029df617d6646aba48776e6c3b823f40689cee136536f8c93e08a629 +b786264e3a237ac3a1d56c9f4e87438dfed620c867100fd38b01287f5b755c7820937403bfb86644e082094d3e410a00 +92cc35b2065fca157c7bba54410f8bd85907a01c9f760aa0ddb7a82cb55811d24cb4dc6b725367a6a1c293b809a48ead +a12bbf22b117f00164a42515bc57cc9e6c43cc77fb737ee3d0c0cad94cb50cd3847d61cab469cf8ca76f7958bdcfc771 +85985b00de533bde2a757eddf53be79ea39091d16af3fc92327bcd1cd59bf2bf4411a334da29ad775e8ffaf3cea7d7b8 +af9eb24185b0d330d0ea1d0b0fa78af0dcf42ced81cb0128f16cafdea687a9c5582bb6d7c5744117b271cd0b3303f0b5 +8c8aaa1d85ed6327f85d579767c7a9158d209171b3efcb3e8a9d9e534c078e821b6aade255101d2c9ef6d67ba66f10be +a450518a03ffb40e1df89e0f88fd55b5b06f4872cdfb7ec55f40dc40d9424b3b289866336c195bdd54597d95569e0096 +81e61cc69f93c435bd77f155e80626a9c764dd92b6c76af15c41346527948d8a6ca87d6351a0fe7987e2ee3aa66a9625 +b615e0cebf4fdff4cb23a20c8389c370915ba26aa703b28efe4ab070b1603d1c5b6541684acf46b52a915f6aee447539 +a7f51885c7a71885cc84ef734ecd107e8bf5f7a25131415f671d143cc1de92859e65001125323c7985799993af6c410d +abfbf7a46f32066989c32f774edcc68163f085ca81e94fe8c9fb32f8d451bbb2c20ac45cd8d97f9e618ab40186933b1a +8cf35a522b5cac1934004aa9dd236bc77198d43272888afa860cfc79b4b28dabf7a3c74098f84510897566fdd609aa45 +86aa927df78f7a06a4985eb0a4f0b93529cef14f9fd2812d46abffbf25e618ead14d99c70e3c3bb2e17f3f7fabc9c264 +860f1b4f4a398e9a8bb4739587cf96979cfbbe1687b7e91e5bd1198db726391b09b1a261bf12e96698818f60b5bd3537 +8e7c4ee19ff115881051e8637dce1f5d6c65e865d0c757e8ce41b6d7bcd86c7070cce60649692bbf28c868c7e2e1e2f4 +acf7ba01b0220419f09169ac8d16e5cc13dce08e88c90b8fdfaa33aab417f011a20b79a178d8a9f7211589d2e0affd7d +b404bde8e715aefbb9f20a353b911b79173ef3e2cf0aba98b5ae6190b90597d65043b0b4e014ad9ea6c77da2d213ea12 +97e3615d1c77a402253bb55da2d1cdf82de316cefffe42b1022c94b4818d6dc4a313731db85321c537914bdf716a875c +940e950b96a4096a578c6874d747515936652b9b113a5f27f5a834a610867b05f9881e2679b0b289b8527baa0009b6dd +8de15a13ca236a3a285ce6e6826c502ae7365bbe468b6e8ac67b15b0bb49be0e996f1eec81ef69e4b7f54f8e4779a054 +a12244777eacb08ecd42b5676b3a51153022ab97e9353ace0f47c6054c22de9ba60d2a60f59a36841c2a791cb1b7c288 +94f7580203e39a2642ee2e7c969b9911f011d7f3a90c398e1302d26edb3df03df1d0c43baa1c6cf90dde95296d49e742 +82ead33144aaecab965faf63af384565992f38fc1066e71e33d53f43ac93892e27fe78c4eaca1cccbc53364e26ff31e9 +a0c129e9706d354249a7f8aa664ccd7ede89aa1445c5547410814b56d10dc086720953363ab1da8ff5f1ed5d8e575104 +93b3057bf3f74edc95237781ae012cc4b1d3fd0455565ceaac7110290aa518ac32478ba4eb9851555fa87270fcc84f1f +949c2fd0b94f31f7cbf00c679bd3f6ec1a2f4056654708d39edf1a450b4e19a6e251d0bb24eb765087e698f61d3fca2c +99fd2e50e211ccb66b895eb2fc42f260f3ad5767f04c2fe238b81dae98aa6e3977443a51f4fe7b43f499caabe45699a5 +84fe19626503218f327b5325bfd7c0c3d2614b47d34964aa0259d564e769c6c81502132cc1765b0b31fbe39852706927 +b43287ec29d9010bec4284de58fed48dd1e129bac79f09d45153c9949131782f77b11b0c9f8ee06a39e5e9bbaa8e2c6d +908902f3ed45482df2f94415fc8e5a308057a40c8905d7cbbd58ec4848e19276577b7f7e69e5e684a8b981738e10f7ef +85cc7d9c1eae372b4f88758cd6e21604b4bc9f0794e1e74b6d9de96347f81944d01331385fae7a38e5f6096c1dc23465 +af60288c702082fc258b3dbd6952c6b75c1641a623905f491b1e72f49b9d39b33d150a336450abd3911a4c128166acdf +a7d8ac7e589558c4014369ab6f4c1f2196205b03e4278152ec0dbbd7ba54e803c3369a71d364a773aac8dbbd117e4a13 +9833aed34e48c206e9328073597aee1123f5bec085339b4e6839a389a429bf3042798a31fac1464ce963204adface76b +84631a4f012bbb62133030224b57deb32dcf464cacc8ffde7775adbe68707263ab5527a1c75e597e03aa703ba658b889 +a686a61f6467858a2a4c13e70ad81b1901290d3e51bbc0c6e366f9e652f575e91b11c75f640ccef8b0c6c1b05a43c9a0 +b585f0ffd5144907703b41539bfad7f9f058f5985f63db911064ba6b07af8da2796b84b16db42b8d11135c3f846cd9e2 +b525539516c7bb25f1d7e165f269dc8c9eedbba74df44887e178ab8fd798e2a31f39812ca922d6b64d91564f14012a64 +91e480d7568fd2fae39c35b0a8d623e66a3160fee1dd4e9097255004938b11ac1cd3918dc6a1e5fbcb700c95a547e5e8 +936ef55c69b842b6177de71fa48dc5442bf5132116b214302f8f242ca36a273a6bbfbfaf373777104dadbe8e7da5e970 +8e950c0f6688abdff8a3b8bd77be6da6f2565c7b55711f5860ea62a3ab1d51aac31821c602bc11a45e33c69e7dde3ea4 +90eed4595104a0527f8db1e028ff622ff70db4eae99cf47f6c2a0246ec7b103570a6a9a877e32e9647cc74969006743d +b756344f6c4ea05b792e416d9bd9ce9dd4bd904e7622761f28a85628506bfc9d88a25e5f04db62fad30a92fb1d8d8556 +ad79ba76534c1a02ac3e9b7308d390792984cd75b7e1d0e5e4ff123642d99d4ea1825643091aa8117336333c40d5bd94 +832b08144887de0c0341d84f6945450af8d7a4eb32367d7703118186c1be525df9382ce61fed5f3b65a0bb3449185f7f +a322fb944e46d8e47994820890c94af423674716da810ea1da71e0a7733ad72c22114ca39a4b59c98ce4291a5684c154 +b982851a65140dbea79bd3b5487e236feccee051deddcc17c2853032efca289ddb6eaf64be3dd85a73012fdbe9d2d4f3 +8eed5e230e201830b44b9fadca4e156fe1a16bf840cf29da0f381ea0587b20c226de2465c67e6268973e776809af68e1 +81c8f1c04490f36e41a53ee1b5185cb8adbb37c258fd6c3be8c56835bf574c37183a94d55b6554fca35d6e6dd9af0133 +8c4928724107cc16d36f2976677eac0b852fc4c3c0bb2f9cd4d59cd24a113faf33b2faf405c3fcce25be51d41e42c2c4 +8e4ba842636fdfc4d71f0983538ea5037d420acd26abd12efca48c252eea85544b2fa9fccdfec4e7c2a6359baffa112d +b4315b84700e26dec26f3488d308430fdff4809c10d4c24309627911cbb769ffaad0d1ecccd622dd02194eaf5ba59f91 +ab888308f757faef32648c1db01650dbc9aea248b09d06e6efcc996d395f48ec96f2d54a02de441d753fe8737862d991 +805094cfd77e207d5c75f3cad99f41f763ec15443052cfd758c6a82ba422d831a1103a7f9b100da49c28198279c3d3dc +ad857f33243e4a2cd2a773700def21fc7f94939d1a6d2c2125ecd58fc206ccafb07a2c02a1cfce19857d3654aca2c70c +a4d12d40149953daa70b89a329e918e9d93efb4e8004a9357fe76682dab9662c8507e16db83e849340f05cdb4933a373 +a0dbac2ed4b5d03606524245e8a31080eb5bd3e9a0c51dad88c3b18e3e6bc5d64953a81c8e60425b80107ee6b62b1fb4 +86da05355900f327164a78901f6e3db857531b33b1e855df1a67a9ba222c6b05fdb6b0ffbacaeb1ba5b45ff8979b6b68 +932c9873aa3e226dd922b5a616c75153bd0390ce8f332a414b9c8cb6606c2501a37a2aa88097bc7d8e2c4261706eb38c +accd9cdf07ccdd42033ce3b105e00bfd39e2304b1e3d66f8b1128645634452c20f759ec45adcef2fdf04408f62c4cc04 +b75cfdfc1cb48918752eab17eb579820ee6e71e6667abdb64df834ffc8c1362fbbc23ca2c80dee248fe1fbb72d87dfc8 +88b998c73b00638fde7d3dd650a08c5ab996dac6ac34251337fbff3fb5ae4a25dd20c1a16c987ad7ded19eca23cea891 +8afef0956c942571a27f504553fb312cca9e50ce41b44e0466d0516c5abe4d8acf4594cdb03b1ccdbe3f2e6a9093b713 +9042cd83c5ff261e9ebda26398caa16cac2cb840d19062fa8ae50e044c27104972948318f4c866dc4d578798272d3e49 +ad536719a64570a2cd1d72b6590ea1d02c8c49f259a7867be26c8191445165954bcfad50ea12688ace3fdfb0e98143bd +97c86328d63d297b6bc9718dc1ad5a05b908a750d1c455c700d84315589128ce4eea958aef2bcf0fcf4adbd8e3ce58d1 +8e592cf0802e6a9541eeb654dc55055e11f3d757847285197132935ca35bbb1a9156829a39384dfa6f645ff89eb36738 +ac16c614998944f77590bf3913a010e13f2d3bbf6a172293baf5983506c1a2d89989fb72e598f5bba1ea10a691377c93 +ab8e6f5b46baa6632de3621497bcbdd584decb999fe7d8a3364843a1e0b76497600630b6a24dd30119d8bcbfca29f335 +abe1d3af5279e60122d9cea8cc6581c819d7a0e20e3715da0f6da7e02d13a7653db643bd946e2fa9ba338eca81fbe140 +8c33bd831ecfb18d1d0713e16beba768e9c42df62170c1f8a16764912be77f2ac5915623d1d25e8c462aa9c2f6669ca4 +903692becae4a6409f7bdb127d9b11de57a5739fe24218dcbaa0092648d5332dfeef29a908ee9e43e5e0a51a4c3639bc +92591e90347ae286acd365eba32cd9ad8f20f4c9cad2dc579b195147ff290adf0d776bcb3d4b04a25d68a941fc0c781b +b64bbccf860299aec16e1f95c768a1f337c740bde612e6ba260e393edb8b04540127194761c42597abb9bcb771c576c3 +9194f056ccfdfeb78a11c5347e2255d7a7ebd1251f9aebc0b58feb68d3e03a7dbbb74e3ef7309455853adfb4694bd01a +aa4f15f6d6a53ae65b7f6f91e8981d07a5919d2138679a561f7bb608dc4596e45ca06c9441d51fb678b2ad89ae7a17ae +90e3d18507beb30bde08c5001faf489a19ab545c177efb3f73fbf5605f9a0abcdc8bfbc44f832d6028e3e0a834bea98f +8f31dc0118c8c88a6e79e502d10e57652b7aba8409a5bf572ca63fed6b7cbad7f28bbc92ac2264f649792fc1d0715085 +a307d1067ea4c56437b6f8913aa8fcbf4a24580fc1e3336e7f6518f0f3adb9c4733090e459a3f737414ec0048179c30a +b7cc41fdf89595cd81a821669be712cd75f3a6c7a18f95da7d7a73de4f51bb0b44771c1f7cd3cd949e6f711313308716 +a9dc74e197fe60e8c0db06b18f8fe536381946edecdf31e9bd90e1ebfcad7f361544884e2fe83c23b5632912ec284faf +8b3e1e81326d611567e26ed29108f33ddb838c45bbd1355b3ae7e5d463612af64b63fff9fa8e6f2c14c8806021a5a080 +92f6537bca12778866335acc1eb4c3dfc2c8e7e5cf03399743dcea46aa66cac92ac2963b0892784263ad0ebe26ffdbf6 +b5cc0061f7a3e41513199c7dd91ac60d727366482a4c7328527f7bd4fc3509412f711bb722b4413b3736a219b843d15d +b3e9711d68d2c6f6e2cc27e385d5f603d9a1c9a96edeefa1ffdf390439954d19504d6aadc566b47e229ad4940ef020d2 +a09d0d3f0e5dc73a4a0827b72710b514bbfce4a7fcd5141d498a5aad6c38071077f50d3f91af897d9ab677b7041dedda +b177fe260f3b86e9ac21f1bfbe2682ae5dd8c9aecebb84f37054bdab6e39094e611ce582210ceeddde66adf759dadb6d +b0ac6595eba9f5dc4b2fd21856267cfbcfb5b12aa34ec69ca32b80071c5b652e85c25a224d80443d503bf25fbbfe07e9 +81f3c0e11b196bd4a2e8f07f8c037002566dc9037da81f3988add458a520c24dd1be3d43d851e28c0c6a85de4b57a542 +a44308c95615f7fedb2d2127012924468c015df9f48359cc2e36ab4223870b0bfc1e9040baabefdf5266f93afaad896b +8493ec4c32d5a13b81039f1b436eb83f259945dc950e3c6c2ccf5087ec56dd2f60890ed4edf01728b6a54950e19b35c6 +a1a439ec2a6a95bdac9aaa925ff337ba956c0d236ab5318354270e73ed6b73b4ae2d27b4c1686cf97b6526d04e65be81 +b4659b7b53c55a4b2bbe210b53520b392f893500e18990d843b72d7379d45fb44dd1dd2184348d6fd853d6b9ecc6b7c6 +afb2c68d75d00130b0e1b4f250001920213121791698ec04262db714cf7b1408d39f6cc10421f954845aad5b8250b77e +b22b843b40a97210f94043b552f348f66743055a3f274856a738e7d90a625b80e9bbb80cbbb450e1666eb56b8bd5c60f +800895ced82fe13d5fff65a93b0051c3df698bf1221b682accfdb63e3970f669ca37025750697f4e8ff2a3322ad57be4 +b21f598c50d7b9f4a584d548f85e42055ef8e24991906d973749090261584c7f4f5e984b528926f7e75375dd84d51af8 +849b1c68192d18274598dd6d0bf48fb5ee3b1ba25b331cff2d06f345bef3bed49760ca5690848cf33388f6a9a32cd646 +aeb6fd9478b10ef456f6bbb1e6dd19b14475e65497772d12cfc097948383d3fbd191bf95f046b8bf1989954118e483d0 +b1b5e0ea2835f7fc8b66e7731e392b43d16cbce04b52906b6751ab1b91978899db5fecbdabc23a19dabb253005468136 +91b6b1284770cf6f7ef35bc0b872b76c7763ffcfa68f9c8cfabcb2f264a66d47598bb9293f6a40f4c3dd33c265f45176 +b9ffed029846487c2cfb8a4bb61782bd8a878f3afdb73c377a0ebe63139fa070e3fcdc583eec3a53fdc5a421ff1fa877 +998007249d041b0b40ff546131cfc86d0b3598dcedf9a8778a223f7ed68ba4833b97324cbb1de91292b8ff51beab44b3 +8eb77ce9e0e406bf6f002870fb2fd1447646dd240df9bd485f8e0869298a1fc799d8a41b130c04370e9a9cc5c7540ca5 +853db8157462c46f2af7e8f94f2ed1c9b9a7ba2896b4973296898ff3d523d6e29e0b63a5d26cecd5e490b33c87a4cecf +b1436b6f3278768f0979ee852944258f2599977d255bea6fc912ba17c5dff5bdc850cf3e1fc52be9d6d188e868670f4f +a76acbc5832019b3b35667ab027feff49f01199a80016620f5c463dfcbfb51bf276ed17b7b683158ba450660cc7973eb +94540cdb051faf3ae8b8c52662868c2dab66bd02505c4f5f8eb4d6b2e2e5fd9a610890c5dcf8fd887eee796d2b5753a8 +aa35099666bceccf4eb3b65b13bba88e30a8be93693ab6761d8e5523343e8d6dd42d977e66499352fe4e9e9784a1dd0d +894471aad17be54319083c4b5e40adcfacf7c36c4aab0b671030b7ef321c53590a25eccd836efd20f32a93185fd315bb +8f52a9f705bb0dea958fcfbd52e2b6c08ad0f89a07a6b2942c1b4c37eead0d97a38a9e9aeb08d5d59b7fa2a9347f738b +9031c16b4f936c9cab55585dc5064739f696c3347ee2c0792320c9f749e760d120e396e8485ffc79d81c9f3337ad3d1c +82090a0d0d9b05459ec1c328ecd4707c333b784e3aaa0ef0072cee1eac83f9a653a75d83b9f63512a8c41200494826b4 +92c3a9553001f9ea4d67236b8ad1a33275378202cc1babc03f313895458f4b2549bfbbbdd37bfb8fbff0decb6b9f820a +88651868f4da37338a22bc553388df5dd1dd0cb78c4d7d07c637d8f6faef4bed72476fdcd4304d5bedf3514011135f08 +83fa0141bfebd88063f1d787719721b4c6b19ecf565b866de9d7d5d1a890e0e3d859b364bb65f8f8e688654456a40263 +90a7fab753e5d56dfc0e53a6b4e6ab14508220f3a62b3f3f30570c4c9ad225e74122635826c92e8e3227ec45e551432a +8fa375b0345bf6e5e062d108f9feaec91029345ecac67ccf1264eac77b8654cbfdda1f10579f481889c0e210254eadde +b83f06116da9daebdb013b26724523f077debaf6bc618b48a7a68858a98d275f7899c4ec73a0a827219b9248dd81c8c9 +8be1cada55e0c5ebb4fd460b2d209ae5326285a20c8bdd54ed9d1a87302f4063c8730bfda52d9d40e0d6fe43a0628465 +a68ad6f813743ec13a811f2ef3982c82d9d9ac1f7733936aa1e122f8dc7f4a305cc221579ab8fc170c3f123a1576f9ab +8878f1128214fdbbb8a0edd85223741e021508ab6d36c50d38680f2951ee713ea056ed03f62b9461897963d50ceefe0b +acc0d43d1b0260528b7425b260a5dea445b232b37240759fc65fe26f7c9d8e51569c5722bc33e94de6492f4ba1783504 +ad80b1dd717b076910ee5ceabcb762e75e4d094dc83b93b65c16de1f75bc712cef223c05d5579c1561829406c07a97d9 +a6fc9803f9c09d95fc326cc284f42ea5566255eb215dba8a9afb0be155ea11bcc55938b2d16f01cd2f2eda218c715efb +83ad733dbdfbaae8095a403dbf09130513f4ed4f08dcf8dd76ce83d1ea72999b7eea3a7b731da0d2bc80a83c6ee0e3e0 +8748912fbd08cb34a85416b0937d9c4327e9eed20d6e30aeb024a7253f14f1e0d774f3326e54738d71aae080e28da0fe +8997e78d8acf23051428af67183ae9b2c4aa42b503745ffe33df35a35103c589987e1473ab14dcd28ee78ebcb10d8e95 +a2f340502a7eb3c4a36412e6f028321372c4fa18a4743945607424e932af1271fa3e6598a162c872072529576eba6283 +868ccf19b5044ab93b45c9ed3ae34fcb504fe1453d6c4a1d12c325032cf01eb90356de82080ed897e97dba13cae33a02 +ac8867005fe4354d67aa37b866a7e581d2f94f7bd0b9f4efb5c2d1370ec13147a60692051b02fd00ae60b512bce9b1ff +8fd01886b046819c83c12bb779e432b25ba13713f9227be702074ec3abb2bba6be37220a0a26a4bd4171b99b14e32bc4 +a128981ed199f92b5959975c150a93a62fec50b61c80a3fa0634d90fc8058f76f5cbee77aae6889af12d296b30e613cd +81fe618552ff7a36c9235c6d4066cf2f930b5b38de4089e18166e4a06ca5723eadd1976d25e34b74b3ce942300b23e5b +ab1223ea049e6e0fbf9b611de7fd7c15e5e9637cbd73aa0e36aea08a7503ba6804f2aa807186fdc9aa7f4f9195f72e24 +b97285286981b2665f898abc13f3243b63005bef8db4cab3f658bf6167036b61af400f08db0fc3c640a9c623b760690d +ae3ddff7c1f0fbb6a13dbbc667a61e863c2c7c51c2051e33cd61620142e7e30a7e0c4c1f8fbb512aa3a8640267c6ac26 +99c2a89d5bef236060e51c4f952664094c20fbfca647e5d24a55c1fb8df2f3df58244fbbf3635db07b1c29ee3234fa6f +a5010764d4b9cd3b410638334d1f70c5f4843f45b4f4a9316aaea5fbb2c510a97449dd7a07b49f47334a69d37d9955d3 +86706d011dcdc9e9d165d01fea1df68dd74bedaf15a39f92893c030cafe96f4498c4c1fec2d2136354341b3f440a1462 +88fd57eb62bd7dc35722f3a0576c2138403a2f663a2603482e8974a895cf56ddbb02657dc6b89eb2cf5c1f9d1aff6426 +b0dfd4c68e3acb6bb8a776adaa421fc5e268ed4d5964bb90a727091e5113b55b3f9c6d33cedb3ee47ff7acc5df8b1749 +93b92bc942e1a636fc5c2dc1840de5faf158a113d640d5a475b48e2c56ccccaf9db0e37e90ce74c4b3f5c9ac3b2eb523 +b29a16fa1ea95cbfc1873c435ad40dc8495ba6341801b72bd95d908147dcffb1b4bb426dd635f3af4c88984f56594dd8 +b8f367105e1a2d554ac30200c66aeb579d3d30a8953d20fb6ebba2d876ec39c52ea5d654f1bb89b8ddf3d9d651f31cdf +b5fbc228c983d08adf8612eba5b3db3acff604439226f86aa133b02cce4ffde2f977c8dbb8b446b4375673f71634c89d +a399bea37d3056e0559f6644faa0af93063b4b545d504d7e228d3dbbc294af83d3c4cf37fe026b63899b4e7d50fd08f5 +928ef411a36414b24aea26fdbed4bdb1bb6bdc2d967e2553ce54c7c4e077e76869cea590257645c9129dd55ce025295c +9684a4adeed416a9ce82ad79b55c4a3adcfbd43950bc442ed8a340381caedb70f4baaaf821e3a152f483f965d8f56162 +92558a37f214d6f4cb6d72cd2f4ad24dff9d17611b9e4a41ee5c741a5d1ca9e4053b0584533ef4da206110b5dc3e2a35 +973bf0724d1785cc5e85d2a8ee8c354ad4cf557217ced0b7940f6f064024c20b2bfc5b144c820b5083da4bf70690de4d +adaf1389dfa528210ca9c2657c5ff10d51f7e3b18e93a59c37211be0506c3576cb2c04ec80cd0f82605e53c5a3556620 +85b58b223b09fda6f3ab674d75e780c49eb2167837243df049281e8f4fed653811138b398db9cdfe7405fdb8485602fe +849504d3db408d80745a07e850b0a804607b91a59922a5d3bc40da2748c029c029419cda38d2a4485cc0824c6b2504f0 +a3f4afcb353bc2582a02be758ebf0cd18752410ca2e64231176bfa23828423e0a450a65f241a9ed8eab36cae8d9c567b +ae362786cdf121206537af9590d330abbc6dc328b53cdd145dbed0e5df1364c816aae757c4c81f9d619e3698dd32bcdf +9024cfa5b0101eb02ab97866d5a3832944e5aa6888484cfba3d856576b920787b364fba5956bd7c68a305afedc958201 +8a116df09fed923acefb2aecf38a4fbc4b973ee964d67f03791d70bee6356af43ffca117d4e9463ffaf0e0d5d5e5a69f +9163016175c73f1bbc912ddfe03bd4e1db19c64951c8909ee6befe71a1249d838e0db49f03670bb4c5c9b2ab0fb4fef3 +8f6357318d8d16e7240a02b05ce5a4976b6079d49daa258789c6dbf4a47950ebe9de6411780fab06c7c1f35651433380 +8e63cbae8be7341892dbedee3111adf0307c4ee9e375181aa53478f5ba9cdce164d6ae890e5f480119a3a51c6e989165 +a9782f30674a4874d91bfba7eda63aeb5dbe66b040c768d6a925d8ee135f0655ea56276b105239cc0668fc91ddb68cd1 +8d9d94b61ab84ec08665cbe0244ea41756785df019e453ef078c19380bd44c39d2958e8465c72eacf41eed5696037805 +b1470e6f5d2e314474937cb5a3bc30c8bf5fc3f79014945f6ee895fe20028ffc272f9d3a7320aac93e36c96d8a5454e3 +a444911bbafc71179766594f3606b6eaff041826607fd3192f62dec05cd0f01b78598609a530f6930e8440db66f76713 +a9823d44e2638fca7bcc8796cc91c3eb17f46ad6db9f7f6510e093727614aa3a4f9b2c4011ef91dc1c2d224d08d8d05b +ab86020972c359ab98294212558b4b14862040139876c67fc494184b5c9bcea1dbe32fe0c8dd9e60be9daa304acd599a +b7e5cb685bbdcfdb1e48259a5d68d047846c8a35c5b3f90172fb183d1df40d22eaf0edaca2761a07c29c577000ccfed0 +8c88319dae4b28989817e79e6667fd891181e8d2ed91b9c6b614985bca14b12982462ec58b17be0463c24bbb79dd62a1 +8c1c6867e7107fb2178157c991b9c8b0f90c8d57a51220bf3650438ccabccf62da4db8a9916491e730ff3d0c106496e3 +a00a79bd58da6528b9af033087260f9f3d00519eafb4746b355204ee994e89481591b508eaa5402821083e250d38467b +8785abd7c37690f6aa870ee5c799eef72e398a7898b6767f698515be277b9c2fc1af12ea89b0620a848221343a3b5ec3 +8aadae68543db65cef71d0e230a09508d72061398ef2fabec0f856aacff2125b79c70e620744aaf331faf3dfc8afb9bc +8ff0cd437fcad9630b8a2333176a55e178db4142ec841581590594d74d5b53baeac5fb903fdf7bcf83e245b95b58285e +af274e8fad6b190be4e5dc92d2705ba6ac0d7e1ea29e958a5cdd4cb764de46a56d9eef62c999a16e7c50a50b2d9fe3a8 +865e6ec7d1aa848786d6a7a4e87a24d442311f0810b01ef5a74928ab59fdfd651e48880b49680047e5b0df6b3c7c2ecc +800706baaeb35bf3bc33bdea9a8b5cb00d82df407b3b7e1b781a9359cf44fb410ed311591080181b768aae223d9246aa +a9496389d0780b309c6998374ae159f58a8d0fe9a1c24c36cebcb45b27d818e653b51a8ee1f01e30a9b2c46a548126ef +b5fccf4fc3186661939fbee2e89c2aa0e3a6ad4907bcc98c7750520540c4c183b1bbfcdf47f2f1c5e75c3a30cdf30c75 +a90028e39081b736e628c2230cc1338f9210ed01309a40fdf08d39c10cced2cdf71271013bea6dba3a0444fe47963106 +a0815cbb325a8fecf2e1bcc5046644be32d43a8001bd5d8cf0022e4572cd0d481b3e717002f7ab21e16da5f5d16886d6 +b2024787fcda52abc4138150f15e81f4a5be442929b1651ddccbfd558029912be4d61c3c9b467605fff640edf7392494 +ab5aa60032304a584cc9245a33f528eae7157808dedd1ad83ebae00aadc25dbe1cd5917eb8b6b2c800df15e67bdd4c4d +866643847ef512c5119f2f6e4e3b8d3f4abb885f530bb16fcef0edb698a5b0768905e51536283925b6795a5e68b60ddc +806aa99c9a46ee11cc3ebf0db2344b7515db8c45b09a46a85f8b2082940a6f7263f3c9b12214116c88310e706f8e973a +a6eada8b9ff3cd010f3174f3d894eb8bb19efdbff4c6d88976514a5b9968b0f1827d8ac4fe510fb0ba92b64583734a1e +98480db817c3abbc8b7baedf9bf5674ec4afcfd0cd0fd670363510a426dad1bcf1b1cb3bf0f1860e54530deb99460291 +81ab480187af4a3dfbc87be29eca39b342a7e8e1d1df3fc61985e0e43d8d116b8eac2f1021bde4ae4e5e3606c1b67a21 +8a37df12dc997bf9b800f8fd581a614a1d5e32b843f067d63d1ca7fde2e229d24413d3a8308ec1e8389bf88154adb517 +b045a55ca0bb505bd5e8fcc4cfdd5e9af1a7d5fe7a797c7ede3f0b09712b37f493d3fcf6ef0e759d7e0157db1f583c95 +ad502e53a50691238323642e1d8b519b3c2c2f0fd6a0dd29de231f453be730cf1adc672887d97df42af0a300f7631087 +80597648f10c6d8fcd7421caf4e7f126179633078a1724817d2adc41b783723f302eabc947a7ba7767166dacf4ce8fa1 +aefb56427966c81081999dffbe89f8a0c402041929cd4e83d6612866cfbb97744f4ab802578349fbecc641fa9955e81b +a340e493fb3fb604eab864d4b18a6e40ba657003f1f88787e88e48b995da3d0ab4926ce438bdc8d100a41912a47dace0 +a6d777bfc0895eac541a092e14499ff8bf7156689d916a678b50a1460583b38e68158984bea113a0a8e970d8a6799a85 +90ce469410f0e8cfff40472817eb445770833cdcf2895a69bc32bcf959854d41712599ceb2b0422008d7300b05e62e02 +815c51be91d8516d5adc2fd61b6600957ed07cf5fdc809aa652b059bea8ed179638a19077a3f040334032f0e7900ac8b +b3ec6c0c3c007c49c6b7f7fc2ffd3d3a41cdff5ad3ac40831f53bfc0c799ffeed5f440a27acc5f64432e847cc17dd82e +823637abeab5fb19e4810b045254558d98828126e9a2d5895a34b9e4b4f49ab0a5b3ee2422f1f378995ea05df5516057 +ac05412bcf46c254f6548d8107a63928bba19ab6889de5d331eb68cf4d8ce206055b83af4cb7c6c23b50188391e93f84 +88514163c587068178302bc56e9a8b3ad2fa62afd405db92f2478bb730101358c99c0fe40020eeed818c4e251007de9c +b1e657d0f7772795b3f5a84317b889e8ded7a08ea5beb2ab437bebf56bcb508ae7215742819ed1e4ae3969995fe3b35d +a727d4f03027fe858656ca5c51240a65924915bd8bd7ffa3cfc8314a03594738234df717e78bb55a7add61a0a4501836 +b601682830fc4d48ece2bdc9f1a1d5b9a2879c40c46135f00c2c3ae1187c821412f0f0cfbc83d4e144ddd7b702ca8e78 +b5cfea436aa1f29c4446979272a8637cb277f282825674ddb3acac2c280662fb119e6b2bdd52c4b8dbf2c39b1d2070d6 +85c211645ff746669f60aa314093703b9045966604c6aa75aae28422621b256c0c2be835b87e87a00d3f144e8ab7b5f0 +867628d25bab4cb85d448fd50fdd117be1decdd57292e194a8baa0655978fae551912851660a1d5b9de7a2afbb88ef5c +a4e79c55d1b13c959ff93ddcf1747722c6312a7941a3b49f79006b3165334bab369e5469f1bddebadb12bfaff53806d5 +ac61f0973e84546487c5da7991209526c380e3731925b93228d93a93bce1283a3e0807152354f5fe7f3ea44fc447f8fe +a1aa676735a73a671a4e10de2078fd2725660052aa344ca2eb4d56ee0fd04552fe9873ee14a85b09c55708443182183a +8e2f13269f0a264ef2b772d24425bef5b9aa7ea5bbfbefbcc5fd2a5efd4927641c3d2374d0548439a9f6302d7e4ba149 +b0aacdaf27548d4f9de6e1ec3ad80e196761e3fb07c440909524a83880d78c93465aea13040e99de0e60340e5a5503cd +a41b25ae64f66de4726013538411d0ac10fdb974420352f2adb6ce2dcad7b762fd7982c8062a9bac85cdfcc4b577fd18 +b32d87d5d551f93a16ec983fd4ef9c0efcdae4f5e242ce558e77bcde8e472a0df666875af0aeec1a7c10daebebab76ea +b8515795775856e25899e487bf4e5c2b49e04b7fbe40cb3b5c25378bcccde11971da280e8b7ba44d72b8436e2066e20f +91769a608c9a32f39ca9d14d5451e10071de2fd6b0baec9a541c8fad22da75ed4946e7f8b081f79cc2a67bd2452066a9 +87b1e6dbca2b9dbc8ce67fd2f54ffe96dfcce9609210a674a4cb47dd71a8d95a5a24191d87ba4effa4a84d7db51f9ba0 +a95accf3dbcbf3798bab280cabe46e3e3688c5db29944dbe8f9bd8559d70352b0cfac023852adc67c73ce203cbb00a81 +a835f8ce7a8aa772c3d7cfe35971c33fc36aa3333b8fae5225787533a1e4839a36c84c0949410bb6aace6d4085588b1e +8ef7faa2cf93889e7a291713ab39b3a20875576a34a8072a133fed01046f8093ace6b858463e1e8a7f923d57e4e1bc38 +969ecd85643a16d937f148e15fb56c9550aefd68a638425de5058333e8c0f94b1df338eaab1bd683190bfde68460622b +8982f4c76b782b9b47a9c5aeb135278e5c991b1558e47b79328c4fae4b30b2b20c01204ff1afb62b7797879d9dee48e2 +b5098b7ba813178ced68f873c8c223e23a3283d9f1a061c95b68f37310bca4b2934a3a725fff1de1341c79bb3ba6007e +97b160787009f7b9649ed63db9387d48a669e17b2aba8656792eb4f5685bb8e6386f275476b4dfbb1b4cb0c2a69bc752 +88b69369c71daad6b84fa51a0f64a6962d8c77e555b13c035ad6fa1038e7190af455b1bd61ae328b65d6a14cf3d5f0d5 +af88b87801361f0de26bd2533554ee6f4d8067e3122b54161c313c52cc9eafea00661c5c43e2d533485d1f26da4e5510 +98ab18e3bbcb23ac1e34439849e56009bb765ab2f2558ebfd0a57cbe742169f114bceb930533fb911b22cb5a8fe172bc +9027507f1725d81e5ac0f0854c89ab627df3020fe928cb8745f887bf3310086c58fca1119fd5cd18a7d3561c042d58de +a676583f8a26e6f8991a0791916ce785b596ce372812f5eb7b4243ba9367ea95c797170fdac5b0c5e6b7f6519cc2b026 +b91b0ab32638aef3365035a41c6068e36d2303bfee8640565e16c9a56c21703270fd45946ce663238a72c053eb3f2230 +aaf4cd1ac0a30906dcd2b66b37848c6cc443da511e0b0367fd792887fdaf1500551590440e61d837dbee9d24c9801108 +a06f20a02d3cd76029baad5a12592f181738378a83a95e90470fa7cc82a5ae9d2ed824a20eeb1e96e6edc0619f298688 +a465d379c3481b294efc3f2f940b651c45579607cf72d143b99705eae42103a0279eb3595966453130e18935265e35d6 +892a8af7816a806295278027a956663ea1297118ede0f2a7e670483b81fb14dccacc7a652e12f160e531d806ca5f2861 +b480917c0e8b6e00de11b4416a20af6c48a343450a32ee43224559d30e1fecdece52cc699493e1754c0571b84f6c02c2 +b3182da84c81e5a52e22cebed985b0efc3056350ec59e8646e7fd984cdb32e6ac14e76609d0ffaca204a7a3c20e9f95d +a04ea6392f3b5a176fa797ddec3214946962b84a8f729ffbd01ca65767ff6237da8147fc9dc7dd88662ad0faefdb538c +95c0d10a9ba2b0eb1fd7aa60c743b6cf333bb7f3d7adedce055d6cd35b755d326bf9102afabb1634f209d8dacfd47f1a +a1a583d28b07601541fa666767f4f45c954431f8f3cc3f96380364c5044ff9f64114160e5002fb2bbc20812b8cbd36cb +a1a0708af5034545e8fcc771f41e14dff421eed08b4606f6d051f2d7799efd00d3a59a1b9a811fa4eddf5682e63102ea +ab27c7f54096483dd85c866cfb347166abe179dc5ffaca0c29cf3bfe5166864c7fa5f954c919b3ba00bdbab38e03407d +ac8c82271c8ca71125b380ed6c61b326c1cfe5664ccd7f52820e11f2bea334b6f60b1cf1d31599ed94d8218aa6fbf546 +a015ea84237d6aa2adb677ce1ff8a137ef48b460afaca20ae826a53d7e731320ebdd9ee836de7d812178bec010dd6799 +925418cda78a56c5b15d0f2dc66f720bda2885f15ffafb02ce9c9eed7167e68c04ad6ae5aa09c8c1c2f387aa39ad6d1b +87c00bba80a965b3742deacafb269ca94ead4eb57fdb3ed28e776b1d0989e1b1dba289019cfb1a0f849e58668a4f1552 +948d492db131ca194f4e6f9ae1ea6ebc46ebbed5d11f1f305d3d90d6b4995b1218b9606d114f48282a15661a8a8051ca +8179617d64306417d6865add8b7be8452f1759721f97d737ef8a3c90da6551034049af781b6686b2ea99f87d376bce64 +918e3da425b7c41e195ed7b726fa26b15a64299fe12a3c22f51a2a257e847611ac6cfcc99294317523fc491e1cbe60c4 +a339682a37844d15ca37f753599d0a71eedfbbf7b241f231dd93e5d349c6f7130e0d0b97e6abd2d894f8b701da37cb11 +8fc284f37bee79067f473bc8b6de4258930a21c28ac54aaf00b36f5ac28230474250f3aa6a703b6057f7fb79a203c2c1 +a2c474e3a52a48cd1928e755f610fefa52d557eb67974d02287dbb935c4b9aab7227a325424fed65f8f6d556d8a46812 +99b88390fa856aa1b8e615a53f19c83e083f9b50705d8a15922e7c3e8216f808a4cc80744ca12506b1661d31d8d962e4 +a1cbd03e4d4f58fc4d48fa165d824b77838c224765f35d976d3107d44a6cf41e13f661f0e86f87589292721f4de703fb +b3a5dde8a40e55d8d5532beaa5f734ee8e91eafad3696df92399ae10793a8a10319b6dc53495edcc9b5cfd50a389a086 +996e25e1df5c2203647b9a1744bd1b1811857f742aee0801508457a3575666fcc8fc0c047c2b4341d4b507008cd674c2 +93e0a66039e74e324ee6c38809b3608507c492ef752202fff0b2c0e1261ca28f1790b3af4fdb236f0ed7e963e05c1ec0 +b6084e5818d2d860ac1606d3858329fbad4708f79d51a6f072dc370a21fdb1e1b207b74bc265a8547658bfb6a9569bb3 +a5336126a99c0ecfc890584b2a167922a26cae652dfc96a96ab2faf0bf9842f166b39ceaf396cd3d300d0ebb2e6e0ebf +b8b6f13ce9201decaba76d4eca9b9fa2e7445f9bc7dc9f82c262f49b15a40d45d5335819b71ff2ee40465da47d015c47 +b45df257b40c68b7916b768092e91c72b37d3ed2a44b09bf23102a4f33348849026cb3f9fbb484adfea149e2d2a180ff +a50d38ee017e28021229c4bb7d83dd9cdad27ab3aa38980b2423b96aa3f7dc618e3b23895b0e1379ca20299ff1919bbf +97542cf600d34e4fdc07d074e8054e950708284ed99c96c7f15496937242365c66e323b0e09c49c9c38113096640a1b6 +822d198629697dcd663be9c95ff1b39419eae2463fa7e6d996b2c009d746bedc8333be241850153d16c5276749c10b20 +9217bc14974766ebdfbf6b434dd84b32b04658c8d8d3c31b5ff04199795d1cfad583782fd0c7438df865b81b2f116f9c +93477879fa28a89471a2c65ef6e253f30911da44260833dd51030b7a2130a923770ebd60b9120f551ab373f7d9ed80aa +87d89ff7373f795a3a798f03e58a0f0f0e7deab8db2802863fab84a7be64ae4dcf82ece18c4ddbefccd356262c2e8176 +a3ba26bd31d3cc53ceeced422eb9a63c0383cde9476b5f1902b7fe2b19e0bbf420a2172ac5c8c24f1f5c466eecc615d4 +a0fe061c76c90d84bd4353e52e1ef4b0561919769dbabe1679b08ef6c98dcfb6258f122bb440993d976c0ab38854386b +b3070aa470185cb574b3af6c94b4069068b89bb9f7ea7db0a668df0b5e6aabdfe784581f13f0cf35cd4c67726f139a8c +9365e4cdf25e116cbc4a55de89d609bba0eaf0df2a078e624765509f8f5a862e5da41b81883df086a0e5005ce1576223 +a9036081945e3072fa3b5f022df698a8f78e62ab1e9559c88f9c54e00bc091a547467d5e2c7cbf6bc7396acb96dd2c46 +8309890959fcc2a4b3d7232f9062ee51ece20c7e631a00ec151d6b4d5dfccf14c805ce5f9aa569d74fb13ae25f9a6bbe +b1dc43f07303634157f78e213c2fae99435661cc56a24be536ccbd345ef666798b3ac53c438209b47eb62b91d6fea90a +84eb451e0a74ef14a2c2266ff01bd33d9a91163c71f89d0a9c0b8edfcfe918fc549565509cd96eed5720a438ff55f7f2 +9863b85a10db32c4317b19cc9245492b9389b318cf128d9bbc7ec80a694fcbbd3c0d3189a8cad00cc9290e67e5b361ee +8a150ee474ebe48bdfcac1b29e46ac90dcded8abbe4807a165214e66f780f424be367df5ef1e94b09acf4a00cd2e614d +a6677a373130b83e30849af12475e192f817ba4f3226529a9cca8baaefb8811db376e4a044b42bf1481268c249b1a66e +b969cbf444c1297aa50d1dfa0894de4565161cb1fc59ba03af9655c5bf94775006fe8659d3445b546538a22a43be6b93 +8383167e5275e0707e391645dc9dea9e8a19640ecfa23387f7f6fcaddff5cde0b4090dfad7af3c36f8d5c7705568e8d8 +a353ddbc6b6837773e49bb1e33a3e00ca2fb5f7e1dba3a004b0de75f94a4e90860d082a455968851ef050ae5904452e0 +adeccf320d7d2831b495479b4db4aa0e25c5f3574f65a978c112e9981b2663f59de4c2fa88974fdcabb2eedb7adab452 +afa0eacc9fdbe27fb5e640ecad7ecc785df0daf00fc1325af716af61786719dd7f2d9e085a71d8dc059e54fd68a41f24 +a5b803a5bbe0ca77c8b95e1e7bacfd22feae9f053270a191b4fd9bca850ef21a2d4bd9bcd50ecfb971bb458ff2354840 +b023c9c95613d9692a301ef33176b655ba11769a364b787f02b42ceb72338642655ea7a3a55a3eec6e1e3b652c3a179e +8fa616aa7196fc2402f23a19e54620d4cf4cf48e1adfb7ea1f3711c69705481ddcc4c97236d47a92e974984d124589e5 +a49e11e30cb81cb7617935e8a30110b8d241b67df2d603e5acc66af53702cf1e9c3ef4a9b777be49a9f0f576c65dcc30 +8df70b0f19381752fe327c81cce15192389e695586050f26344f56e451df2be0b1cdf7ec0cba7ce5b911dcff2b9325ae +8fbbc21a59d5f5a14ff455ca78a9a393cab91deb61cf1c25117db2714d752e0054ed3e7e13dd36ad423815344140f443 +a9a03285488668ab97836a713c6e608986c571d6a6c21e1adbd99ae4009b3dde43721a705d751f1bd4ebf1ea7511dfed +b2f32b8e19e296e8402251df67bae6066aeefd89047586d887ffa2eacdf38e83d4f9dc32e553799024c7a41818945755 +942cf596b2278ad478be5c0ab6a2ad0ceafe110263cc93d15b9a3f420932104e462cf37586c374f10b1040cb83b862e0 +aaa077a55f501c875ceae0a27ef2b180be9de660ef3d6b2132eb17256771ce609d9bc8aaf687f2b56ae46af34ad12b30 +90ac74885be1448101cf3b957d4486e379673328a006ea42715c39916e9334ea77117ff4a60d858e2ccce9694547a14f +9256cdfc2339e89db56fd04bd9b0611be0eefc5ee30711bcece4aadf2efcc5a6dcc0cfd5f733e0e307e3a58055dff612 +a4c7384e208a0863f4c056248f595473dcde70f019ddaede45b8caf0752575c241bac6e436439f380ac88eee23a858e9 +a3aa67391781e0736dddc389f86b430b2fc293b7bd56bfd5a8ec01d1dd52ed940593c3ad4ce25905061936da062b0af6 +80299275ec322fbb66cc7dce4482ddd846534e92121186b6906c9a5d5834346b7de75909b22b98d73120caec964e7012 +aa3a6cd88e5f98a12738b6688f54478815e26778357bcc2bc9f2648db408d6076ef73cced92a0a6b8b486453c9379f18 +b07c444681dc87b08a7d7c86708b82e82f8f2dbd4001986027b82cfbed17b9043e1104ade612e8e7993a00a4f8128c93 +af40e01b68d908ac2a55dca9b07bb46378c969839c6c822d298a01bc91540ea7a0c07720a098be9a3cfe9c27918e80e8 +abd8947c3bbc3883c80d8c873f8e2dc9b878cbbb4fc4a753a68f5027de6d8c26aa8fbbafeb85519ac94e2db660f31f26 +a234f9d1a8f0cb5d017ccca30b591c95ec416c1cb906bd3e71b13627f27960f61f41ed603ffbcf043fd79974ec3169a8 +835aaf52a6af2bc7da4cf1586c1a27c72ad9de03c88922ad172dce7550d70f6f3efcc3820d38cd56ae3f7fc2f901f7a0 +ae75db982a45ad01f4aa7bc50d642ff188219652bb8d521d13a9877049425d57852f3c9e4d340ffec12a4d0c639e7062 +b88884aa9187c33dc784a96832c86a44d24e9ffe6315544d47fc25428f11337b9ffd56eb0a03ad709d1bf86175059096 +8492ca5afcc6c0187b06453f01ed45fd57eb56facbeea30c93686b9e1dab8eaabd89e0ccb24b5f35d3d19cd7a58b5338 +9350623b6e1592b7ea31b1349724114512c3cce1e5459cd5bddd3d0a9b2accc64ab2bf67a71382d81190c3ab7466ba08 +98e8bf9bed6ae33b7c7e0e49fc43de135bffdba12b5dcb9ff38cb2d2a5368bb570fe7ee8e7fbe68220084d1d3505d5be +ab56144393f55f4c6f80c67e0ab68f445568d68b5aa0118c0c666664a43ba6307ee6508ba0bb5eb17664817bc9749af0 +827d5717a41b8592cfd1b796a30d6b2c3ca2cdc92455f9f4294b051c4c97b7ad6373f692ddafda67884102e6c2a16113 +8445ce2bb81598067edaa2a9e356eda42fb6dc5dd936ccf3d1ff847139e6020310d43d0fec1fe70296e8f9e41a40eb20 +9405178d965ee51e8d76d29101933837a85710961bb61f743d563ef17263f3c2e161d57e133afac209cdb5c46b105e31 +b209f9ed324c0daa68f79800c0a1338bbaf6d37b539871cb7570f2c235caca238a2c4407961fcb7471a103545495ef2c +92ae6437af6bbd97e729b82f5b0d8fb081ca822f340e20fae1875bdc65694cd9b8c037a5a1d49aa9cae3d33f5bad414e +9445bdb666eae03449a38e00851629e29a7415c8274e93343dc0020f439a5df0009cd3c4f5b9ce5c0f79aefa53ceac99 +93fdab5f9f792eada28f75e9ac6042a2c7f3142ba416bfdb1f90aa8461dbe4af524eee6db4f421cb70c7bc204684d043 +a7f4dc949af4c3163953320898104a2b17161f7be5a5615da684f881633174fb0b712d0b7584b76302e811f3fac3c12f +a8ac84da817b3066ba9789bf2a566ccf84ab0a374210b8a215a9dcf493656a3fa0ecf07c4178920245fee0e46de7c3ec +8e6a0ae1273acda3aa50d07d293d580414110a63bc3fb6330bb2ee6f824aff0d8f42b7375a1a5ba85c05bfbe9da88cb5 +a5dea98852bd6f51a84fa06e331ea73a08d9d220cda437f694ad9ad02cf10657882242e20bdf21acbbaa545047da4ce5 +b13f410bf4cfce0827a5dfd1d6b5d8eabc60203b26f4c88238b8000f5b3aaf03242cdeadc2973b33109751da367069e1 +a334315a9d61b692ad919b616df0aa75a9f73e4ea6fc27d216f48964e7daebd84b796418580cf97d4f08d4a4b51037cd +8901ba9e963fcd2f7e08179b6d19c7a3b8193b78ca0e5cf0175916de873ca0d000cd7ac678c0473be371e0ac132f35a2 +b11a445433745f6cb14c9a65314bbf78b852f7b00786501b05d66092b871111cd7bee25f702d9e550d7dd91601620abb +8c2f7b8e7b906c71f2f154cc9f053e8394509c37c07b9d4f21b4495e80484fc5fc8ab4bdc525bd6cfa9518680ba0d1a2 +b9733cebe92b43b899d3d1bfbf4b71d12f40d1853b2c98e36e635fdd8a0603ab03119890a67127e6bc79afae35b0bef2 +a560f6692e88510d9ba940371e1ada344caf0c36440f492a3067ba38e9b7011caac37ba096a8a4accb1c8656d3c019b3 +ac18624339c1487b2626eef00d66b302bdb1526b6340d6847befe2fdfb2b410be5555f82939f8707f756db0e021ed398 +afd9a3b8866a7fe4f7bc13470c0169b9705fcd3073685f5a6dcff3bdbbc2be50ac6d9908f9a10c5104b0bffc2bc14dad +97f15c92fe1f10949ed9def5dd238bc1429706e5037a0e0afb71c2d0e5845e2fed95a171c393e372077a7c7059f8c0e0 +9453a1d4d09c309b70968ea527007d34df9c4cfd3048e5391aac5f9b64ca0c05dde5b8c949c481cfc83ef2e57b687595 +b80e4b7c379ad435c91b20b3706253b763cbc980db78f782f955d2516af44c07bbfa5888cbf3a8439dc3907320feb25a +8939f458d28fefe45320b95d75b006e98330254056d063e4a2f20f04bcb25936024efe8d436d491ed34b482f9b9ae49c +a9ead2e833f71f7e574c766440c4b3c9c3363698c7ade14499a56003a272832ee6d99440887fa43ccdf80265b9d56b97 +b6547a36934f05ce7b779e68049d61351cf229ae72dc211cc96a2a471b2724782f9355fdb415ea6f0ea1eb84fe00e785 +828bfb3099b7b650b29b0f21279f829391f64520a6ab916d1056f647088f1e50fac9253ef7464eceab5380035c5a59c4 +8d714b9ea650be4342ff06c0256189e85c5c125adf6c7aeca3dba9b21d5e01a28b688fc2116ce285a0714a8f1425c0b8 +8a82eda041b2e72a3d73d70d85a568e035fbd6dc32559b6c6cfdf6f4edcb59a6ba85b6294a721aa0a71b07714e0b99ae +af5665ebc83d027173b14ffb0e05af0a192b719177889fadc9ac8c082fda721e9a75d9ce3f5602dbfd516600ee3b6405 +a68fdddf03d77bebdb676e40d93e59bd854408793df2935d0a5600601f7691b879981a398d02658c2da39dbbf61ef96c +8c001ebc84fcf0470b837a08a7b6125126b73a2762db47bbdc38c0e7992b1c66bac7a64faa1bf1020d1c63b40adc3082 +8553889b49f9491109792db0a69347880a9cf2911b4f16f59f7f424e5e6b553687d51282e8f95be6a543635247e2e2c2 +a2c269d6370b541daf1f23cc6b5d2b03a5fa0c7538d53ae500ef875952fe215e74a5010329ff41461f4c58b32ad97b3d +a5dae097285392b4eba83a9fd24baa03d42d0a157a37fae4b6efc3f45be86024b1182e4a6b6eadcf5efe37704c0a1ae5 +89871a77d2032387d19369933cd50a26bda643e40cfd0ce73febe717a51b39fae981406fd41e50f4a837c02a99524ef9 +8a76d495e90093ec2ac22f53759dc1cf36fbb8370fb586acbd3895c56a90bbf3796bcc4fc422ca4058adf337ead1402e +ad4eb7576c4954d20623c1336c63662c2a6fb46ec6ef99b7f8e946aa47488dcb136eab60b35600f98c78c16c10c99013 +894c2b120cec539feb1d281baaadde1e44beafedeeec29b804473fe024e25c1db652f151c956e88d9081fb39d27e0b19 +9196bd5c100878792444c573d02b380a69e1b4b30cb59a48114852085058a5fd952df4afee3ecceb5c4ede21e1ed4a1a +a996fffc910764ea87a1eedc3a3d600e6e0ff70e6a999cb435c9b713a89600fc130d1850174efe9fc18244bb7c6c5936 +8591bb8826befa8bee9663230d9a864a5068589f059e37b450e8c85e15ce9a1992f0ce1ead1d9829b452997727edcf9d +9465e20bb22c41bf1fa728be8e069e25cda3f7c243381ca9973cbedad0c7b07d3dd3e85719d77cf80b1058ce60e16d68 +926b5ce39b6e60b94878ffeae9ff20178656c375fb9cfe160b82318ca500eb3e2e3144608b6c3f8d6c856b8fe1e2fbcf +a1ef29cbc83c45eb28ad468d0ce5d0fdd6b9d8191ba5ffa1a781c2b232ed23db6b7b04de06ef31763a6bfe377fa2f408 +9328e63a3c8acf457c9f1f28b32d90d0eeadb0f650b5d43486a61d7374757a7ada5fc1def2a1e600fa255d8b3f48036f +a9c64880fcb7654f4dd08f4c90baac95712dd6dd407e17ea60606e9a97dc8e54dd25cb72a9bf3fc61f8d0ad569fe369d +a908eb7b940c1963f73046d6b35d40e09013bfbfbeb2ccd64df441867e202b0f3b625fa32dd04987c3d7851360abdffc +b3947b5ed6d59e59e4472cdb1c3261de1b5278fb7cb9b5fca553f328b3b3e094596861ea526eca02395f7b7358155b7b +99da7f190d37bc58945f981cf484d40fcf0855cf8178e2ce8d057c7f0a9d9f77425fdbce9ef8366f44f671b20fd27d0b +913976d77d80e3657977df39571577fdf0be68ba846883705b454f8493578baa741cfaede53783e2c97cc08964395d83 +8d754a61e5164a80b5090c13f3e936056812d4ae8dc5cc649e6c7f37464777249bc4ae760a9806939131f39d92cca5bf +82ffd098480828a90cb221a8c28584e15904bad477c13b2e2d6ef0b96a861ce4a309a328fe44342365349456ad7c654f +89ae3ce4b0357044579ca17be85d8361bb1ce3941f87e82077dd67e43ec0f95edd4bd3426225c90994a81a99e79490b7 +a170892074016d57c9d8e5a529379d7e08d2c1158b9ac4487ac9b95266c4fd51cb18ae768a2f74840137eec05000dd5a +aafd8acd1071103c7af8828a7a08076324d41ea530df90f7d98fafb19735fc27ead91b50c2ca45851545b41d589d0f77 +8623c849e61d8f1696dc9752116a26c8503fd36e2cbbc9650feffdd3a083d8cdbb3b2a4e9743a84b9b2ad91ac33083f2 +ac7166ddd253bb22cdbd8f15b0933c001d1e8bc295e7c38dc1d2be30220e88e2155ecd2274e79848087c05e137e64d01 +a5276b216d3df3273bbfa46210b63b84cfe1e599e9e5d87c4e2e9d58666ecf1af66cb7ae65caebbe74b6806677215bd0 +88792f4aa3597bb0aebadb70f52ee8e9db0f7a9d74f398908024ddda4431221a7783e060e0a93bf1f6338af3d9b18f68 +8f5fafff3ecb3aad94787d1b358ab7d232ded49b15b3636b585aa54212f97dc1d6d567c180682cca895d9876cacb7833 +ab7cb1337290842b33e936162c781aa1093565e1a5b618d1c4d87dd866daea5cebbcc486aaa93d8b8542a27d2f8694c7 +88480a6827699da98642152ebc89941d54b4791fbc66110b7632fb57a5b7d7e79943c19a4b579177c6cf901769563f2f +a725ee6d201b3a610ede3459660658ee391803f770acc639cfc402d1667721089fb24e7598f00e49e81e50d9fd8c2423 +98924372da8aca0f67c8c5cad30fa5324519b014fae7849001dcd51b6286118f12b6c49061219c37714e11142b4d46de +a62c27360221b1a7c99697010dfe1fb31ceb17d3291cf2172624ebeff090cbaa3c3b01ec89fe106dace61d934711d42d +825173c3080be62cfdc50256c3f06fe190bc5f190d0eb827d0af5b99d80936e284a4155b46c0d462ee574fe31d60983d +a28980b97023f9595fadf404ed4aa36898d404fe611c32fd66b70252f01618896f5f3fda71aea5595591176aabf0c619 +a50f5f9def2114f6424ff298f3b128068438f40860c2b44e9a6666f43c438f1780be73cf3de884846f1ba67f9bef0802 +b1eee2d730da715543aeb87f104aff6122cb2bf11de15d2519ff082671330a746445777924521ec98568635f26988d0c +862f6994a1ff4adfd9fb021925cccf542fca4d4b0b80fb794f97e1eb2964ef355608a98eec6e07aadd4b45ee625b2a21 +8ce69a18df2f9b9f6e94a456a7d94842c61dea9b00892da7cf5c08144de9be39b8c304aeca8b2e4222f87ba367e61006 +b5f325b1cecd435f5346b6bc562d92f264f1a6d91be41d612df012684fdd69e86063db077bc11ea4e22c5f2a13ae7bee +85526870a911127835446cb83db8986b12d5637d59e0f139ad6501ac949a397a6c73bd2e7fba731b1bb357efe068242c +8552247d3f7778697f77389717def5a149fc20f677914048e1ed41553b039b5427badc930491c0bae663e67668038fd1 +a545640ee5e51f3fe5de7050e914cfe216202056cd9d642c90e89a166566f909ee575353cb43a331fde17f1c9021414e +8b51229b53cff887d4cab573ba32ec52668d197c084414a9ee5589b285481cea0c3604a50ec133105f661321c3ca50f5 +8cdc0b960522bed284d5c88b1532142863d97bbb7dc344a846dc120397570f7bd507ceb15ed97964d6a80eccfef0f28e +a40683961b0812d9d53906e795e6470addc1f30d09affebf5d4fbbd21ddfa88ce441ca5ea99c33fd121405be3f7a3757 +a527875eb2b99b4185998b5d4cf97dd0d4a937724b6ad170411fc8e2ec80f6cee2050f0dd2e6fee9a2b77252d98b9e64 +84f3a75f477c4bc4574f16ebc21aaa32924c41ced435703c4bf07c9119dd2b6e066e0c276ff902069887793378f779e0 +a3544bc22d1d0cab2d22d44ced8f7484bfe391b36991b87010394bfd5012f75d580596ffd4f42b00886749457bb6334b +b81f6eb26934b920285acc20ceef0220dd23081ba1b26e22b365d3165ce2fbae733bbc896bd0932f63dcc84f56428c68 +95e94d40a4f41090185a77bf760915a90b6a3e3ace5e53f0cb08386d438d3aa3479f0cd81081b47a9b718698817265cd +b69bd1625b3d6c17fd1f87ac6e86efa0d0d8abb69f8355a08739109831baeec03fd3cd4c765b5ff8b1e449d33d050504 +8448f4e4c043519d98552c2573b76eebf2483b82d32abb3e2bfc64a538e79e4f59c6ca92adff1e78b2f9d0a91f19e619 +8f11c42d6a221d1fda50887fb68b15acdb46979ab21d909ed529bcad6ae10a66228ff521a54a42aca0dad6547a528233 +a3adb18d7e4a882b13a067784cf80ea96a1d90f5edc61227d1f6e4da560c627688bdf6555d33fe54cab1bca242986871 +a24d333d807a48dc851932ed21cbdd7e255bad2699909234f1706ba55dea4bb6b6f8812ffc0be206755868ba8a4af3f9 +a322de66c22a606e189f7734dbb7fda5d75766d5e69ec04b4e1671d4477f5bcb9ff139ccc18879980ebc3b64ab4a2c49 +88f54b6b410a1edbf125db738d46ee1a507e69bc5a8f2f443eb787b9aa7dbd6e55014ec1e946aabeb3e27a788914fb04 +b32ee6da1dcd8d0a7fd7c1821bb1f1fe919c8922b4c1eeed56e5b068a5a6e68457c42b192cbaef5dc6d49b17fa45bc0f +8a44402da0b3a15c97b0f15db63e460506cb8bef56c457166aea5e8881087d8202724c539ef0feb97131919a73aefca8 +b967e3fead6171fa1d19fd976535d428b501baff59e118050f9901a54b12cc8e4606348454c8f0fc25bd6644e0a5532e +b7a0c9e9371c3efbbb2c6783ce2cc5f149135175f25b6d79b09c808bce74139020e77f0c616fa6dcb3d87a378532529d +a54207782ffc909cd1bb685a3aafabbc4407cda362d7b3c1b14608b6427e1696817aeb4f3f85304ac36e86d3d8caa65b +98c1da056813a7bfebc81d8db7206e3ef9b51f147d9948c088976755826cc5123c239ca5e3fe59bed18b5d0a982f3c3f +ae1c86174dfafa9c9546b17b8201719aecd359f5bbeb1900475041f2d5b8a9600d54d0000c43dd061cfda390585726ff +a8ee5a8be0bd1372a35675c87bfd64221c6696dc16e2d5e0996e481fec5cdbcb222df466c24740331d60f0521285f7d3 +8ddadbe3cf13af50d556ce8fc0dd77971ac83fad9985c3d089b1b02d1e3afc330628635a31707b32595626798ea22d45 +a5c80254baf8a1628dc77c2445ebe21fbda0de09dd458f603e6a9851071b2b7438fe74214df293dfa242c715d4375c95 +b9d83227ed2600a55cb74a7052003a317a85ca4bea50aa3e0570f4982b6fe678e464cc5156be1bd5e7bba722f95e92c5 +b56085f9f3a72bea9aa3a8dc143a96dd78513fa327b4b9ba26d475c088116cab13843c2bff80996bf3b43d3e2bddb1d6 +8fa9b39558c69a9757f1e7bc3f07295e4a433da3e6dd8c0282397d26f64c1ecd8eb3ba9824a7cacfb87496ebbb45d962 +879c6d0cb675812ed9dee68c3479a499f088068501e2677caeae035e6f538da91a49e245f5fcce135066169649872bee +91aa9fd3fed0c2a23d1edda8a6542188aeb8abee8772818769bdee4b512d431e4625a343af5d59767c468779222cf234 +a6be0bb2348c35c4143482c7ef6da9a93a5356f8545e8e9d791d6c08ed55f14d790d21ee61d3a56a2ae7f888a8fd46ca +808ee396a94e1b8755f2b13a6ffbedef9e0369e6c2e53627c9f60130c137299d0e4924d8ef367e0a7fad7f68a8c9193c +ad1086028fcdac94d5f1e7629071e7e47e30ad0190ae59aaebfb7a7ef6202ab91323a503c527e3226a23d7937af41a52 +9102bdaf79b907d1b25b2ec6b497e2d301c8eac305e848c6276b392f0ad734131a39cc02ed42989a53ca8da3d6839172 +8c976c48a45b6bc7cd7a7acea3c2d7c5f43042863b0661d5cd8763e8b50730552187a8eecf6b3d17be89110208808e77 +a2624c7e917e8297faa3af89b701953006bf02b7c95dfba00c9f3de77748bc0b13d6e15bb8d01377f4d98fb189538142 +a405f1e66783cdcfe20081bce34623ec3660950222d50b7255f8b3cc5d4369aeb366e265e5224c0204911539f0fa165e +8d69bdcaa5d883b5636ac8f8842026fcc58c5e2b71b7349844a3f5d6fbecf44443ef4f768eac376f57fb763606e92c9f +82fce0643017d16ec1c3543db95fb57bfa4855cc325f186d109539fcacf8ea15539be7c4855594d4f6dc628f5ad8a7b0 +8860e6ff58b3e8f9ae294ff2487f0d3ffae4cf54fd3e69931662dabc8efd5b237b26b3def3bcd4042869d5087d22afcf +88c80c442251e11c558771f0484f56dc0ed1b7340757893a49acbf96006aa73dfc3668208abea6f65375611278afb02a +8be3d18c6b4aa8e56fcd74a2aacb76f80b518a360814f71edb9ccf3d144bfd247c03f77500f728a62fca7a2e45e504c5 +8b8ebf0df95c3f9b1c9b80469dc0d323784fd4a53f5c5357bb3f250a135f4619498af5700fe54ad08744576588b3dfff +a8d88abdaadd9c2a66bc8db3072032f63ed8f928d64fdb5f810a65074efc7e830d56e0e738175579f6660738b92d0c65 +a0a10b5d1a525eb846b36357983c6b816b8c387d3890af62efb20f50b1cb6dd69549bbef14dab939f1213118a1ae8ec2 +8aadf9b895aeb8fdc9987daa937e25d6964cbd5ec5d176f5cdf2f0c73f6f145f0f9759e7560ab740bf623a3279736c37 +99aeda8a495031cc5bdf9b842a4d7647c55004576a0edc0bd9b985d60182608361ed5459a9d4b21aa8e2bd353d10a086 +832c8b3bfcd6e68eee4b100d58014522de9d4cefa99498bc06c6dca83741e4572e20778e0d846884b33439f160932bca +841f56ebefc0823ab484fc445d62f914e13957e47904419e42771aa605e33ab16c44f781f6f9aa42e3a1baf377f54b42 +a6e40271d419e295a182725d3a9b541ffd343f23e37549c51ecaa20d13cf0c8d282d6d15b24def5702bfee8ba10b12ac +8ac00925ac6187a4c5cde48ea2a4eaf99a607e58b2c617ee6f01df30d03fafada2f0469178dd960d9d64cbd33a0087d8 +b6b80916b540f8a0fe4f23b1a06e2b830008ad138271d5ba3cd16d6619e521fe2a7623c16c41cba48950793386eea942 +8412c0857b96a650e73af9d93087d4109dd092ddf82188e514f18fcac644f44d4d62550bfa63947f2d574a2e9d995bbb +b871395baa28b857e992a28ac7f6d95ec461934b120a688a387e78498eb26a15913b0228488c3e2360391c6b7260b504 +926e2d25c58c679be77d0e27ec3b580645956ba6f13adcbc2ea548ee1b7925c61fcf74c582337a3b999e5427b3f752f2 +a165fa43fecae9b913d5dcfc232568e3e7b8b320ce96b13800035d52844c38fd5dbf7c4d564241d860c023049de4bcbc +b4976d7572fd9cc0ee3f24888634433f725230a7a2159405946a79315bc19e2fc371448c1c9d52bf91539fd1fe39574b +a6b461eb72e07a9e859b9e16dfa5907f4ac92a5a7ca4368b518e4a508dc43f9b4be59db6849739f3ef4c44967b63b103 +b976606d3089345d0bc501a43525d9dca59cf0b25b50dfc8a61c5bd30fac2467331f0638fab2dc68838aa6ee8d2b6bc9 +b16ea61c855da96e180abf7647fa4d9dd6fd90adebadb4c5ed4d7cd24737e500212628fca69615d89cb40e9826e5a214 +95a3e3162eb5ea27a613f8c188f2e0dcc5cbd5b68c239858b989b004d87113e6aa3209fa9fad0ee6ecef42814ba9db1a +b6a026ab56d3224220e5bce8275d023c8d39d1bdf7eec3b0923429b7d5ef18cf613a3591d364be8727bb1fa0ba11eabb +949f117e2e141e25972ee9ccdd0b7a21150de7bbf92bbd89624a0c5f5a88da7b2b172ba2e9e94e1768081f260c2a2f8d +b7c5e9e6630287d2a20a2dfb783ffe6a6ff104ff627c6e4e4342acc2f3eb6e60e9c22f465f8a8dc58c42f49840eca435 +872be5a75c3b85de21447bb06ac9eb610f3a80759f516a2f99304930ddf921f34cbffc7727989cdd7181d5fc62483954 +a50976ea5297d797d220932856afdd214d1248230c9dcd840469ecc28ea9f305b6d7b38339fedb0c00b5251d77af8c95 +80b360f8b44914ff6f0ffbd8b5360e3cabe08639f6fe06d0c1526b1fe9fe9f18c497f1752580b30e950abd3e538ad416 +a2f98f9bf7fac78c9da6bb41de267742a9d31cf5a04b2fb74f551084ec329b376f651a59e1ae919b2928286fb566e495 +8b9d218a8a6c150631548e7f24bbd43f132431ae275c2b72676abbea752f554789c5ff4aac5c0eeee5529af7f2b509ef +aa21a243b07e9c7b169598bf0b102c3c280861780f83121b2ef543b780d47aaa4b1850430ee7927f33ece9847c4e0e1a +8a6f90f4ce58c8aa5d3656fe4e05acccf07a6ec188a5f3cde7bf59a8ae468e66f055ac6dfc50b6e8e98f2490d8deedc5 +8e39f77ca4b5149ffe9945ceac35d068760ba338d469d57c14f626dd8c96dbe993dd7011beff727c32117298c95ee854 +83bd641c76504222880183edd42267e0582642c4993fe2c7a20ce7168e4c3cbf7586e1d2d4b08c84d9b0bf2f6b8800b8 +a9d332993cf0c1c55130e5cf3a478eb5e0bfb49c25c07538accc692ef03d82b458750a7b991cc0b41b813d361a5d31e3 +a0fc60e6a6015df9bee04cea8f20f01d02b14b6f7aa03123ab8d65da071b2d0df5012c2a69e7290baae6ed6dd29ebe07 +a2949dde2e48788ceaac7ec7243f287ffe7c3e788cdba97a4ab0772202aeef2d50382bed8bf7eff5478243f7eabe0bda +a7879373ea18572dba6cf29868ca955ffa55b8af627f29862f6487ee398b81fe3771d8721ca8e06716c5d91b9ac587cb +b3c7081e2c5306303524fbe9fe5645111a57dffd4ec25b7384da12e56376a0150ab52f9d9cc6ca7bdd950695e39b766d +a634a6a19d52dcb9f823352b36c345d2de54b75197bcd90528d27830bd6606d1a9971170de0849ed5010afa9f031d5be +88f2062f405fa181cfdb8475eaf52906587382c666ca09a9522537cfebbc7de8337be12a7fd0db6d6f2f7ab5aefab892 +b1f0058c1f273191247b98783b2a6f5aa716cf799a8370627fc3456683f03a624d0523b63a154fe9243c0dfd5b37c460 +ae39a227cc05852437d87be6a446782c3d7fbe6282e25cf57b6b6e12b189bdc0d4a6e2c3a60b3979256b6b5baf8f1c5f +802a1af228ab0c053b940e695e7ef3338f5be7acf4e5ed01ac8498e55b492d3a9f07996b1700a84e22f0b589638909cd +a36490832f20e4b2f9e79ee358b66d413f034d6a387534b264cdeac2bca96e8b5bcbdd28d1e98c44498032a8e63d94d2 +8728c9a87db2d006855cb304bba54c3c704bf8f1228ae53a8da66ca93b2dac7e980a2a74f402f22b9bc40cd726e9c438 +a08f08ab0c0a1340e53b3592635e256d0025c4700559939aeb9010ed63f7047c8021b4210088f3605f5c14fb51d1c613 +9670fd7e2d90f241e8e05f9f0b475aa260a5fb99aa1c9e61cd023cbad8ed1270ae912f168e1170e62a0f6d319cf45f49 +a35e60f2dd04f098bf274d2999c3447730fe3e54a8aff703bc5a3c274d22f97db4104d61a37417d93d52276b27ef8f31 +859df7a21bc35daec5695201bd69333dc4f0f9e4328f2b75a223e6615b22b29d63b44d338413ca97eb74f15563628cb7 +b2b44ad3e93bc076548acdf2477803203108b89ecc1d0a19c3fb9814d6b342afc420c20f75e9c2188ad75fdb0d34bb2d +941173ee2c87765d10758746d103b667b1227301e1bcfecef2f38f9ab612496a9abd3050cef5537bf28cfecd2aacc449 +92b0bea30ebed20ac30648efb37bac2b865daaa514316e6f5470e1de6cb84651ff77c127aa7beed4521bda5e8fc81122 +af17bf813bb238cf8bb437433f816786612209180a6c0a1d5141292dc2d2c37164ef13bfc50c718bfcc6ce26369298a2 +8461fd951bdfda099318e05cc6f75698784b033f15a71bce26165f0ce421fd632d50df9eeced474838c0050b596e672c +83281aa18ae4b01e8201e1f64248cc6444c92ee846ae72adb178cef356531558597d84ff93a05abf76bfe313eb7dbe86 +b62b150f73999c341daa4d2f7328d2f6ca1ef3b549e01df58182e42927537fc7971c360fe8264af724f4c0247850ef12 +a7022a201f79c012f982b574c714d813064838a04f56964d1186691413757befeeaada063e7884297606e0eea1b1ed43 +a42ac9e8be88e143853fd8e6a9ff21a0461801f0ac76b69cca669597f9af17ecb62cccdcdcbe7f19b62ab93d7f838406 +80f1ca73b6ba3a2fbae6b79b39c0be8c39df81862d46c4990c87cbf45b87996db7859d833abc20af2fcb4faf059c436a +b355943e04132d5521d7bbe49aea26f6aa1c32f5d0853e77cc2400595325e923a82e0ff7601d1aee79f45fd8a254f6ae +87142c891d93e539b31d0b5ead9ea600b9c84db9be9369ff150a8312fe3d10513f4c5b4d483a82b42bc65c45dd9dd3bd +823c3d7f6dda98a9d8c42b3fee28d3154a95451402accadb6cf75fc45d2653c46a569be75a433094fa9e09c0d5cf1c90 +b3c3497fe7356525c1336435976e79ec59c5624c2fb6185ee09ca0510d58b1e392965e25df8a74d90d464c4e8bb1422b +88c48d83e8ddc0d7eea051f3d0e21bc0d3a0bb2b6a39ece76750c1c90c382a538c9a35dc9478b8ceb8157dcccbbf187a +93da81a8939f5f58b668fefdc6f5f7eca6dc1133054de4910b651f8b4a3267af1e44d5a1c9e5964dc7ab741eb146894b +8b396e64985451ac337f16be61105106e262e381ea04660add0b032409b986e1ac64da3bc2feae788e24e9cb431d8668 +9472068b6e331ea67e9b5fbf8057672da93c209d7ded51e2914dbb98dccd8c72b7079b51fd97a7190f8fc8712c431538 +ac47e1446cb92b0a7406f45c708567f520900dfa0070d5e91783139d1bfc946d6e242e2c7b3bf4020500b9f867139709 +896053706869fb26bb6f7933b3d9c7dd6db5c6bd1269c7a0e222b73039e2327d44bda7d7ae82bf5988808b9831d78bcd +a55e397fa7a02321a9fe686654c86083ecedb5757586d7c0250ec813ca6d37151a12061d5feca4691a0fd59d2f0fdd81 +ae23f08ac2b370d845036518f1bddb7fea8dc59371c288a6af310486effeb61963f2eef031ca90f9bdbcf0e475b67068 +b5462921597a79f66c0fec8d4c7cfd89f427692a7ce30d787e6fd6acd2377f238ec74689a0fdbe8ef3c9c9bd24b908dc +ae67e8ea7c46e29e6aae6005131c29472768326819aa294aaf5a280d877de377b44959adb1348fa3e929dcbc3ae1f2c0 +84962b4c66500a20c4424191bdfb619a46cda35bdb34c2d61edcb0b0494f7f61dd5bf8f743302842026b7b7d49edd4b5 +846f76286dc3cc59cb15e5dabb72a54a27c78190631df832d3649b2952fa0408ecde7d4dfdae7046c728efa29879fb51 +8f76c854eaee8b699547e07ad286f7dadfa6974c1328d12502bd7630ae619f6129272fdd15e2137ffef0143c42730977 +8007b163d4ea4ec6d79e7a2aa19d06f388da0b3a56f3ee121441584e22a246c0e792431655632bf6e5e02cb86914eebf +ac4d2cecc1f33e6fb73892980b61e62095ddff5fd6167f53ca93d507328b3c05440729a277dc3649302045b734398af1 +92d2a88f2e9c9875abaff0d42624ccb6d65401de7127b5d42c25e6adccd7a664504c5861618f9031ced8aeb08b779f06 +a832c1821c1b220eb003fc532af02c81196e98df058cdcc9c9748832558362915ea77526937f30a2f74f25073cb89afb +b6f947ab4cc2baec100ed8ec7739a2fd2f9504c982b39ab84a4516015ca56aea8eef5545cfc057dd44c69b42125fb718 +b24afacf2e90da067e5c050d2a63878ee17aaf8fd446536f2462da4f162de87b7544e92c410d35bf2172465940c19349 +b7a0aa92deac71eaab07be8fa43086e071e5580f5dbf9b624427bdd7764605d27303ae86e5165bed30229c0c11958c38 +b0d1d5bfa1823392c5cf6ed927c1b9e84a09a24b284c2cd8fcb5fda8e392c7c59412d8f74eb7c48c6851dff23ae66f58 +a24125ef03a92d2279fb384186ca0274373509cfec90b34a575490486098438932ee1be0334262d22d5f7d3db91efe67 +83e08e5fba9e8e11c164373794f4067b9b472d54f57f4dbe3c241cf7b5b7374102de9d458018a8c51ab3aed1dddf146f +9453101b77bb915ed40990e1e1d2c08ea8ec5deb5b571b0c50d45d1c55c2e2512ec0ceca616ff0376a65678a961d344d +92a0516e9eb6ad233d6b165a8d64a062ce189b25f95d1b3264d6b58da9c8d17da2cd1f534800c43efcf2be73556cd2ff +958d0b5d7d8faf25d2816aa6a2c5770592ad448db778dd9b374085baa66c755b129822632eaabcb65ee35f0bf4b73634 +90a749de8728b301ad2a6b044e8c5fd646ccd8d20220e125cba97667e0bb1d0a62f6e3143b28f3d93f69cdc6aa04122a +84bd34c8d8f74dec07595812058db24d62133c11afed5eb2a8320d3bfc28e442c7f0cfd51011b7b0bb3e5409cb7b6290 +aecc250b556115d97b553ad7b2153f1d69e543e087890000eaa60f4368b736921d0342ce5563124f129096f5d5e2ca9d +977f17ac82ed1fbf422f9b95feb3047a182a27b00960296d804fd74d54bb39ad2c055e665c1240d2ad2e06a3d7501b00 +af5be9846bd4879ebe0af5e7ad253a632f05aedfe306d31fe6debe701ba5aa4e33b65efc05043bc73aadb199f94baed4 +9199e12ec5f2aaaeed6db5561d2dcc1a8fe9c0854f1a069cba090d2dff5e5ba52b10c841ccbd49006a91d881f206150d +8f4a96a96ed8ceaf3beba026c89848c9ca4e6452ce23b7cf34d12f9cc532984a498e051de77745bdc17c7c44c31b7c30 +af3f2a3dbe8652c4bfca0d37fb723f0e66aab4f91b91a625114af1377ad923da8d36da83f75deb7a3219cd63135a3118 +a6d46963195df8962f7aa791d104c709c38caa438ddd192f7647a884282e81f748c94cdf0bb25d38a7b0dc1b1d7bbcf7 +86f3de4b22c42d3e4b24b16e6e8033e60120af341781ab70ae390cb7b5c5216f6e7945313c2e04261a51814a8cb5db92 +b9f86792e3922896cfd847d8ff123ff8d69ecf34968fb3de3f54532f6cd1112b5d34eeabdca46ae64ad9f6e7e5b55edc +83edfbcbc4968381d1e91ab813b3c74ab940eaf6358c226f79182f8b21148ec130685fd91b0ea65916b0a50bccf524ea +93b61daca7a8880b7926398760f50016f2558b0bab74c21181280a1baf3414fc539911bb0b79c4288d29d3c4ad0f4417 +ad541aeb83a47526d38f2e47a5ce7e23a9adabe5efeae03541026881e6d5ef07da3ac1a6ed466ca924fa8e7a91fcff88 +ac4bba31723875025640ed6426003ed8529215a44c9ffd44f37e928feef9fc4dfa889088131c9be3da87e8f3fdf55975 +88fa4d49096586bc9d29592909c38ea3def24629feacd378cc5335b70d13814d6dac415f8c699ee1bf4fe8b85eb89b38 +b67d0b76cbd0d79b71f4673b96e77b6cda516b8faa1510cfe58ff38cc19000bb5d73ff8418b3dab8c1c7960cb9c81e36 +98b4f8766810f0cfecf67bd59f8c58989eb66c07d3dfeee4f4bbce8fd1fce7cc4f69468372eaec7d690748543bd9691d +8445891af3c298b588dec443beacdf41536adb84c812c413a2b843fd398e484eb379075c64066b460839b5fe8f80177c +b603635c3ed6fdc013e2a091fc5164e09acf5f6a00347d87c6ebadb1f44e52ff1a5f0466b91f3f7ffc47d25753e44b75 +87ec2fc928174599a9dafe7538fec7dcf72e6873b17d953ed50708afff0da37653758b52b7cafa0bf50dfcf1eafbb46c +b9dbd0e704d047a457d60efe6822dc679e79846e4cbcb11fa6c02079d65673ee19bbf0d14e8b7b200b9205f4738df7c7 +9591ec7080f3f5ba11197a41f476f9ba17880f414d74f821a072ec5061eab040a2acba3d9856ff8555dfe5eaeb14ca19 +b34c9d1805b5f1ce38a42b800dec4e7f3eb8c38e7d2b0a525378e048426fed150dbfe9cc61f5db82b406d1b9ff2d10bf +a36fdc649dc08f059dfa361e3969d96b4cc4a1ebf10b0cd01a7dd708430979e8d870961fef85878f8779b8e23caafb18 +88dfc739a80c16c95d9d6f73c3357a92d82fa8c3c670c72bee0f1e4bac9ec338e1751eb786eda3e10f747dd7a686900f +84a535ad04f0961756c61c70001903a9adf13126983c11709430a18133c4b4040d17a33765b4a06968f5d536f4bfb5c5 +8c86d695052a2d2571c5ace744f2239840ef21bb88e742f050c7fa737cd925418ecef0971333eb89daa6b3ddfede268c +8e9a700157069dc91e08ddcbdde3a9ad570272ad225844238f1015004239c542fceb0acce6d116c292a55f0d55b6175e +84d659e7f94e4c1d15526f47bc5877a4ef761c2a5f76ec8b09c3a9a30992d41b0e2e38ed0c0106a6b6c86d670c4235f3 +a99253d45d7863db1d27c0ab561fb85da8c025ba578b4b165528d0f20c511a9ca9aff722f4ff7004843f618eb8fced95 +89a3cacb15b84b20e95cd6135550146bbe6c47632cc6d6e14d825a0c79b1e02b66f05d57d1260cb947dc4ae5b0283882 +8385b1555e794801226c44bd5e878cbe68aeac0a19315625a8e5ea0c3526b58cdd4f53f9a14a167a5e8a293b530d615a +b68c729e9df66c5cd22af4909fb3b0057b6a231c4a31cd6bf0fa0e53c5809419d15feb483de6e9408b052458e819b097 +924f56eda269ec7ec2fc20c5731bf7f521546ddf573ccbe145592f1c9fee5134747eb648d9335119a8066ca50a1f7e50 +b2100a26b9c3bec7ec5a53f0febbf56303f199be2f26b2d564cfee2adc65483b84192354f2865c2f4c035fa16252ae55 +8f64dbed62e638563967ec1605a83216aed17eb99aa618c0543d74771ea8f60bbb850c88608d4f8584f922e30a8a0a72 +b31b9e1ffe8d7260479c9413f8e680f3fe391ae8fcf44fcca3000d9b2473a40c1d32299f8f63865a57579a2d6c7e9f08 +a5b1d136142eb23e322c6c07cb838a3f58ab6925472352ebd0bb47041a0d8729e1074ca223922f3a7a672ced7a1e562d +8d9470a5a15d833a447b5f108333d50f30aa7659e331c3f8080b1e928a99922edc650466a2f54f3d48afdb34bff42142 +866368f5891564e5b2de37ad21ff0345c01129a14ea5667f9b64aad12d13ec034622872e414743af0bf20adb2041b497 +88ef9c2ebf25fd0c04b7cfa35fbac2e4156d2f1043fa9f98998b2aa402c8f9a4f1039e782451a46840f3e0e4b3fa47d3 +94ba04a4859273697e264a2d238dc5c9ff573ebc91e4796ea58eebe4080c1bf991255ab2ad8fb1e0301ce7b79cc6e69b +86b6bd0953309a086e526211bf1a99327269304aa74d8cdc994cee63c3a2d4b883e832b0635888dff2a13f1b02eb8df4 +843ea6ea5f2c7a1fd50be56a5765dcce3ea61c99b77c1a729ee0cd8ec706385ac7062e603479d4c8d3527f030762d049 +8d3675195a3b06f2d935d45becc59f9fa8fa440c8df80c029775e47fe9c90e20f7c8e4cc9a2542dd6bfe87536c428f0d +8978580b0c9b0aa3ab2d47e3cfd92fa891d3ddee57829ee4f9780e8e651900457d8e759d1a9b3e8f6ae366e4b57f2865 +890112ec81d0f24b0dfbb4d228e418eff02ae63dc691caf59c1d103e1d194e6e2550e1bec41c0bfdb74fed454f621d0c +97da00bd4b19d1e88caff7f95b8b9a7d29bc0afe85d0c6a163b4b9ef336f0e90e2c49ce6777024bb08df908cc04ea1ca +b458268d275a5211106ccaa8333ce796ef2939b1c4517e502b6462e1f904b41184a89c3954e7c4f933d68b87427a7bfd +aac9c043ba8ba9283e8428044e6459f982413380ee7005a996dc3cc468f6a21001ecaa3b845ce2e73644c2e721940033 +82145013c2155a1200246a1e8720adf8a1d1436b10d0854369d5b1b6208353e484dd16ce59280c6be84a223f2d45e5e2 +b301bafa041f9b203a46beab5f16160d463aa92117c77a3dc6a9261a35645991b9bafcc186c8891ca95021bd35f7f971 +a531b8d2ac3de09b92080a8d8857efa48fb6a048595279110e5104fee7db1dd7f3cfb8a9c45c0ed981cbad101082e335 +a22ac1d627d08a32a8abd41504b5222047c87d558ffae4232cefdeb6a3dc2a8671a4d8ddfba2ff9068a9a3ffb0fe99b1 +b8d9f0e383c35afb6d69be7ff04f31e25c74dd5751f0e51290c18814fbb49ee1486649e64355c80e93a3d9278bd21229 +8165babccd13033a3614c878be749dfa1087ecbeee8e95abcfffe3aa06695711122cb94477a4d55cffd2febf0c1173de +a4c1bc84ecb9d995d1d21c2804adf25621676d60334bd359dac3a2ec5dc8de567aa2831c10147034025fb3e3afb33c4b +b77307cab8e7cb21e4038493058fb6db9e2ec91dda9d7f96f25acbc90309daf7b6d8a205682143ee35d675e9800c3b08 +aaf7466083cd1f325ba860efe3faf4cebe6a5eecf52c3e8375d72043a5cfc8e6cb4b40f8e48f97266e84f0d488e8badf +9264a05a3abc2a5b4958f957f3a486a5eb3ddd10ff57aa6943c9430d0cfa01d63b72695b1ade50ac1b302d312175e702 +b3f9e4c589ad28b1eceed99dc9980fac832524cfcbe4a486dfeedb4b97c080e24bdb3967e9ca63d2240e77f9addfaefd +b2c1e253a78e7179e5d67204422e0debfa09c231970b1bfb70f31a8d77c7f5059a095ca79d2e9830f12c4a8f88881516 +81865a8a25913d1072cb5fd9505c73e0fde45e4c781ddd20fb0a7560d8b1cd5e1f63881c6efc05360e9204dfa6c3ce16 +ab71c2ea7fa7853469a2236dedb344a19a6130dc96d5fd6d87d42d3fffda172557d203b7688ce0f86acd913ce362e6cd +8aa2051bc3926c7bd63565f3782e6f77da824cb3b22bb056aa1c5bccfa274c0d9e49a91df62d0e88876e2bd7776e44b9 +b94e7074167745323d1d353efe7cfb71f40a390e0232354d5dfd041ef523ac8f118fb6dcc42bf16c796e3f61258f36f8 +8210fcf01267300cb1ccf650679cf6e1ee46df24ae4be5364c5ff715332746c113d680c9a8be3f17cacaeb3a7ba226ce +905ac223568eedc5acd8b54e892be05a21abbb4083c5dbec919129f9d9ffa2c4661d78d43bf5656d8d7aafa06f89d647 +a6e93da7e0c998e6ce2592d1aa87d12bf44e71bec12b825139d56682cdce8f0ba6dbfe9441a9989e10578479351a3d9d +acde928a5e2df0d65de595288f2b81838155d5673013100a49b0cb0eb3d633237af1378148539e33ccd1b9a897f0fec3 +a6e1a47e77f0114be6ae7acd2a51e6a9e38415cce7726373988153cdd5d4f86ef58f3309adc5681af4a159300ed4e5b5 +ad2b6a0d72f454054cb0c2ebc42cd59ff2da7990526bd4c9886003ba63b1302a8343628b8fe3295d3a15aa85150e0969 +b0bc3aea89428d7918c2ee0cc57f159fba134dad224d0e72d21a359ca75b08fbb4373542f57a6408352033e1769f72c6 +aad0497525163b572f135fad23fdd8763631f11deeaf61dea5c423f784fe1449c866040f303555920dc25e39cdb2e9b4 +8ce5d8310d2e17342bf881d517c9afc484d12e1f4b4b08ad026b023d98cba410cd9a7cc8e2c3c63456652a19278b6960 +8d9d57dbb24d68b6152337872bd5d422198da773174ade94b633f7c7f27670ff91969579583532ae7d8fe662c6d8a3b0 +855a1c2d83becb3f02a8f9a83519d1cb112102b61d4cdd396844b5206e606b3fefdbcc5aa8751da2b256d987d74d9506 +90eb7e6f938651f733cf81fcd2e7e8f611b627f8d94d4ac17ac00de6c2b841e4f80cada07f4063a13ae87b4a7736ca28 +8161459a21d55e7f5f1cecfc1595c7f468406a82080bfa46d7fb1af4b5ec0cd2064c2c851949483db2aa376e9df418e6 +8344ccd322b2072479f8db2ab3e46df89f536408cba0596f1e4ec6c1957ff0c73f3840990f9028ae0f21c1e9a729d7df +929be2190ddd54a5afe98c3b77591d1eae0ab2c9816dc6fe47508d9863d58f1ea029d503938c8d9e387c5e80047d6f1e +856e3d1f701688c650c258fecd78139ce68e19de5198cf1cd7bb11eba9d0f1c5af958884f58df10e3f9a08d8843f3406 +8490ae5221e27a45a37ca97d99a19a8867bcc026a94f08bdccfbb4b6fa09b83c96b37ec7e0fd6ee05f4ae6141b6b64a8 +b02dbd4d647a05ac248fda13708bba0d6a9cd00cae5634c1938b4c0abbb3a1e4f00f47aa416dcd00ffcdf166330bff9a +9076164bb99ca7b1a98d1e11cb2f965f5c22866658e8259445589b80e3cb3119c8710ede18f396ba902696785619079c +aacf016920936dae63778ad171386f996f65fe98e83cfcdd75e23774f189303e65cc8ad334a7a62f9230ed2c6b7f6fa4 +a8031d46c7f2474789123469ef42e81c9c35eb245d38d8f4796bba406c02b57053f5ec554d45373ab437869a0b1af3f0 +a4b76cd82dc1f305a0ee053e9a4212b67f5acc5e69962a8640d190a176b73fbc2b0644f896ff3927cd708d524668ed09 +b00b029c74e6fdf7fb94df95ef1ccad025c452c19cddb5dccfb91efdcb8a9a1c17847cfa4486eae4f510e8a6c1f0791a +9455e5235f29a73e9f1a707a97ddb104c55b9d6a92cc9952600d49f0447d38ea073ee5cf0d13f7f55f12b4a5132f4b10 +ae118847542ed1084d269e8f3b503d0b6571a2c077def116ad685dcca2fca3dcb3f86e3f244284bdcd5ae7ac968d08a5 +8dcb4965cd57e8b89cd71d6fc700d66caa805bfd29ab71357961527a7894e082d49145c2614b670dcb231ab9050d0663 +add6ed14f3183f4acc73feea19b22c9a330e431c674e5034924da31b69e8c02d79b570d12ef771a04215c4809e0f8a80 +96ae7e110412ee87d0478fdbdbaab290eb0b6edd741bb864961845e87fd44bcbe630371060b8104d8bf17c41f2e3fca0 +a20db17f384e9573ca0928af61affab6ff9dd244296b69b026d737f0c6cd28568846eca8dadf903ee0eecbb47368351d +937bfdf5feb0797863bc7c1be4dcc4f2423787952a3c77dfa3bfe7356f5dbcc4daebde976b84fc6bd97d5124fb8f85c9 +a7050cc780445c124e46bba1acc0347ddcfa09a85b35a52cc5808bf412c859c0c680c0a82218f15a6daeefe73f0d0309 +a9d9b93450e7630f1c018ea4e6a5ca4c19baa4b662eadfbe5c798fe798d8a3775ed1eb12bd96a458806b37ab82bdc10a +a52a4d5639e718380915daaefad7de60764d2d795443a3db7aeab5e16a1b8faa9441a4ccc6e809d8f78b0ac13eef3409 +8e6f72b6664a8433b032849b03af68f9376b3c16c0bc86842c43fc7bf31e40bc9fc105952d5c5780c4afa19d7b802caa +a107ae72f037000c6ee14093de8e9f2c92aa5f89a0a20007f4126419e5cb982469c32187e51a820f94805c9fccd51365 +9708218f9a984fe03abc4e699a4f3378a06530414a2e95e12ca657f031ef2e839c23fd83f96a4ba72f8203d54a1a1e82 +b9129770f4c5fcac999e98c171d67e148abd145e0bf2a36848eb18783bb98dff2c5cef8b7407f2af188de1fae9571b1c +88cc9db8ff27eb583871eeeb517db83039b85404d735517c0c850bdfa99ae1b57fd24cf661ab60b4726878c17e047f37 +a358c9aadc705a11722df49f90b17a2a6ba057b2e652246dc6131aaf23af66c1ca4ac0d5f11073a304f1a1b006bc0aa5 +ac79f25af6364a013ba9b82175ccee143309832df8f9c3f62c193660253679284624e38196733fb2af733488ab1a556e +82338e3ed162274d41a1783f44ae53329610134e6c62565353fbcc81131e88ce9f8a729d01e59e6d73695a378315111b +aa5ddcabf580fd43b6b0c3c8be45ffd26c9de8fa8d4546bb92d34f05469642b92a237d0806a1ad354f3046a4fcf14a92 +b308d2c292052a8e17862c52710140ffafa0b3dbedd6a1b6334934b059fe03e49883529d6baf8b361c6e67b3fbf70100 +96d870a15c833dddd8545b695139733d4a4c07d6206771a1524500c12607048731c49ec4ac26f5acc92dd9b974b2172c +8e99ee9ed51956d05faaf5038bffd48a2957917a76d9974a78df6c1ff3c5423c5d346778f55de07098b578ad623a390e +a19052d0b4b89b26172c292bbf6fd73e7486e7fd3a63c7a501bbd5cf7244e8e8ce3c1113624086b7cdf1a7693fdad8b5 +958957caf99dc4bb6d3c0bc4821be10e3a816bd0ba18094603b56d9d2d1383ccc3ee8bc36d2d0aea90c8a119d4457eb4 +8482589af6c3fc4aa0a07db201d8c0d750dd21ae5446ff7a2f44decf5bff50965fd6338745d179c67ea54095ecd3add4 +8a088cc12cf618761eaa93da12c9158b050c86f10cd9f865b451c69e076c7e5b5a023e2f91c2e1eed2b40746ca06a643 +85e81101590597d7671f606bd1d7d6220c80d3c62e9f20423e734482c94547714a6ac0307e86847cce91de46503c6a8a +b1bd39b481fc452d9abf0fcb73b48c501aaae1414c1c073499e079f719c4e034da1118da4ff5e0ce1c5a71d8af3f4279 +942ae5f64ac7a5353e1deb2213f68aa39daa16bff63eb5c69fc8d9260e59178c0452227b982005f720a3c858542246c8 +99fea18230e39df925f98e26ff03ab959cae7044d773de84647d105dfa75fd602b4f519c8e9d9f226ec0e0de0140e168 +97b9841af4efd2bfd56b9e7cd2275bc1b4ff5606728f1f2b6e24630dbe44bc96f4f2132f7103bca6c37057fc792aeaab +94cdad044a6ab29e646ed30022c6f9a30d259f38043afcea0feceef0edc5f45297770a30718cbfec5ae7d6137f55fe08 +a533a5efa74e67e429b736bb60f2ccab74d3919214351fe01f40a191e3ec321c61f54dd236f2d606c623ad556d9a8b63 +b7bd0bb72cd537660e081f420545f50a6751bb4dd25fde25e8218cab2885dd81ffe3b888d608a396dfcb78d75ba03f3f +b1479e7aa34594ec8a45a97611d377206597149ece991a8cef1399738e99c3fa124a40396a356ab2ea135550a9f6a89f +b75570fc94b491aef11f70ef82aeb00b351c17d216770f9f3bd87f3b5ac90893d70f319b8e0d2450dc8e21b57e26df94 +a5e3f3ab112530fe5c3b41167f7db5708e65479b765b941ce137d647adb4f03781f7821bb4de80c5dc282c6d2680a13d +b9b9c81b4cac7aca7e7c7baac2369d763dd9846c9821536d7467b1a7ec2e2a87b22637ab8bbeddb61879a64d111aa345 +b1e3ee2c4dd03a60b2991d116c372de18f18fe279f712829b61c904103a2bd66202083925bc816d07884982e52a03212 +a13f0593791dbbd360b4f34af42d5cc275816a8db4b82503fe7c2ff6acc22ae4bd9581a1c8c236f682d5c4c02cc274cc +86ba8238d3ed490abcc3f9ecc541305876315fb71bca8aaf87538012daab019992753bf1e10f8670e33bff0d36db0bf0 +b65fbb89fafb0e2a66fe547a60246d00b98fe2cb65db4922d9cef6668de7b2f4bb6c25970f1e112df06b4d1d953d3f34 +abb2d413e6f9e3c5f582e6020f879104473a829380b96a28123eb2bdd41a7a195f769b6ac70b35ba52a9fee9d6a289c3 +88ec764573e501c9d69098a11ea1ad20cdc171362f76eb215129cfcca43460140741ea06cee65a1f21b708afb6f9d5b0 +a7aaec27246a3337911b0201f4c5b746e45780598004dac15d9d15e5682b4c688158adffdef7179abb654f686e4c6adc +a1128589258f1fbfa33341604c3cb07f2a30c651086f90dce63ae48b4f01782e27c3829de5102f847cde140374567c58 +aaf2b149c1ca9352c94cc201125452b1ed7ca7c361ed022d626899426cb2d4cc915d76c58fa58b3ad4a6284a9ae1bc45 +aaf5c71b18b27cd8fe1a9028027f2293f0753d400481655c0d88b081f150d0292fb9bd3e6acabb343a6afb4afdb103b5 +947c0257d1fb29ecc26c4dc5eab977ebb47d698b48f9357ce8ff2d2ed461c5725228cc354a285d2331a60d20de09ff67 +b73e996fa30f581699052ed06054c474ebdf3ae662c4dc6f889e827b8b6263df67aeff7f2c7f2919df319a99bdfdceb1 +b696355d3f742dd1bf5f6fbb8eee234e74653131278861bf5a76db85768f0988a73084e1ae03c2100644a1fa86a49688 +b0abca296a8898ac5897f61c50402bd96b59a7932de61b6e3c073d880d39fc8e109998c9dba666b774415edddcff1997 +b7abe07643a82a7cb409ee4177616e4f91ec1cf733699bf24dec90da0617fe3b52622edec6e12f54897c4b288278e4f3 +8a3fae76993edbc81d7b47f049279f4dd5c408133436605d934dee0eadde187d03e6483409713db122a2a412cd631647 +82eb8e48becfdf06b2d1b93bf072c35df210cf64ed6086267033ad219bf130c55ee60718f28a0e1cad7bc0a39d940260 +a88f783e32944a82ea1ea4206e52c4bcf9962b4232e3c3b45bd72932ee1082527bf80864ce82497e5a8e40f2a60962d0 +830cf6b1e99430ae93a3f26fbfb92c741c895b017924dcd9e418c3dc4a5b21105850a8dd2536fa052667e508b90738f2 +990dce4c2c6f44bb6870328fba6aa2a26b0b8b2d57bfb24acf398b1edc0f3790665275f650884bd438d5403973469fa2 +a2e5b6232d81c94bcb7fed782e2d00ff70fc86a3abddbe4332cb0544b4e109ae9639a180ae4c1f416752ed668d918420 +b4cdf7c2b3753c8d96d92eb3d5fa984fef5d346a76dc5016552069e3f110356b82e9585b9c2f5313c76ffaecef3d6fd8 +83b23b87f91d8d602bff3a4aa1ead39fcc04b26cf113a9da6d2bd08ba7ea827f10b69a699c16911605b0126a9132140f +8aae7a2d9daa8a2b14f9168fe82933b35587a3e9ebf0f9c37bf1f8aa015f18fb116b7fba85a25c0b5e9f4b91ba1d350b +80d1163675145cc1fab9203d5581e4cd2bed26ad49f077a7927dec88814e0bed7912e6bbe6507613b8e393d5ee3be9be +93ddeb77b6a4c62f69b11cf36646ed089dcaa491590450456a525faf5659d810323b3effa0b908000887c20ac6b12c80 +9406360a2b105c44c45ba440055e40da5c41f64057e6b35a3786526869b853472e615e6beb957b62698a2e8a93608e13 +93bfc435ab9183d11e9ad17dac977a5b7e518db720e79a99072ce7e1b8fcb13a738806f414df5a3caa3e0b8a6ce38625 +8a12402c2509053500e8456d8b77470f1bbb9785dd7995ebbbe32fd7171406c7ce7bd89a96d0f41dbc6194e8f7442f42 +aab901e35bf17e6422722c52a9da8b7062d065169bf446ef0cbf8d68167a8b92dab57320c1470fee1f4fc6100269c6e2 +8cad277d9e2ba086378190d33f1116ba40071d2cb78d41012ec605c23f13009e187d094d785012b9c55038ec96324001 +85511c72e2894e75075436a163418279f660c417e1d7792edce5f95f2a52024d1b5677e2e150bf4339ad064f70420c60 +85549ca8dcbe49d16d4b3e2b8a30495f16c0de35711978ada1e2d88ad28e80872fca3fb02deb951b8bcb01b6555492e4 +8d379ab35194fe5edf98045a088db240a643509ddc2794c9900aa6b50535476daa92fd2b0a3d3d638c2069e535cd783b +b45cfebe529556b110392cb64059f4eb4d88aaf10f1000fdd986f7f140fdd878ce529c3c69dfd2c9d06f7b1e426e38f3 +ac009efd11f0c4cdd07dd4283a8181420a2ba6a4155b32c2fed6b9f913d98e057d0f5f85e6af82efc19eb4e2a97a82df +b2c2cdffa82f614e9cb5769b7c33c7d555e264e604e9b6138e19bcfc49284721180b0781ecbf321d7e60259174da9c3c +95789960f848797abbe1c66ef05d01d920228ca1f698130c7b1e6ca73bfda82cee672d30a9787688620554e8886554ee +98444018fa01b7273d3370eeb01adc8db902d5a69b9afc0aa9eadfeb43c4356863f19078d3c0d74e80f06ecf5a5223f4 +87d20b058050542f497c6645de59b8310f6eeec53acbc084e38b85414c3ea3016da3da690853498bde1c14de1db6f391 +a5c12b3a40e54bee82a315c503c1ce431309a862458030dde02376745ec1d6b9c1dbeea481ae6883425e9dae608e444e +b9daa3bf33f0a2979785067dcece83250e7bf6deb75bb1dbbab4af9e95ddfb3d38c288cbef3f80519a8916a77a43b56c +b682ec3118f71bde6c08f06ea53378ea404f8a1c4c273dd08989f2df39d6634f6463be1d172ac0e06f0fa19ac4a62366 +a4f94fd51ecf9d2065177593970854d3dce745eebb2a6d49c573cbf64a586ae949ddfa60466aaef0c0afb22bd92e0b57 +86cd5609efd570c51adbc606c1c63759c5f4f025fcbefab6bc3045b6ad2423628c68f5931ff56fdda985168ce993cc24 +981192e31e62e45572f933e86cdd5b1d28b1790b255c491c79bd9bb4964359b0e5f94f2ae0e00ef7fe7891b5c3904932 +9898f52b57472ebc7053f7bf7ab6695ce8df6213fc7f2d6f6ea68b5baad86ec1371a29304cae1baadf15083296958d27 +b676c4a8a791ae00a2405a0c88b9544878749a7235d3a5a9f53a3f822e0c5c1b147a7f3f0fc228049dc46e87aa6b6368 +9976e10beff544e5c1645c81a807739eff90449df58ffdd8d1aa45dd50b4c62f9370538b9855a00dd596480f38ebe7a5 +a0e91404894187ec23c16d39d647ada912a2c4febfd050a1ea433c4bfdc1568b4e97a78a89ba643aca3e2782033c3c58 +91a6ea9a80476ed137eb81558ff1d55b8581663cccd41db4fc286876226b6515fd38661557419e1e46b6a3bc9cda3741 +b9e8a1e23c60335a37a16f8085f80178a17d5e055d87ffe8cf63c532af923e5a5a2d76cf078164fb577996683796caa6 +ad8e151d87a37e8df438d0a6a7c02c3f511143efb93fde8aef334d218cb25932baf9e97c2f36c633620a024a5626af3d +978f942f210e8a482015e6fdc35a4c967c67b66e6e2a17a05cc7a0f2163aed227b775d4352b0c3cca6cbf4bd5bafaf75 +b5e2e3d8b2e871c07f5899e108e133f87479959b80cb8a103fbecde00ccdbfbd997540eef33079c5cc14b1c00c009fd1 +88a164b3fefd36857f429ab10002243b053f5d386466dbb9e5135ed3c72dd369a5a25e5e2aaa11f25488535e044e2f12 +a66091c0db4e7cf05a089ec2b9ff74744354d0196968201f5e201699144b52bb13b4e68e12502727163e6db96e3565f2 +8e65aff8e37240461b7374c20bfd1d58b73a525c28994a98f723daed9486130b3189f8efe5c5efcd7f5390cc366038da +8b37c21dd7304c3aa366959ba8c77ea8b22164a67e136808b6f8e48604297f7429a6c6ecf67b1d09b8b7ec083eacd7e0 +b689b1277ad050f53da91a702516a06d7406ff33a4714ea859b3b2b69f8d0aa8f983c7e039b19c0759a3815d841fa409 +b17f7a0a182ed4937f88489e4c4e6163dcf49fd2ea4d9efbba8126c743bea951cd769752acd02e921774dc8ebcfae33b +8b7fab4f90be825ac5d782a438e55c0a86be1c314a5dbc3cc6ed60760a8a94ef296391f1f6363652200cce4c188dae67 +ab8410c4eaa2bb43b0dd271aa2836061bc95cb600b0be331dada76ddb46711ff7a4ad8c466cc1078b9f9131f0dc9d879 +9194bd7b3cc218624459d51c4d6dbc13da5d3de313448f8175650fa4cfab7cc4afcda5427b6676c3c13897dc638b401e +980f61a0f01349acd8fc9fdc88fc2c5813610c07eecb6ab14af0845a980792a60dadf13bb4437b0169ae3eff8f5984ce +b783bee24acea9c99d16434195c6940cf01fc2db135e21f16acae45a509eca3af6b9232a8aa3a86f9715c5f6a85cb1c3 +a3079931c4b90966d1faa948db847741878b5828bc60325f5ebe554dcab4adcc19ee8bce645e48a8f4a9413bb3c6a093 +801f61ac9318f6e033a99071a46ae06ed249394638c19720831fff850226363a4ae8486dd00967746298ee9f1d65462f +b34dbbed4f3bb91f28285c40f64ce60c691737cc2b2d2be5c7d0210611cd58341bb5bda51bb642d3ee2d80882e642a13 +8750af19abfb915e63c81542b13d84526a0c809179bbcc1cd8a52b29f3aba3ae0f7cf6f4f01790bf64ef7db01d8ee887 +a6ea10000eb2dd4efc242ac95bc3b3873cdd882fbeb7c9538c87e3143a263ca3a2e192b2159316a625cfb5fb0b6cdcb3 +aa40ca54bc758a6c64cb932924917581062e088b3ad43976b28f2e11d8a7dea73f1fb50aeaa0e70182bb2dc07d805bb9 +a4779dfd25b5ec9d75dfb54a4bb030364899a5e75c1492403acb19f2adc782c7ac4daeb66d2f5aeb74135afe9f318e3f +b4551e2805d63ca453f4f38b1921ac87ff687e1d70575ad38f3469d6f0608ef76b7b1b98ae1e6b1e7d928773aaab6e3b +99490ee722f96aad2743b08dd37bfeb75a8c59efaee4c9b694eaa05eb8a6bb23861a4480544c7617d04d23fd5e2543b4 +8a7050d964d295fff98ae30d77ce730a055719313457e773fcce94c4d71a9b7cf63db67e54a8aab20fb1335b0130b5d5 +903144e6bbee0a4fec17ff80fef0d2103981140c3d41776cfb184ced17f480a687dd093f6b538584327e6142812e3cd5 +a5b30f7c6939bdc24a84ae784add927fec798b5a5ee3dd156c652df020728dd6d43898be364cf5ee181725fbcffc0964 +b43d97ec2bc66af92d921a5c5c20a03ef2be2bc2c9b345f46d8287409fcbfd88ebc49d4509d64468222cd1d2021bf236 +82dc23c7f5086c9ac6b4566359bfb830d203544b0d8332a210775670f899cd9ff48b94bfeba40040c25664ebdd5cfad8 +9294cd017fea581dabb73dcc8c619904d7e022b664b0a8502c9d30f3807668af279948e7e41030ae296d492225297e95 +8d6c9dc636c8e884f9a4299e5cff06d044ebc94ad783a4b71788347ea4a336d4d048b8a9ecabae789e8fcdc459723dfb +801a80bc49e882ec81b04e37407713f033f7bdac79252dfa3dc8c5bd0229fcbd4019890e402cf843b9378df08f72ab84 +b4313ca32569d973900f6196363c0b280ddfa1b47c88d019e5f399b805b444a777950fc21ae198fc23ece52674b94abf +96f06056fd255fdabf78986e315e7c4fdf5495cf850536b7976baa97a994cc6a99c34609c33a0f2facba5e6f1026dce6 +983ed80220a5545ffd70ef5e6ac10217d82ec9cd8f9a27ee77a5ff4074092308c0e6396fc4e9932a77ddd474e61f8b55 +872a059aa630af73c4abbd076e8b333a973ffc5bdecf5dcc0600b00162184213cb19d4f601795030033beb808d5810ce +b040f318d9d3b8833da854014a44296dbd6762dd17cab13f91987256c54353b7f0800547cb645a7cc231997454209fdd +a8c4731a555308e8ce0b8325eb7a4cbf6113d07e9f41932df04480b72628d313b941c7055f1cc2ac45c7353b56e96ca9 +8c24031440b77637e045a52e5ea3f488926ab0b426148975edf066c40a4581beecc1bfb18fc4cf5f9f96dc6681b4bd28 +b39254b475abf342f301298feaa17a4b3051f30ea23a18acf59e003e2704ac96fe40691f1da387913bdf7aee6389f9a8 +a1dbf938b604ccc6d60881cc71f38df568aa02752aa44d123514154017503f6c1c335ae43e359f1487bc8934073cd9c1 +8d52aa1be9f429ece0580498d8fe9fef46d4a11f49436a82b8927f9503dacc41245907f126594c1cd30701286f8c092c +b826f396486942c0326d16f30a01b00a682c30a75553dc6ac34fd5b3e96b13c33b94738f522eebaffb59ff8c571c76e9 +aa89f51cbf6e6c3e2aa2806187b69ab3361c84e89f393f3ed284fe84db46fc3944aa44f8928e3964f9c1a1ec27048f68 +a254df0efa4203fb92b42a1cd81ca955922e14bf408262c8f7cb7dc703da0ca2c71556bd2d05b22ce9a90ad77309833d +93263c507e4d5f4e5df88e85b3d85c46ea729fb542a718b196333e2d9fb8a2e62dc1347cf146466a54ba12d200ef09d9 +922e3c4a84246d89a07aa3e90f02e04b2cea9bebc0e68b742156f702aed31b28c6dfa7ac936ea2fc2e029adf68361f98 +9a00628eeeda4ccbed3ef7834149aec4c77aac1a14bc2491ba5d1a4a2c5d29afb82ceaa5aac1c5ce1e42cdcaf53e30ba +ab3a88df36d703920f6648a295a70ffa5316c96044f39ff132937bfda768937cb6a479e9ba4a4e66b377f3a9996a88c4 +966b11526ab099d550ab33c6a9667e5cfdedf255da17a80a519d09acd78d2ea24ec18bd1ea7d8d63cf0a408f1c1fe0b3 +b5c21b9817dc32f3df9d9988aa3560e1e840d586d01cd596bc0f850ab416b6013cbf7dbfd05ac981f26014c74bd2d2b2 +9040abef5e2523e7f139c9f744a64b98fea3a57952059ffe4d5ed77fa87068203c090ef4e7f52c88fb82ea8a6fdca33e +a0dcdaeb7d3f5d30d49c004c5f478818c470187f4b0b4856812dcd1b3a86de58a99acb8ceb44c6b80c3060cf967c43a4 +b5f4be9a69e4a6719ea91104820df8623b6d1073e8ee4168de10a7e49c8babea772bcbc6b0908185e98d607e49cd3609 +8634020a5a78650015763c06121c606d2dd7b324aa17387910513dd6480fb797df541fc15b70d269b2794ad190595084 +9504d1d0fb31ff1926c89040c04d51fd1f5cddf9d7ca3d036e7fd17e7a0f767ef33cee1d8bf7e17e2bc40949e7630417 +812c72846ef6d692cf11d8f8c3de8fa78cc287303315114492667b19c702cd24d462020f1276895df26e937c38f361f8 +8c97aa5e9ef2aa9a1435ef9ddfe62e850f0360864ed5fb82bf9fef4ef04d8fb4f827dc078bc911ee275e4501edd6617c +ac5f7af5e23c8e429aaa6b6825129922b59d25b4608f07b65f21388a9ac3aa89096712f320afe6d56e44e1f0d51a4eb9 +a8c84d9a8593a0cb5be1e450960f59878a4e6b70da54a7613dfc25911b7cc9e6d789d39401b0a0d6471ab9dcdc707976 +8c9d5fd89611392c0f085ffa4fa642a181f0b9b23593deb5e10fdd1642722ca75ef34a037e88a8d03f2888fe7461f27c +8c74b05f91fb95c85e7bd41f6d9a1e41e667e68f3d19b325c1f25df1767019919edab89b92af237896cbc4e6d6dc1854 +a3caecb91640821f0b2c4981b23f2069df8d2b98ce026c1538bc096b292f5f956a5d52c1c8d6a8165a1608083ba6494b +8ae8e0c36f8b79a69176ff29855df45d0fcd9e4d1dbaed8899f8fcdece676e418ec034a6c161e2a894f0c834aaecbfd1 +b88d18c67dc3b1b6ed60ee437c441c1ed14ecddebccf43683605716f30058b1aa4ba05ff10cd8171ee97d8f58d70c094 +94f43d84dcdfd9cd19115c7d8e9c1e856828eafbfdec93b876cf0007e317e30b2ad951dbabc186aa6ef90fdee4d91990 +b44e4723f41fc1d5b0057f371e3381ae02566590b3f964b6eb07b2104f66ff78410c407235fa98d04f635694f3baca09 +addd8390173d29ca0811534d389253831fed75fed135398617836b6e70767269eacb1560b39a58f02042ca3b97fe59c4 +80bdbdacc0c358c7ea52aeacdc5f9ceb6928bcf6e7dee7c17d8ae3bf7c2372aa7a0372363888968fc0921aaf4776d5d0 +a486e2b6f04f403f9e609d69dfb3cfb992af56ecad1683271df3e3faa3b86638b81e73b39978fb829ee7133d72901f2d +a19472da57457e10c6a6307895393ddaec8f523760d66937fe26a025817319e234eaf69756ffdf1b84c81733424a96d7 +ad6a195397cbc2d75171f5e82090441eed60bd1ba42c39ef565b8b5a8281b04400678625b1dc46d617f694a7652a8e5d +8f98e721c06cec432e2221f2e1b06bb1469d916a8d88d6973acf68d1e003441d00390dafcead8ecdbf9eae4509baf5aa +91d62a0f9d13c59adfe1376ed6d057eae244d13c6b3d99be49a49e0075cf20f4085cf127774644ac93615be9ac9e5db6 +af45dec199245e2b326a0d79c4899ed44b1c0219db42602a4a6184ace0ff831a3276297af28f92e8b008ba412318e33e +8754bde54e8d2d169e6a7d6f0eae6097bc0461c395192bd00dd6f105677ea56ab384c02553ea5eeac0a65adcb0df77ee +b676afd2f5afc37a314c943d496e31b4885efcbcc2061036e370a74cfde5642bb035622d78d693bfc3136fc036c7edb4 +aab6ffe6cc234397cf1822e02912bc282dfb314e92fb5a9e10d0c34ee9b5856d4b76e166bc2bb6fcdd66aabea35ec4ef +ada6e62f90ee6b852ec4b72b22367acac2896f0df2c105beda27096583ddbedddc710d171330569f111c6e44a5b57ae7 +802139dd15241a6de663d9b810121bdd9cf11f7f8c8ca6de63f4f8e731409e40d1fd3558b4f619ed42ee54929dff1c7e +ad8e70531cec21b4e6f55be1751c2d025bd2d7d8158269b054cfe57fa29252d052ce4478ec7db6ec705789e2118d63b3 +a8e4a4271769480e1b33a28c87a150ecc0b48bfe8a15ae04152197881de4ce4b03453aefe574842424edbbe4173e1a3a +b98c65726296610cef16c5b58da5491acd33bd5c5c5af4d934a9840649ef85730fbce8018dee09ded14e278009ed094a +8e213a7861223287b860f040e5caaa563daa0b681e4e09ec79ad00cc459238e70bbeaf7486bbe182fc12650700034ec5 +a2879f9e1a556cf89b9b5b3bd8646a8cce6b60bcbc8095df44637f66a2da5858eee2dc9091475a8f64bb5aff849389cd +8a17cdb4077b9b0bcf28b93294ac5ae4c8bba8839fce0f1012b53187ac008f9858b02925fbfc421f1123afcdbd8b7753 +86fd9c11528aa43946e4415ff64a3ca6409ee6f807368c68997b18605da65e415ccd85ad913820d450cb386593de666d +8ed55923b963c3d85a91aca11c40ff9c6c7f1e2b9bc199d1a270e5fb16aa62dec0136e97866145ae9d58a493e8b1cbbb +ae32af5b5d418668ae123c639b149e5eed602404e8516da4a61db944b537a3620545e8e3d38cf10cdaea980ab2f80973 +95cb8d9e9d6762d78dde0ad73869ffaca904a7d763a378b8cc11a7933d3e7d1c8aec4271a079b1b00f8887ee5b1ea21f +b5ea20b42a3ca247f00ab5328c05f0cf194973d5f7271c66c41c5055b1ffdca136be179709e0c1de209fbe07b9820bf3 +98682f7cce471c92a8d6d15fee4ddf4d43dd97c3e3811d2913618ecacc6440b737717c07736ae4558c910e11ee98104e +a67da2c7cbba48e929ca4e4b9a6299fe01ef79eff8cc5cd3fdbdc0721a68130e4079f30ae151a573a7dcca8ecf2e684e +a9981c9f9dcbb3b0f6996f664fb2acd7573189f203be37b2b714662aa273551396abfb1f612ccde4e4c8127a050dbe4b +92d55eff8da600f886da9bf68e8eecf482faa4b268f3f286b3b3e5cc91b19604081498d4905b201bb4ec68e32b5591d9 +963e3f1728de9d719c86d390f3eb9c3f99d1928347fab0abf10dbb37d76b59ddb64d4734c977863a6cd03ffece5ca895 +93480e2de83c921056b6d8628ac37cd5ef7555ba43b0308fc13386cb0515d42c12ecd06057137aa71a7931beaf90b9ce +8feae57ff0e6a162cc81c99f45c6187d268fc0bee8c2bffc92142ef76c253d201f0e932943cf2fa312982b281ce1066b +8f8f4bd4200fb87afcd743274480220d77571928000d4197410dbb75439d368df6a06d941a6152206371d2ca9cac99e4 +8ee7f11e79af4478e0a70eb424fe8078237ad99ba6d7e6bf1a8d5e44e40abd22d404bd39b718ad6fdf4c6601f2a47665 +a98acfcec612b574943195b9ba95bebcc9c0b945c9f6b3e8760b2a4635909246a9d73b0b095c27b4ecb3339704e389b7 +b520efd19f65e81dc285031ea3593f8c5dad793e4426beb9196ab46e45346f265fd71e50adb0da657977c60ed5724128 +a3d9d0b7415280ce4dfa2429d47b2b8e37604a5157280a72cc81d541ffe44612dbb3ef7d03693fc42a569169d5842dc3 +8c29e2d0b33801f6d9a9c065a76c5cad1fb0a001506b970307e21765ee97c732a4cbf1d7c1b72d95e0ad340b3b075224 +839e21f292892a6eb596b9b1e9c4bd7c22a6fe71d3d04487c77840028d48392c5cbe73140a4e742338e0c8475cd0c1ad +8bea5c68e7743998619185bb662e958f1b4d3ca81019d84ac43c88911aab3abe4ee9bcc73cb95aa3ae87c0138801bde3 +b8f262d21a94604049e008ce03dc857848168e1efca4522acb0ccc827ffb37f545e1947843a356563a76bc6489605b66 +a7bd0842b0bb38d9943b82aa883f36f4eb8a6e8a7790d4f87faf306608f51d250a19b73984f1156cef5dd2581664614b +a993e649bd953627a88a2539dac3a12ec7f37a4c65b01425d9d34edf7ee10a71aa98f65c9e013107f824faf8aee041a9 +8e07eced75c67cb4d2ec01857f6ac1408482e6b31cb2faa249e8cf99f180575587df530c7782a7539b5221121ef48aa0 +b2f4578f26c05ecb9e2669ca744eb19d4f737321ac7d04fafd18beb7866e0fec9dd063953ae1f077b44b9c6f54db1279 +b6b3788a6c7bcaf467d19daf6ab884d549aa866970c05a9181f544ff190d043192c84fe437a75a30b78b425461cca062 +a270684903c61544b85a7041e81f65e787e1c1e23e57538fa8a69836bed0ca1673861dd29f743a1280f2f38eddd3aa83 +a9c2397c4773dcad2821266dadfd2401d013d9f35de6744f2ec201f3507700adb1e6ec4f5a453be4764da8bf68543f26 +83a3025ed6fd5df9d98be32a74e10a0d9728b560942d33ba028536fb148fc34ae87e92be2df3e420a8dfec08da495982 +90dc70c183a90bab988b4a85b7b921c8070af0e5f220364fe11afa0722990b2c971e1e98eef62d3287fedfd9411f1df7 +82d940937a6c636224d04f8e2536f93dcf20dc97a5f188875ad76c21b804aef9af10839419b61143c1f88a695959a6b4 +8017f9473ce49d498d6f168137e77e62fe553e5a51e75b519cf2cbd1ab9afdafad80fd5e6fd0860e640b0d78ca8ed947 +80573a0ec049fe1f7b3013b2839e145cd87e07c0e43826a29ef8c92516f9a30896c2ffcf3ed77ed22a6cf3101b1789d5 +953349abd2559f9824db07cec857ad54f1a05018f3076425f8dbae37f8d92a46af2c04ab7c8ec0250449541187696e98 +ab7bd2c4f05ee9a9f252c4e16a20993a12c535c3809d124bae24642616521a9768d3f19eceaf8524583f47ae1f527684 +9883b77ee834ee0112ca2f366d2a6fc213e0cf454e061438c2901a5ba35b7378f64da8adf6a476eb1562991ef5b4a5bc +89291811db308637356dbf7ed22cf07bfce33eb977734ee346e8c15a231b35d8b4443574f3fa97a40867b3e23b0bbfa4 +93d753849d7d9588d39e38217500b123a6b628a873876612d9f98b5d611f52c89c573432d2176752b5d1cc2d94899b8b +a45add3c4844db3b7a237295fc85fddc788ac1ec395a0524d2fc90a539571a247146aea4aa10eec30a95e9617c85b98d +90f94578842db7a4de672da1e483858ece5e466c73c12f725a0fc71f42ff880c9447a33fa9096839bee817536f2591e2 +b2c1b6fb031bb30460f157356562b44b4de096a0a112eab4fb3cc500aad38bc770da1fc2e73caf687a0da5e8537049c0 +afb15e15fd930929c0e3c66482068a5afe0c7b7f82e216a76c5eb1113625bfa0b045a52259d472284cfbaf4796c71456 +ad222a9a3d907713418c151b8793d5e37634354322068f8206b9d0da1a3f53b0004193713d23ec35990639a1b6c2e075 +b44a128dce97e8c4b178cdbca0a5c1b3f6e164490fac0fd68dbfe0aafa89920bb4ea420a8527e06c80dd19c2f135e3ef +8596e993ef18b8d94e9c42a90cb7060affc586b8e9b526820d25124285de5590134e2e86592e9dc4dd45ccf5d578fa60 +b71bb0ad138141ed506b2253e84110d2db97cc2d24a3fd0d096b0022d9f38f87aa74e2f505074632d64e90bcc491aa30 +84841eafd357309de47b92ca5ec163dec094a2e5271bc65898c31932e0160bee165e4decb23af339cfe09c83e1cc5441 +8a2915ee39a6fd4a240b98533d7690ef1773ce578ed1fb05ed414ebe36f7ef289fa46f41768df57190438c356331e329 +90bb337165386f1990cbd8ed2e8321ef21bc18125b015b4da0c37e5fcc446b26005379ee4fad8ce9348ceb4ab49e82e2 +b707b50ea2ab05c6d183671587f25fe29eef23fe569d731459a1ac111a0b83a2cd65b88242876b34aeead3b05a15d745 +ae1f159f79b7996315c4f9acce7e21a6ed59d4ef76331196fc86911fda3035edd5c11d568b105175a36c948d0263b382 +922bc525bace05e5dff6b5cabde5469ddd2c1c601f7131abc04ecefdd35095e6ac015b1aec3c3b25c5dee8d139baf60d +a7b060405b2740f82db64683187b1bb89e5f40c8438663c7cbc8ef2513929fe5f92625667a7f2f599a72a96b1fc8f08a +b9dfe94a08651db5efefbb813269bce80d814e3089b80c0654491e438d820bf521f8a4a4477909344ba88f7683eebb43 +841817a9729465743576950b6e8eea32ebf39cca99ace86c4792f9f35926e2d6830c52854a3b2eaeb61694e6845008bd +934128034bde8fc7b93b952aa56e0ed28b36cfa04cfa1f0d5b38266dd40beedff5e0bab86e4717b0fb56c56be2eae26b +aee9d64caf28596308782cd8f3cf819506daf3378f86157ff775e618596411adf94efd0e9542787ca942066f02cbd332 +85871184db314411a49575fee088c52ed5dba4e916ee001ec24d90898a0154d9790a06aa8a707ca7a8b986c0293b8d89 +8d3d87edcc0187a099c97b581a598d357a41ac152303bb27c849eb78e72e15cb97cf9a0468fc36f245c3e152c76bb7dd +900475d165dec18b99eb7b5f9e9ad1d2d4f632e55fdcc4c5ecd7775fed462990e6aaafe9c669f40508f9b15f00bda31f +a25b5954edd57e7811a0d18532043d975c7b44b80f65cd630935d7b16ada05f30fe2b7be7ae8a2f54c25957faf3f1950 +a089019afa3a7a15f7e7874e73b6773c0a824e6d3379b4c928e173321fb165ad979a6be004d394c28d19d410b2655d3e +b28f46797dee0c538bd3de815df641a0ef718ad3e52b2764aec380d6905b38b50ad6f60d0f68e096ca39960ba7734355 +b0ac155d3d05851b04104e6b459f1a68e9e155437c92421a7c0e4dd511ef89cf71dfa3cc920769492ee283a65ebf029e +813c69a810745580d43d5b5480f0ba81000fbef0071e6b655c7346bef5ed774e9214a7816d40eb1774a5bd033767a046 +b176345ca75c64f10ec33daa0dcf1f282b66a862fcd3d8d66c913f9a02db4c9d283dadc02eff13aaab94bc932a42234e +92560f67e5b995db4a489bb86ee78b4aee0800143b3535ad557a53e9e08716bd0202d9f5714722c2a5e8310046e3f5b3 +8adb427bad9cc15fc6c457a96a6750dda8c46d859c5f69bf0e7ab8fc0964430b33967fd47cf0675b6ba1757f91255e6e +b120f723b80389a025b2daa891b140b3d7b8d520ae2a6a313f6e3d365a217af73292dcb249dca1f414ec05e865e3cdc7 +a61a5d261a8dfe5996c42ea0a5ae703a2adcfda80e86837074d868eee16f87d38da19596c48b55dbd7a7cbec1a9b4996 +99dc921eacc6bb867c5825ad4c83bc4af9dd78a18b3d0e1a60ad493e3805b8fb9b7922b577da1adb3d805edfc128d51d +85455fa165a07282aaab4a5bfb88027f47b9532e4af8195c048515f88b0db7e80f42e7a385fd4944faaa7f2a6544ad17 +96dff2d1c8a879d443fe576d46bcceaf5f4551d2e8aad9c1a30883637c91090de99ad5eec228eb5febf93911502d3cbb +a87eb7f439377fb26c6bfe779701f4aea78dd7980b452a386afec62905e75217a1996c5234853432a62ef8bab21c31c3 +b598278293823e9ccb638232a799211173b906444376337fdf044d0227d28fcc4c5867e6ecb3200e59ca0b139e71cac9 +aa6fe147edc95027654d68140f428ec53cede3552c5f49c09d18bc6f6ae8c739a63042eb7291d14d717a4e1f0778abcb +ae8ee18913d328b2fba71efe65526d3ee9c81beda53cf776baec4019ea30212010758cbb5dc85ed6620ce04b189f01f2 +ae9fb686777e88dffdd42805fe4114aa0da1b350d92a27ff3f8a817fb25af1fcfc9a06155affe0273bf13caad16a5351 +95d372ba3a2ee38371538f34aae91b4844488e273f70c02f1992370f89fc2343eff95692d52ce9f21206abbee4959958 +b15260376f0a34ca2827ff53acd7eaaef94c9acc2f244b36500423069cb1cdaa57ac8dd74adb5b53d0fd4265fcbb28ea +b0ffce6a8059537ef6affdbbc300547ef86e00109289239b0c6930456c562b4ed97f2e523963af17736dd71b46c44ac7 +b5499a1277d34f9892f7579731ff53f423f2ffffa9ea43a6e929df8c525e301396249a2324818a6a03daa0e71fcd47b3 +98dbfb8e97a377a25605a7665d4d53e66146204d8953afda661ae506858c5cd77ff7f21f5f10232e06dbc37378638948 +84177e27e6da0e900c51f17077f5991e0e61bff00ca62c1623e627c5aea1b743f86eef6d55b13219a1947515150bade6 +b50407bb5c61b057ab8935df94fd43ca04870015705b4f30ceac85c1035db0eb8293babc3d40e513b6fb6792ecbc27a9 +988699a16917514e37f41ab5c24f4835ed8a2ca85d99972646fcc47c7e2a83c2816011144a8968a119657c4cda78d517 +920c43fdcb738239ad542cb6504ab34498bce892311c781971d7db4dec70e288676de4d8697024b108cfa8757fa74035 +aaa106329aac882e8d46b523f126a86d3cee2d888035ce65c0be4eaae3e92fd862f6ac2da458a835539cccafaba9e626 +96e4c1562d14b7556f3d3e8a1b34ea4addc5a8170e1df541dc344728bcb74cd1630eb7ba4c70e9c68fd23c5c5d5a729b +a616ac5016d4e68e03074273cd3df9693ee0ce3458e8758b117a5c1bc6306dd2c7fad96b1bb37219c57ac62c78ad7a3e +8db7d9b20abfb1445babd484ae9e38ff9153ac8492230d7591e14e3fca7388a5ca6ef7d92ed445c8943cf5263e4a6ad7 +88464134221aa7134878eb10928f31c8bd752ab68c27c9061c1de3f145c85731a4b76acdc7e939b399b6e497f9e6c136 +a5f7c794f70b7c191c835dded21d442b6514bab5e4d19b56f630b6a2f1a84a1d69102d7a0dcca256aab5882d3f30f3ca +b96b6f98b6817b5fa6b1b1044e2411bdf08bf3ffaa9f38915d59e1d2b9bed8b3d645eee322ee611102ce308be19dbc15 +92c26ade2e57257f498ac4ff0672d60b7ea26dad3eb39ed9a265162ccd205c36b882dba3689758c675f29e20836b62d9 +8379a0299e75774930577071d258e89e471951642b98e5e664c148af584d80df4caa4bd370174dae258848c306f44be5 +a0e53beda02bd82bf3d24bd1b65b656238128e734b6c7a65e3e45d3658d934f909c86ca4c3f2d19e0ac3c7aae58b342e +8ca5ceaeaf139188afd48f9bf034d8baf77bbf9669791c7e56ebf783394d7fcdf2a25fa4bdfcddfde649aa0dc67ccccd +a8060e6448844e9db4e9fb4da1c04bcf88fda4542def5d223f62c161490cf1408a85b7c484341929c0f9ce2a1d63e84b +af6e1a5ecf50b754bb9eb2723096c9e9a8e82c29e9dcaa8856ab70074430534c5395534e1c0ed9ce98f4b84d4082fa67 +81c8dbbef98f1b561e531683d5ae0f9b27b7f45dc6b2f6d61119ca0d559bf4ceb676d320afc5aba1811eeef7547a59d8 +85b46cd64d605c7090a2faf1a2aadf22403b3692b3de1d83e38b2de0108d90ac56be35b0dca92c7a41c4b179a3567268 +8dd3cc3062ddbe17fd962c2452c2968c73739608f007ad81fa1788931c0e0dda65032f344a12249d743852eb1a6d52a9 +8630f1707aea9c90937b915f1f3d9d7ba6bda6d7fdef7a40877a40c1ee52471fd888f84c2b2c30b125451b2834f90d3b +b4a747e0bd4e1e0357861184dacec6714b2b7e4ee52fa227724369334cf54861d2f61724a4666dae249aa967d8e3972f +a72de682e6f9490b808d58f34a0d67f25db393c6941f9342a375de9ca560e4c5825c83797d7df6ed812b71a25e582fff +8d5ea7d5c01f1f41fffe282a334262cc4c31b5dcf31f42cc31d6c8e37c9bd2f1620a45519dab71e108fe21211c275b6c +8ccdc7e3642c2894acbf9367f3e99c85963cea46dc5473d175339a2391be57dd8815feacadec766e13645971213b9eb8 +858e9b5fc8c13b651ff8eb92324bdda281db4cf39f7e7bd0472908b3e50b761fa06687f3d46f4047643029dc3e0ceeaa +ae20d36c70cd754128c07cbc18dcb8d58b17d7e83416e84964b71ccff9701f63d93b2b44ec3fddc13bbe42ebdd66221e +860dbf7013da7709e24b491de198cb2fa2ffd49a392a7714ad2ab69a656ca23f6eafa90d6fdc2aa04a70f2c056af2703 +8f809e5119429840cb464ed0a1428762ba5e177a16c92581679d7a63f59e510fdc651c6cc84d11e3f663834fcafeafdd +8d8a8dce82c3c8ea7d1cb771865c618d1e3da2348e5d216c4cbbd0ac541107e19b8f8c826220ca631d6f0a329215a8d6 +86e3115c895ae965b819e9161511540445e887815502562930cedc040b162ecb1e8bdc1b6705f74d52bf3e927bc6b057 +b9833b81a14115865ca48c9c6a3855f985228e04cbc285f59bf163dca5e966d69579ea4dba530b1e53f20bd4dccdc919 +a71f5801838a6dbb162aa6f0be7beea56fadac1a4bcd8113a0a74ab14fc470a03775908c76822d64eb52a79b35530c05 +a77ab73ae94b6d3378884f57eee400eff4a2969aa26e76281f577a61257347de704794761ea1465dd22a6cc6304fbc4a +acd1c5df3c487c04cf27f002e81f2348a0119349b3691012526a7b0d3bf911cdd3accbc9883112ed2ba852145e57fe68 +8a28515a48832ac9eaf8a3fb3ad0829c46c944b4cb28acbcdbca1d0d4c3c623a36cda53a29291b8f2e0ea8ee056b1dee +846bafca11a7f45b674237359b2966b7bf5161916a18cf69f3ec42c855792d967d3bf3f3799b72d008766206bb7a1aa3 +b24b341675b1db9a72c3405bbe4a95ccdfd18fa96f876ec946ccb5108f73e8816019998218a036b005ef9a458e75aeb3 +b99c267b4a09193f3448bc8c323e91ef5b97e23aeff227033fe5f00e19bab5583f6e5fcb472ec84f12b13a54d5c0e286 +a088aa478dbe45973b04ecafbcbd7ee85c9a77f594046545cdb83697a0c2b01b22b1af0b97dd75d387bb889e17f17aa7 +a0c6b0cdff2d69964134a014e36c3709d9e63f6463c5cd7b01b6f0be673731b202d577539d89dd57a888326da1df95af +b4e6dc4ef11b2b41794ece70a8968e56705199d183366759568b6fa845d2cae127486e926b5b27ae9118bb21d1682c1d +a007804353f174098f02540a57e96227232444d5ae0a24232c244647148b6c049848cbd2b50d0a25af3ca9164bfff8ee +873fb034cc39c9cee553ece908fbf315f62efbc412b9afdde6a1889326b7f6f813e050b0601ba9921688e958cb75942e +b5676c90f0106c40d8683299e59d564f505ec990230cb076caef3ae33f2021e6aa5c9b27bb8fead05fc076df034c28f5 +b5a67fc4c5539ad1ddf946a063110f824f7f08d2e4d30762c9d437748c96c9147a88efc22260573803ab545c18b108f2 +817ff2b748a949973a91b69b0ec38efbd945aeb26a176d19f0fb76e261c7526c759e6f5516f9ed34de6eb1ac7838c9cb +99b76bda3526a5d841e059010fdb14eb2fa035a7d10463373a062a98c3c1a123e2da0848421dd7546d776438fd05e304 +aa0d363270f90d56bbee7ea577b0c358532bda36d9247af6c57d000044a97ba41e35bb0db438f4c94551c6350e4e0674 +acdae205d05f54b9544be96c9032350511895ccf413dbbc56d1f03053185df22a6d5b7ffcc3fbe96c3e2ce898ccfa73e +b091c220a1de18d384f50dd071dca4648ca4e708162c52a60e2cedc0188e77c54639f75bce9a468a64b2549119c07ded +878676133e5c700b1d4844564fa92a9930badb5293d882aa25ee6721a9f2cfab02088c31d62cf1342ae3edaea99a1ea0 +9756d0793e6aba3b4dff48100bb49a5ec08ec733f966cb438379b91caf52fc2a5930830ec3f49aa15a02c82c1914dc7a +9722f760184d3b2d67cb2cea7fa41b1ff920a63446006bd98c6347c03d224d2d8328fa20ccd057690093d284b9a80360 +b5a68489de4f253715a67f0879437bfe8f4dfc4e655ca344848980e6153b1d728acde028bb66fd626fa72eedd46ff683 +a8cfc900b34835d9fd3add08044636f69614eff9ae929eac616c39bd760fd275ee89bf24b0f275dd77a66e54fd6b94e5 +89967479bebf70b2893cad993bf7236a9efe4042d4408022fdbb47788fabedcec27d3bba99db778fcde41e43887e45af +889235938fcec60275c2cf0f19d73a44d03877d817b60bb26f4cbce09db0afae86d42d6847b21f07b650af9b9381fa82 +b7fc321fa94557d8fbdd9fff55ab5c8788764614c1300d5ef1024290b2dbb9216bce15cb125da541f47b411a2e7e3c2d +b11b0c4dc9477176b3cda6b17858dbd8c35a933ed31364801093f310af082cb5a61700f36851e94835c5d4625bf89e32 +9874e54d2939ee0600f4194f183877c30da26d7515e9e268fea8d24a675dd2945d1565d9016b62b1baab875ac892f4d2 +90df3a77280d6f1fa25a986309bba9d5b89c3cf13656c933069bc78e6c314058716b62eacfa7ab4aff43518b8b815698 +962b08299a287d77f28d3609f39fd31bc0069f7d478de17539e61fcc517045050644b0307c917208b300ce5d32affcca +b30eedca41afb6f083442aaa00f2e4d5dc0fda58e66aaf0f44e93d4af5c4bf8ea22afec888cacbf3fae26d88e8d344cc +847747a22fab3fe3c8cd67f3f1d54440f0b34ce7b513225dc8eb4fa789d7d9f3577631c0890a3d251e782a78418fecfa +8d1ef3cb5836e4039b34ee4e1b4820128eb1e8540e350309e4b8fea80f3ae803d1f25f4b9c115482b324adf7c8178bc7 +8f8a2b0b0f24f09920b58c76f7d99ec2eb2e780b5a66f2f30a9ed267dcaea0ec63b472282076c7bf8548211376c72f6e +831ee6dc8889bbf4d345eaeb2f425959c112d2190764abbbe33bc44e1d9698af87ff5a54d01fac00cfee5878dee7c0f6 +a7eb2479ac80d0ee23f2648fd46c5e819ad3a1f4752b613607ae712961b300e37f98704880ac0a75f700f87d67853c7a +aa4d1b9cec62db549833000d51e83b930db21af1d37c250fdc15d97bc98de7a5af60dbf7268c8ec9c194d5d5ccda3c1d +87396fd7e78c4bcf270369c23bc533b7fb363ca50d67262937dab40c7f15bd8448a8ba42e93cf35fb8b22af76740d5e1 +a958b2a9ffccbca13c0c408f41afcfc14d3c7a4d30ea496ce786927399baaf3514ff70970ef4b2a72740105b8a304509 +a5963a9dd3fe5507e3453b3b8ed4b593a4d2ced75293aee21bfed7280283348d9e08bf8244c1fce459aa2470211d41ea +8b06ddc3359827558b2bb57caf78b3e5a319504f8047735fcc8ec0becf099c0104a60d4d86773e7b841eb5b6b3c0cc03 +9437e7278283f6d4d1a53d976c3c2c85c5fe9b5aec7e29d54a5423e425b4be15400ed314f72e22e7c44ee4bacf0e681c +b56067ee26a485ed532c16ec622bb09135a36c29b0451949aa36fee0b0954d4bf012e30d7e3fc56e9f153616b19349bc +a5c72f7f5d9f5b35e789830a064a59c10175093a0ce17654da7048827d0b9709b443a947346b0e5d96b5ea89b8d7c575 +a8318d01182d4c9af2847a29a6b947feef5795fc12e487a30001cc1ec482b48450c77af4837edfa1aedf69f0642c7e5e +82ea421c091552d3dafa7da161420cb5601b819e861dd2ba1a788c3d1b5e8fa75cc3f2b0db125dde8742eb45b335efa2 +8679fd1c7771ea3b12006d4a972f4f2892e61f108107d4586f58ee7f2533d95d89b9695d369cdace665f19c6bc3bc85e +b5ab3e8adee4c950fce4d33a0e2f85d3d886e60a6e2f4454b57bc68725f0cf246372d863167482cce1ea10a7c67c3af2 +a85696927075ec188979180326c689016a0dc7a2f14ae02ea27c39ef91418cd44177d3fca5752cf6b298fd75fa012e26 +a44f87b7232f102cd092f86c952a88afb635484a984da90a41a57a3d883c9469064bf105b9026024090486b6c6baa939 +866ac91a437db945bbfdc11fcee583f3669fa0a78a7cecf50fbfa6ed1026d63ad6125deba8291452bf0c04f2a50e5981 +b780d5a1e278fd4eef6139982e093ceafea16cb71d930768dea07c9689369ff589d0c7f47d5821d75fe93b28c5f41575 +b025d0046e643506e66642c2c6a5397a8117bbfe086cee4175ff8b7120e4f1e6794e1e3f6ec11390993cca26d207ae43 +a04a22b6e28c959ab265c7f48cde42bb6a00832c6beb2595b5df2879080a9424890960417d7d7ceb013d697d0ebf7267 +81de9c656ac27f54d60d0252e33aff4e9e9e9c3363a50740baf15a2b9061f730a51ae1704e8c4a626153cf66d47f19b1 +a15fab90599df889df11fa60c752948b68fba54005491180dafb66c5775547976d0eef33945e55d4818653e0818c6f92 +b06f9be44ddb103a72fa4ebc242c8ee1975fe9bf9ef7124afeda9967ff3db644dbf31440151b824869406851a90984a2 +99abdfe6806ae5efa2d11577da17bd874d847c5f810460148bc045bcf38c4fd564917eacb6ed61bb9164ed58055cd684 +ac53231077f83f0ae5f25e52b70bb6105d561c0ba178040c11c3df8450c508ed5df34f067fdaacf716f90b4926f36df5 +99e3f509af44fc8d4ebc693d3682db45fd282971659f142c1b9c61592573a008fc00502c6af296c59c2e3e43ed31ec7a +98f2f5819670aff9a344e1c401f9faf5db83f5c0953d3244cfa760762560e1c3a3c7692bb7107ea6eaf5247ac6fd7cc8 +b5b9f90391cec935db8d2b142571650fcbb6f6eb65b89c9329e84b10bfa1c656026674d70280ade4ba87eeaf9333714d +b0696b77ca8a0cdbe86cad12f358880926906fb50e14f55b1afc1e08478ae6376215cbb79bc9035de2808c7cd2b13b85 +a51d746833062a65fd458a48a390631d5d59e98e2230b80d8f852cfc57d77f05eefcfd3c395ade1e86d4a39c2141365c +812d67654319f4ef3c9e4a2d4f027a4cb7768f1ea3f5fdde8d1b79187a4b874ff9a5c70f15b7efa079c2dc69d1b9b1fe +968978b653c6416bf810f6c2ffa3d1abbefbd06f66b6686e9a4fdce3f869e0ab1e43cce14dc83786596761c100ae17e1 +98e1e6ab562ca7743783b802faeb0a24f1341abfb9655f106920aef08964a3c0e8083e1acda7ae28fed7cdd5478decb6 +a91c0b982a0a7085a103600edf99e9d0bee4c4e7db6d9f8f376c215c7d42476218462a3765f2928e12c3dd49d688e4fd +8a43395b3124fab9e2438635bf88952e8e3084dad7ecb3a9927f9af0e0887bce4707084043671fc98ad03621e40a149e +b0b37626143d4a8c6f5693d5f1fe871525b4dd946c4239cde032b91f60a4d7a930d7ba28959737550d71c4a870a3a3be +b01c74acae1715c19df08d5f4a10e0c19d1356264eb17938d97127bf57e09ced05ba30d0fc1a9f32d6cff8b0d5f91c9a +b4c2328eb8a5a673406faed8f0aebb8540d2791646e37ce46e0e382506570ca276eb6f8e166dbbf9e0a84064873473b9 +85cb9f769a185e3538e4a4beda9a008694e1bf8dfeea9dc07c5c40a9ceb1d31fcb13cacfaa52849ba1894b5027cb8c30 +8742f91cddc9a115ddc73982f980f750d82d3760f2d46ee4490d5b17c6c3bb57c7d4c7b8d6311b7b41e59464c009b6a5 +948ef86d17128a061e1bdd3ea7fcc7348e3ec87ec35dc20a58dd757d5d18037fe5e052bb359e27ab4c2320d9a52a6a0b +a70f6a214097c271e0d2d95e30fce72d38c30a2f186271fdff0e38e005aff5baed53739b8c4f9501aa7f529c5cb2da59 +892a7574cf6704ad75b346c95ae6f2668904f1218c35b89b07a0c2dbf3c62173c348f6fd9473926eef56a37c0f635c04 +837e85a41f39b4ded1420aa8fc3be46a7adb99305e0928c6d7643b7c44434b72984cea08eb68f5f803661df0db78c87d +94e495329f2aab3eeb68f347961d1006e69d990095877a4dcc376546233adf29a14bf6b16a0c39aa477e15368e87014c +851860a8fdf76a97048396553262637dade27f1f63f926997e74c7c72b14b10293eae7824e8dedffad1aead57c124f79 +90481017a250972055ab1cf45ff17d2469517f10f18c9d4ef79a9bdc97a49093289bbacfefa8a1e491bbb75388b34ac0 +983db15f7463df28091c691608ca9c51095530fa6b1b7b5b099c612e673d29e16787cc9ae1c64370ba6560582ce623c0 +a477dab41014c778a1b78a7ce5936b7b842124509424e3bfc02cc58878c841c45f9e04ccc58b4f2ff8231488fff0b627 +868ebba1c85d1f2a3bf34c0ab18721ea725378b24f6b6785637ee4019e65d4850e051c8408fe94a995cc918c7b193089 +93cbf4238a37ccd4c8654f01a96af809a7d5b81b9e1eab04be2f861d9d2470996fb67367e5bf9dcd602dc11a3e4cf185 +83113f4e696030cca9fdc2efc96ba179cf26887c677f76cde13820940ad6891cb106bb5b436d6b0f8867f2fd03933f7d +90c709f4e3359a6d215d03f45ad5cf8067aedd4aab03512dd62229696485a41dcd64e2acce327fda390e0352152fce13 +9945cfced107a36f3cf028ba04c653360afc5013858b9a12fac48802efcbc198c9baf3a7f9b23dfdd5036e88bc7274c8 +832ae60192b47fc735a8ddeaf68314b16256c90ab68099f58e43073e249c6939895c544a02fa34e40805bc6b5db33461 +8b12c335818b643c1d22cbc2869606cf64e7ae54a7713617fc4dd3b2f052ebd6b920ca59ba2e9c7aa8cf71bb4f40f9e8 +a2033eb7a373931c65d66989644aa0892ac3778b9a811b2f413d8bf534e282c339717979f9aa742162abb3468c195f87 +aba2b4c37dea36bed6d39323e5f628ab607699c66767f9bf24ef5df1bfcad00c2664123c0d8d5bd782f1e14a06f4c769 +b71963777535b4d407286d08f6f55da8f50418486392a0018ee10f9ae007a377b8b8336f33386b0eb01c45695c3ed2da +88dc87826941340913b564a4f9b74985a311371c8e7b47881235d81c081f1682bef313c2f86561a038757fb7d6a1a8dc +869e13e3fcf91396750150f9dc9307460494c1d365f57893fd06fb8acf87ac7dddc24e4320d9cad0414119013ea739b8 +92194e292303d32b91ae9cecb8d6367c8799c2d928b2e2846dab1b901371a4e522fc4089aad8f4ee676f0614ff8b19d7 +aa589a3e512cb4f8589bc61e826a06d9f9cb9fdfd57cf5c8a5a63841435b0548e30a424ca3d9ef52bf82cc83c6cb1134 +81802e0194bc351b9a5e7a0a47911d3a0a331b280cf1936c6cf86b839d3a4ab64e800a3fe80ea6c72c3751356005a38b +88e5e9e3c802314ddd21cb86f2014948b7618502a70321c1caf72401654e361aac6990a674239afa1f46698545614c93 +abac1e0f85d5c3ff6d54ed94930c81716d0ac92be49e3d393bed858833f4796c2b80bf7c943e7110de7b2d148463bfbf +b7eb416004febd574aef281745464f93ef835fd65b77d460b6ad5d5a85a24b536b4dec800cfe80ae98489e54447e8bb6 +b3fd8ed1c30e7c15b0bc0baf0d9d1ecad266bafb281cd4e37c55edc76c202fb1e4ea315a91a2848f40f481793ae35058 +86ef674ddf4b7d303c68bbfb53db00b925ccbf11d7d775ca09e458f4ecd868ca828103e8e7cd9d99672a193e81b83923 +95ef414e9f7e93f0aaaeb63cd84eb37fc059eb8b6eced2f01b24835b043b1afb3458069c45218da790c44de7246860c9 +93ec8f84c20b7752bfc84bb88c11d5f76456136377272b9ac95d46c34fce6dcfc54c0e4f45186dd8df6e2f924f7726ab +95df5f3f677c03a238a76582d7cb22ed998b9f89aecf701475467616335c18e435283764fb733fb7099810fec35932ae +8cda640695c6bc1497d19b9edc5ff4ea94c1c135d86f573d744358758f6066c1458901f9367190dcd24432ae41684cf0 +b19aedf5569435ff62019d71baa5e0a970c6d95fe4758081604f16b8e6120e6b557209cdea0ccd2efec6ff9e902d6ce6 +b3041f21f07d52e6bd723068df610aa894dfdde88094897593e50c5694c23025e412ef87a9d16cadd1adbb1c6e89ced4 +a7f8d6ab0a7beb4f8d1cfef6960ebdaa364239eca949b535607dee5caeff8e5dfc2a9cfb880cc4466780c696cff2c3a6 +99a565b4796e2b990bfcb234772d93c5ffdbe10453b5aa94662272009a606ba6ea30cc0c3c26aa22982c1e90738418a5 +90c54b55ff19157c1e679d8d4f7f0687a70a27d88f123179a973c62565adfcc9347cfe31f54539038cf2f34556c86870 +8612f34bcd018d742202d77d7ce26cf9bc4e0d78e50ddf75250b9944583b2c6648f992b635ea13fdaae119764e7c28d5 +a04fb38e5529bf9c76ec2b5e3a1ef3c6f9effb6246c7f67301cfed707356ba1bf774f2867c77a5805933f0c8ad0ec644 +b4800e7b503da0164885d253135c3b989690794d145182572181995e6fa1989f3d0324993e871bbd5f48fadd869d8a18 +9981cd4f28ae7b7dadf454fb3aec29746dc2e0ca3bd371b2a57cd2135a7d93559e02132528ccd2d305b639d7ac51613d +a3ceec012dd1fbad3ef9f9f1d6fe7618e13d4d59e3f50540d2a57010d651092979c75442ec8b38a1ab678505e30b710d +8b97b8654d067fb4319a6e4ee439fb8de0f22fd9db5569ba0935a02235cb4edd40a4740836c303ec2394c59a0b96308b +b3d1bf4410fec669a269622c3ce63282c9ac864620d7b46c9dfcec52d8e79b90c4c90a69c32763136a7f2d148493524e +93174eba1e03f879e44921084aa0ee3562e48c2be49085de96ed7621c768ff52324d14c8cc81f17d7ed50c38ffb2c964 +aa2194cd0fb7aec3dac9a1bd8ea08be785926ed6812538be6d3c54218ea4b563646af1f5c5f95cb914f37edfae55137d +93f2c0dd59364f6061d3da189e04d6c64389a3563b062e8f969a982cd68cc55b4f38b21546c8a67c8df466ff4f61f9c5 +aa7dd497cc949c10209c7010ba4ce8a1efd3cd806a849971e3e01716ea06a62e9d5e122ad1d2b8e5a535fae0a01a7761 +ad402424b2a32bca775a66aa087580d7a81f0867f293f1c35580b9e87ccc5a2bab00c29a50fd0d7bd711085ae2248965 +96237843d8e29ac77fc6ebf4acc12946ad11697de8e5f152fe5776f2475b790226a7d156ac48968dd68b89512dc55943 +a45c25cdbb9fc327cc49a1666988af9ab4c5f79cea751437d576793a01c3eeea4c962c05c0947852fe0e4c63e1c84771 +93dcf834a614a6f5484cc4ba059e733ab5dcc54253229df65ff5ad57b447353ebbc930736a4c96322e264e65736948dc +b9a94f82a82c0c5a26f2c1d5381afec3645e8ee04c947dc3b7ad59a73018db1e9965ab3642f2bbf60f32c430b074fb22 +94eab29b3524ccbe0c4b928e5fa5dd8f684074b332fcf301c634d11083653ffee4f7e92ddbcb87ed038024954ad1747b +b8dca5f679931d6abef0674bad0639aefad64c2b80572d646aaab17adf5ca1ab2ebeecd5a526cadc230bec92ed933fc2 +944d394958e539251b475c4304f103a09f62448b7d8a8eaef2f58e7de4f6e2e657d58d5b38e8513474115f323f6ec601 +8a5ae1f13d433962d05df79d049b28e63fe72688fc3e6660aa28e0876a860c3dbc5fc889d79f5c4dec4b3a34cdf89277 +afa5278724998eced338bb5932ecf1043d2be5dd93f4d231d05d2ea05b4455f2ffdc0eadcb335dcace96dd8b2b4926fb +b91153a2f4647ae82fc4ee7396d2ca23270ec7f8884ce9eead7e9376270678edd42dd3d4d6c003dfc2dde9fd88cc6e7c +adc932f1c679bf7889cb1ff4a2d2897d7973483fa283979a0ea3640c80ed106ea0934c1961dd42d74b22504be49851f2 +a82e90761fae684d1415cee0649bb031bcb325ae0b28f128ab8e3650bccedd302a70de1a341ca8decfdda76f3349cad0 +8ae353188b4b98835f4ef0333cccb9e29e1ac3ec11d554bc96f5880c101cb3c84b8eefe72f2287b0812735339fe66cfa +b8b41135bb1a1ffb64afbd83e2189e755f2c350e1273cf47c38ae9b8c4800d831436a69458b8ef9fa8b95a148d8ec9fd +96f75a04d8752fa93dc1eaf85ad333cff4eeec902a345576139e16de3a88eeb71b6726224349bb9844065cc454d959e9 +ab82b05e3923ad4c26f5727c60dc0d23063c03f5a4fd8077da66aa87042cad1bd99586d4ab35aa5e4ce6f4da6fecf3c1 +a50c83db91c26ef7bf1720d8815b41bd056b49fd99710943679a162ccf46097a7a24585750ece886e38eb4fdb866fa37 +a719f667914a84f62350dcc6f4f30b9ab428eac6837b70318c3ac491c1e69d48af5e1656c021818f377d911fe947c113 +a148807aafddfa0a5624c7cb9e42468219e4bdb9994ec36bc19b6e6d7c4a54d3a0763d13ca80624af48bbd96d73afca5 +aa012f205daf22a03e9fb13a63783dda7666f788a237232598d02a4d4becec7a699ab493f78d722ce68519262924c708 +97fc15fab5952c5a2d698fd6f7ad48aff1c8aa589f7d3b14285fea5e858c471cf72f09a892e814104fa2b27eb9771e73 +8da8840236812667c4c51c8fc8ab96d20dae8e2025290b9cde0147570a03384370b0fcbe20339c6aff09cca5d63e726f +b477d85359a8e423fed73409f61417a806cb89c9a401967622aba32bf85b569e82bca1b3394c79e180114a0d60b97316 +b3d6ee2ed1e4c5cf8ba2c3a4f329832e41c7fdcbcda8a3fcbe8f60967fdb1717665610b7c1ac65582534d269d762aa09 +a0b3b30b1b830b8331ee19f96b4a4321a6b93a3395b95d3a895682c65ec6ea64774b878b93514eaf353f2e4be28617b8 +a2b88e9617f4d30ef4e686d1932ad43cd555fadcb5102e51bea19e6fca649284ccf4debb37b5cb2090ef386fa5bf5327 +8a4446f7e8463ea977a68d6217a9046ad4356d6fc1c18d46c5d2ab681ea977b8faff136d65abea6bbf8936369cb33117 +91e7464bc56e03f436228104939ddd50caace5a38f68817bb2991e193b57adf6835152bbf3dbcdebf0382ac9823f60c9 +961a441e6cdf8106c4f45e5b47190d35644faec701c9cfc41ced40cfdd1fa83752fd56c1ac49131a47f1970a8f825904 +94b7b165cc71c2ae82976b8f03c035fb70e90028992b853aa902c0467b384c7bcf01d56166bec5def4453e4d0c907e52 +a5d32cffabbf547f900026b34ef46f08075b7a244565f615370d2f04edf50b094c95088a4a139ce07caf55bcd99afa07 +b4e06e73660745f75ab2f34d9f6d2675b58f80f911ab6dd4c5a6ce1095f9a2b50d86f6ff9a05394190bdf96af0827920 +ad3fd8f83c0103b29d41319209dffca201d2b98094362da08da3fd6ff0ba96796b49d6bed525c9adb96c2954858e7f48 +b0c27430695f0fd20ae31e1ec621da090094f2203e17411db9384695ffcf5c7c6badf461ba49ba70164aacebd6f278ee +b9bc6e972fc3b532fd2b1eeafc4bceb77604885f32132af6a9a842fa2440df452f49ec0cd9d86da1180e8deb0723b260 +9729e22d6104b0174c136a854920f542b384d375040adcebe36acc253bdb55845eb43e34dc5a7cc27d22c417973c24d0 +a8b420b36d48786c9231d454468a6e855dd7f71dcfd095efc9855ee70dbece0f06ad277f7829c5813fc30524c3e40308 +8757dff5499668c93fc5d9cea0a8db61817b8ed407200d623030b5849a913d12f8371b667cfde8d8082026eda7407e8c +b859ad747ca5af661fbd03a1a282df6e84c224ecea645bc2d4ba5e35fa06cbf047387319fca0cbc76b712398c0798968 +8e3173c27875f1460297af0fa736c945dc842ec3e476a973d3d5f790bf183ad3ffe96ac13868c5101d8e299890791864 +a9d725e2b92c878be42b5eecc2c3081c63c7231ccc7e2dee17ca6a4caaeae22788fab1f1465fcbd7fc236613fc2bae4c +86f6c4f04a354cb2470ef91914816fd740f8d5795ce7ff981f55a2634695fde5951bbae7a4bbc4c63747040f8644170a +851773cb26f320f0c3f252d95ea7e058ffcc795dd0dc35e459aa1b6b448238909230d809e82022e64b7fca5d40b8324c +8962641e0306220d9892fe2d452caa286301a3c465185757be7bce2d9b2c9beb3040280099606cc86773e43941fd3439 +8beb6e08c440b0de5fb85251d39d9e72db4e556a2dfe3dae59efd8b359d08492064cebd8d8993254b43bde8bd67d969a +a7e047894466ffe3dec4ab8d5462f2b1d8ac0df006b1d2dd26caf499ea857d93a811cf42233f9e948c9cb903beec004c +92eedd95557a91691a5e2835170390ce2401e223da43b78615a804c49566f9d31cbb7f10c8a8390c4bdcf691544fdba9 +a5e5b5d8fa65824e958bbae98d146b4b332f97ed50e0bc2c58851dc2c174ab71bcbb1ae015cd2955c26b368487dd862f +853a494eafb308175629d581ed04bed71bbc3af9ca4c0dc483d03d27c993a2bbd88cea47c2085a6928d166fe6938fb77 +83f06b88d29afbfbe8f61811690322ac4fdd6abb9a23612162e7a2dd6bcbb5f14cee298ebebc1a382484f7346dc51e60 +8c9cf05735ea5a0e563490bdc7ed29a4426643711c651e35c8551ca6f855c8458ae8f0933a022d0bb9a952edfed411f6 +b906b48d807748a26cc2a8848455a76ce502261afe31f61777b71917bdf7de2fece419db636439478c7582058f626c29 +97efe1fa7c9b25d8bea79d74b6cdcf88f63f1e865f54b58512a2e60428630b0b40b8b6af1b5f71df47520507548c3cad +8ef5ca6e753818906bb3fc71405928d8e4108854ef0ef01c1009071b353bc2852e771fcb619d5fea45590e8f61003d7f +8e4d901661e2913740d70ba4d0745df5e8c9c0a260149d9362beadc7e669630ba909ff0e8a6cc85c54d6b7435d0d351e +b7c6ba3bebbd9592967954e3a480ee8df1d9f5965f04e7d78a5415b645128deae7ddaf6ed507c8877bfca91ce078e529 +840bedb0ad4e25acf6cd25dee4f98fea495b2312dc5cb7a8388c5ab00b2acb9cd25da08e9fbead145a3107972b1ccd5d +a8d4578dbafdb27f3911af59962d89e75dea74db55346720357790da677312c203107d9c7911535aa563446fde7d4c47 +86d3b77f231bfa09251b7fd2ce09c27ac520ec35d783e912476f9a4863f83d269eb175790d6e735da9260293d707f8ee +b34909f1cc033232652da0c34051a769dc76adb1aee00674a59dc1b860f6e610974c3b4bb69a69ccc73e01f042431242 +90799854d0cf34e1d91ff8e101bc7c5007423d34d2f3bd9adea2ecac57e83f3a65a506bb93d4caea49b29f6d18149957 +8ef94cde29b037e19a1ce7bf4418ad3c95cd9457412796ea385750c19a6690f13a3bb5bb6a9ee81e7a40face1e0a8bca +97053d21ae8d75972fb37f6fe516c38c32ab162fb56b9f510f954858f4e3ef6ac8c3a9557ed3f41b7b6aef05fe97f931 +90a9f9f0f40991f3bddc58b92d40382147db22cce50d092d4a05aad251b46b94e71ec9f7107a180243288059fcc5ce29 +a14265b1344ac2921b0f890d13bcfc432e4f648ce403e261fce4d3bb32ffee9e2794c02830346054f998e82784c77040 +91928402ae121e56a3e64cd6f390127e6e92fbfb1967ec6efa4f52f3e8058f1f41a0f4fe96b5bcc11641c1139e790b2b +921c8c92b6d40da6c5a7b592acc74fc0f577d93767b9aa4a1cd302a72dbf503a1ea5b2c29fa0d0359bff3b8f252246d1 +93ae0ebe0e8e133fd80cf67a499047e30ec4c4660ccec9d49098717ef57721a030f423e00c5e74af4ff4acf014a10497 +82c865e21905aebfe0496af1c6ac7e342b5f446a9edb4f7da0f2fb0340abfd8e6fc545da874459d9aabe6bce0dd9bfcb +aee3961d8d2687c0f134b9c28b920bdc4021d925fbe14323c84224a9fe161248789249fb85436a5891d0bbff42c2a3e9 +91aee420b98b6949482b8ff4be996b97245b4e8f583a6e085226539074f42aa89818395efd1a6699735a569bfe19d623 +a48eec22c192e495b01722d0016a54acc45ff837e2a95c4294ce81d5a4e43e0053a6f0ead8a4fb3ddd35faf6607275b0 +a26e15937c11faa30ffa64817f035e294cab0e839f73d29de8a244ad039be4e221eb47ea08d9a4658b0152fc3caf6110 +b84450f948aa7c8682fccb9cae84d8e3558adf2d0ca5fb81eb200415291158720f8f3470542ab5b88c6873ad08e7fa9a +a8e8ec27d0608d020169a85d6ecdb40eb402f006a3b97afe32cc01987721b3a68a92ec693aeb4d357e189e05fadf699e +ac87cd535ef5699312cc26f86adb71baa0be42e858bd5a2d94ac05737dac63430691e29b9a30d2559ad581a172519b2c +a4481e67b524f8cddf2046625efd3d75efee6aab87ddd2c1b22835647e918157e5e924ac760db2195c86d326f3db1615 +891f29ded231486ee826840c8895cb325f7e84a5a6d2eac246cb3573612cde274720233b1978318a57ed337a046330a6 +906b6e750e6178289012769807d2598925d7e51c260c14497d8af978b1695990e3352e6e809a752f376597a68083870c +b7a056898ee1e46f7f29702fb39232f678ec173eccd170303b3b0a30c8d8cf1a5321384e3513e3b03bb742c238deaa54 +8f2f035fd96c3a336354c89ec9b8222803bf42e95fb2412c28d4e75eec99c1d4d402501ccae17357b757db8bdb0bfeab +81228625ffcedf977fba9cfa13f6edead3985e2651d5974789c394a69401cd7face9e20ae6694be4c0d4bab5e99c61a8 +885a83eae25e61439ad809567a2ab148583402e01cfdd77b0e37ab4038935425c64b4e0886949bf06438c35e80aa13f4 +8926387f48752f6933899c48e038cf14e7941ec6a58bcc0a436614b396296a17aa53e6873803dd3041dae470bd493fcb +95d0d3fa061f4d856eca78a569aa132db14cede7646f97e2aceb6da0c8ea53195d3b7a566fe5ec8c41b95ecdd89a1c6b +a3c817f4062ed6aa94064ea695d76c1825f3bf77b310fe1db28b8bedc9aaacbf1019dbd128adfd53042fb943d863a2b7 +af1208417aa584052da309169854149ede38a3ad63c76cad6e43afb6f1a7b854edf8310a0b00088c039259cedf0f859b +8b713fc3196bad35dbf364089049ada5477e540d78d76a5f0a9df98f7ba4a0e65dd0644509c149f9b07887298bf74b04 +89c09c43c5b733c4a417cd9ebc0795cc3348b72778d31828a9171427779a82ef023c1a4fcfcdc919ae25056f9c826fde +a0759c850ed320c8c874435e90ace6edfb8e7b3f2a09d942b8ad8339c508044ee2ee26c70f1b626ec49a77971433b6a8 +b85cbc58d4fd52286e714ac4eaaa0b2743a1de06fa03ddf8f6668ec6f1d204acccce93b10620272afb8c0b49bc4b0a43 +814e0a87384e159892a8d23036985fa3f489c53bce192e107bd2d64f57b1bf5ea0acc1ef46c7a42bbc5cd0924d92b4a0 +aa6821da96ad89d7881b878e141076522f104ea9a5bbdd1fce9f641898f7d6232c518a87a0f666871d7e3165c26081e4 +a9041d714bfc067b5427252186fa3557bad598fc0067dc8521aa9bc1ae298f6e96113db5ac9f6bade9a85d5a950c9755 +b8669340f3064692625e1bf682d34fbe69a61689e3aa6d6a3e822c781d406b0300dba9c3f7b8152a8c2513f1310d4291 +a78c53316ce768a1dc5968030bf4fc885f4029b1ddb6a5d84a61c85af686c73727f62823891edfcb6ccf4545de366cff +ad1d3aa29ea28292ddd438c865e2b5d93f32cdf009e6d5f5dc726de996583925727e6348bf1c28c22dec0bd86aaf867f +ae1447a2062e9e28af5f38aecc60fe150cd10c2edeaf2110034aa144f6235ed7fbce432a58805d4fe1f6b12652d6e1cd +a32146634332d3303934550705353c6d4fae5fa5985105bba35041e74cd71e2aad67b45da171221f6ed80f36bf6dffa3 +a232e8286184196ea77427b53d8b52c44d758ecc42d22556529db3136379b4989dec61cff610cc6cf6700a450a847a94 +8a72c7255125a736da52dff5f77e44c3de29f88fc05f5ff9227c69df296930caaa11446595e6bea3bd946baac5ef957c +9688a981a9457678067f629f8efa6b522e7318b529f88d37ef56c5bf8f1c34fb9bb3a918ab73caab82bf5abb0c03518b +88286f3eabd71115fc3b17a6bf6981340a81cf7e5f96b0a1a016d4ec8c18fb486d46c70919123d0c189a6f5d6ff29a1e +b535e701b40d793c02ac0d625ca91620d3f4a512aa9741f71389e58381008b2f93d597586d06213c4e103d67d0ddf6c5 +80d0c9dd941e8d8d3700cc51a434a5aaa3308cf8ebfd14128ccfd258f826b27cc3cf5c3ad7851340393abb1eeab3a157 +87049225fa2380d93f18d3d90cb0697a56b373b66d7f24ab209966aed8b55a2790194d5885399db29dd5b1f189eda64f +a52df158ce8670e0290551e8878d63dd33b4759d6f50e448e63fc7fe6ea99dddb6f180be5fc0fc3918ce54c05f80b356 +8b2a728b39c465fb0f60b0c486e5dc8d5845ccec03d3dd93b393cedeeb3fe1b44518359f1ed55fc770a8f74bfeb9923d +91fc05419dba718fa4a910dcf256ebea356bbea00522d8d5ec3e7ba4271a26035aac15e8d9f707969df1d655d92dac55 +97c8779ae80c24c1f82d5a714762d6ee81069224e39515e41d8a71c9310dc5d1c55cc92bc5c6a4bd391ae4c321d1d4d2 +b5e5aedba378c4484e3a7a4ed41b75b0844f674261c2501497de6f91f7274b5a4c1be0e055f2e0c0cab843d891169fbf +8a26212f27211b295beea500abc8e9d430a8500d3a350cc62f895d39e8b4668aa638c17633804ba353010000165637ae +864a95118e5d394e00e99efebd505df0125525c9ebe165764c453b80ad3edc730feebde3d93850745dfd88a27bb8f20b +a092e0b78290e826cc1ae56afffdd08f7c10954f549a3ea6666f3db1b6cdaeb7df53db28dd2a92446342930fe60a27ce +a1720224c0626a081b6c637b2a6d37da85d9a82241e5efef3bc15699b02a69f6304e43d8ff3144d60c16e00225d6b39e +a7b3d098cebea9cf32e19c5195608182b6afe9d4af6b9df532c047eb7a941a971279b2ae6a4b80f2f9d9313a6d788ce3 +a3d2451e6788944802c5077a778d7b7299dbb9d1612676bb6baae78f39976e0fd879493cc4a4d737b8174b472a456850 +930121b73da844571b1411d56760e80923a4ee09917b3e9cff4d3dcb0bc27026ff2c4e2c44e7aca7d3f8383f129c7f9b +b4b0119d163ee00a2b74bdf188a5cdcf054daaa48c483b94bbb4d09ff615afb4a91347db6363bc7535e2af9054ec2214 +a5846decee706780201095a8cdd48fbf3d3a2eac8d089a818e5e22c29457494bbfb4399323b067f3d2be2197c33dbd98 +96ba600df10ee7af5a9df29c0ca31dbed275d647faf9c66c7342de927ceb25b5bdd852dd7aae0228b27897f90fdd5d62 +b6ac51ddc98edd9fb9f54ef84bf372a041d58dfdf0dfdbdc4b08ddc1a7ba93ddbb1413dda3c1545a3fd7386c6b85975c +b35f3efd91a0723e0d486188ea9675a3462106470455118392d7610470b623caca2fa33829721c05fbeb0fabcf570bfc +87f49e85df5f8055714a8ce7adf37f6a278e64e76ed74c60abe3edfc3611ef5b0426d4c6da45e5f3b74d30be1dc6f539 +8ff8bb06902a71b1e9177a77367318b2e3e0a88f5d74d6907ca9943f4f9f1ceb5f297132c2a025259d17a67e880d1bad +85eb6de6c70fe5c53ab0ab27aa0fec439f136c979c557d317337cafa6e6c5cb3169679c9169567dec5f6c72b3c057d83 +ac18715ed1080771d760cb7066c6328faf65d9b30517903f8a5cad8d66d5c6381156b521107d7cd75ebb8c30e250706c +b95b9eae4703727e4ac9ddf2ae675906487bb78905a5f9cba74a4cbfd118d96b7afb6ef3ed5edf14fd963b830d71338c +a3b47b52fda16b62b11c8aa4daa56b0b669c4d5c56a3059b7d063284d8a91f6fff9ccccab23d6ceb9650483b2d353039 +96a95b3f327df94c85e92f2e406f1649ac621533c256b062738f3c3ee137059a735a3e6072247acf57b1b0d8c219bd7f +b19b33cc04570be94eae8e943d5bb17bb0c96e9de4ca84f9f41b37320a1a03d397d53747dc13275fef1b356de557214f +a1faa3dcb931dd91507f3f12a17c43f6627fa2bc5c71fbdd27548e091eaaaba262477949cd51290e81196bffb954a492 +b060a16079dca1d28a1fb33cbc26f368630ee042d980ce305230005d5b9ab533a7a695281ab76e9214458303932d8bbc +b303783196a858fe45d67e0520c30576da605fd69964449c20009fbd5099cf1de52a32d326d7c3b864de07440195ef40 +aa550a4c20d1003d137ffd8fbdc1196d09ad53cfa0e202302093a80fa3bbc4c9aff83f34f2151785cc1ce5f30255693b +a7f8585f45566a351058e10c6f1ff4a7ba24811f1482a47202f581525615ca770da93f2f58878788b45b92cb446ef4ec +8206f63a9a5b59bd68e64a843e68fcdf706f4c13bbfcdfa9928298e5b9251006ae0bbd80c715aa3c9957d2c0148b5059 +ac9490abe1241319658f1c2c645cfa01296f5d4106020c7894b7ba4a65cdd52f6c5401bd3b3cf1c9863e088cd8c9a16f +85dd6d9c80a1b58c24c4d2cb7590d33d2454f381f58e820979948e5831972360cde67bbd56e1860077ef5192fcacb904 +8b0285944c676fe2519cb68da0973275fa29c0718d838d363ce46651b068d29f867cf9fe579ff8da0bb8b37d202bb23c +95147275da658d43a758b203b9ca1f1c1478853e9bf77b5218593142e2bd9c0bf46d2206ab64cef99295de6e9a268edc +b8efa187fdd3e1f46c15cd596e9567690c10e253b5beaa5be8074b6ea4e6d3d06e0f2b05323453239e419ae1e7128521 +8340464f52c92e31806fd3e8e65f56e27194d1f6daa4a0f0b3831e8102aba16f88bb5a621633ddb7dd0342e1d2d12343 +8615d87dcab85a78dc052f05a01e751176b756b5dc9985014347454ce5752f459dd6464e1c5aff36cb6c51b783fa2692 +80c6e35c0d3defbe4d3968792724a23f0b8830dd2fac58663583a49339ea20f1812cc4140e3ee867c7e716177319bbbe +a7aa63dbfc201dde8f29bb6e23d7aa5020dd35bd18a0cc93c8a10c35d695913fe25b9e8cf9b5fd1899e9657b22bc8863 +97c2a4ba80c4caba2e729a603d2faa0120915e3fe64cbb065f7ff33de5f877f1ec9461cf455e88ec9e9ded9393939dba +a54bd1419f0e2d2d87757870f37c476c7e3a13502f1ada82fd7394fd29f8a00c4986473d753034d0954a2550badbac0b +8d3e2bf900d0d2b9b46e6e2f37620f0cc90526dbbcfaad4e4a37ed53f39fdd23bd3a6f21aa7e800eaec937d9710dd6e3 +a88d2b1c7802b2dc216c2b6532406c091bfb12f29121b9a82c1154470e250188413ddd3e79f7e009ea987a4c45b332e5 +8c552c2101dfdc3f99c2da436115452e4d364eefe029b12946f05673c5ce1cfb48d39a579625849236dc6c8e7277dd30 +8415c252d52a26a6400c3189c928a98559bf24162ecf3eef1d10e439269c31d854b0b4f6ec7a2430e3f11b5d77de78d6 +8b38905bad93a8d42339dbdb5e510003c51fcaf05e04f88fd7083753353bc1c4c00a5dd4a67431cd4456d0669c7040e2 +b1d0ed8862250d0f0d9ef9dcf0cd16d84313d1a795dc0c08e0b150dadf9ce73d32d735e04632b289cafa69a6ee75dc89 +9434e18a5fb631b10edb02057f2d1fe16000ee55ada3c26a079c9fc3943e29d6de99e52829fe7b333e962270c712e51e +b1b9f3914007e6fca8ad3e7e848a1108988cb2318da36df24767d804e95d1272943fda948451135cc1b5052a3953b081 +8c02947a76d7b6c0a700a83dfb971dc105bfe996e18c521445f036310914b349ab28e57571e36ae08d13a46fb01c2f43 +893472fbc225f973a0ac6a0a0130b9cfb7ab6869dff80df71a62b1f6beb4afd069bbf35b4f327165bc31dff39e4fcaa4 +a7c176c0903175f3540d62f9afee994d5d9bf37081e094644b22f017e94c515afefde7bb07f638342abef7de657f8848 +860186c2b1d3b1e657729bc804275fb5f5ee89eaa60848fcabd3871289665ea9f0efc8a95792d884972bcfa2de96223b +865b38aea6386d0ac8f501a7d934e23d01dc50105324e354d4c4fa3cb1d4c29c26f4566df7b1a728e10cfaa9d24552e6 +b4eea5548de6969dada658df604b5d9c49002e2258352838003e0fdf7b299d81fb025807a7f37cf5b547cebd7f2c1f93 +8982de11ba68d63a649a3b296d4d56c71e3c3eec016db250d733ab7c3b9a620c09c5a5d0b64fd30d3bc03037ca4b17c9 +84d8b8a10d67eda4716673167c360fc9b95717cf36ef1d5bc6f2ef5b9d2624f0e76c2a704d016adf03e775ea8e28d83a +834d03ebd51aff4d777714783e750b84c16cb6627f8311bd8ff17c3b97fc4a5bba57d6c8f6d74f195d3030bcb5f07612 +aaf49e0def0c4d5f2c1e9c17b51e931d2f754b19e80070954980b6c160178349f6d3c8d4808801d362e77f41a0008918 +8ef4115edec841854e89f2bbd11498dac7396bca35dda554290d3db1c459ffc17be671f4a46d29fa78cbd6064cc2da20 +9641dc8a64f4acd38e343a3062787c48c312f1382f7e310ccea3e95e066ab6dc980f6ed90a633236a435e68bf6b3c625 +8a84cfc2cbeb18a11dd6c2a0aebb3f6fd58a33bb4b26101e826add03748595022e816afac79a4e7c20b3805252839dca +9770782d729017659844421e1639ffcda66a2044df9e19769b90292df87dcb146b20c6b9141bb2302029d84a5310665d +98c7ec9696454868ac52799d1c098c15ec4e08b34884dda186ebfe87d32840b81fd3282295df141c91137faf4cc02da8 +a3f6eb921247617292162dfc8eec5b830ddc294a0fb92f5b4828a541091ffdaff34c392c1d7168259d6204405d90ec72 +b185f77a468f07a54222d968a95635234e74fc942485604909308a9028ed2753b15902b9134749f381f7cd6b89cc8c3d +867608a682d53bd691dbc92eeb460d1c300b362ca49c11a280f6768ccec217f1145f9d59fe50d994f715ce89d38a74e1 +afaad630ad8827cd71aade80edf3d7aeb65a344878db12fa848759e6233f6fceca563aa437e506ea9e0f1e47b126d45b +a12afbc84e3441594aecf85d089423dd3bb8bb33a1a384ddf7cc14caa72284caaa56aa179c15e3140fd56bb532491a67 +98757b0b5e5837ddc156a4a01ce78f33bb1fce51e0c1254ee9b6d3942268d0feb50b93edbf6aa88f9ea7b3c0309830d8 +89573f4a4ae752e9f964e42bec77d28a41840c28e4bcdf86a98a131d0b85367b885077823a6f916972de6ac110821bd2 +a17f2745052de5de9c059307308fc49f56cb5230e7a41cb7e14a61c9efa742ee14c41023ce90c7f2261adc71e31045f8 +914b07c53a41c0d480083f41a61c10429ea42dafea9a0db93862d2269ff69c41db8b110b4768687b88089b5e095523cf +b380cc3e0d26370976fe891d24ea4eeb1b6be8cfce01f47fd68838a27190e644fd57b049d3aa0a9589370de20e276944 +906385fdfad60feec79eb1c303e750c659ceb22d9c16a95faaae093daadd53e7aa039a45d57e20951d6e1ca0dc899ef2 +b5211ceee31b194dba60b616bfd91536e71b9213a3aaaf5aaf9b2f4cbdeb05191861d78b97eec58e3c81abe4f0488c04 +97878e9e38c2f69d697800e7a2f132fc4babaacf471c79c26a757f771606e55fe696ece68a3163a0ffeb2f72274cf214 +959431c1f54c46500c05aaa9a2bc4230531dad97ae768fa92bb85436c0ecc6374cf20fb0ef82d122db116820a943b401 +b69e5a1c6798f30d33e42cb8d124f025d2c77c993c4c7107a539aacddf44d8d4d2239e802ece32e60ee4dbfdce201bdb +a8b09e5e9f802ad273b2efa02bcbc3d4a65ac68510510b9400a08d75b47b31c6f61ffdb3704abf535a3d6d9362fc6244 +a41ace7f1efa930564544af9aa7d42a9f50f8ba834badcaf64b0801aaed0f1616b295284e74ca00c29a1e10c3de68996 +a8f2aa0bbbc19420a7c7cec3e8d4229129b4eb08fff814d959300cd7a017ddb6548c9a6efebad567d5a6fde679a6ac6a +9683da74490a2161252d671d0bc16eb07110f7af171a1080dc4d9e4684854336a44c022efe3074eb29958ae8a1a14ace +8ef44d78d10795050c161b36afa9ab2f2f004ccf50fdeef42fe9cdc72ebb15a09389ca72a00001cd6d9b1d7b3bb766c3 +adca54f3b14fb18298098970b0267301b7312afb75894deea1b2afa3e85b7a3b4efac9971ab54c5cbecba2da9f18507e +ac5d4528f06fdccfc1370d5c3d03ed982fed0861a93a3f6453aa64e99360b124926d1892faaf72d89459e663721dfa99 +98aa1c801bd615b8cba728fa993021e181e0ad717ba01c0290e7355694155407083eb53cb70819c4775da39d33224db7 +8b3aea4c7c2bfe1020de3261ec085d79c7bf8a7903b825d2c70ebbb84af197bcc54e3653c5373a2045c3021526b63b66 +a29f3de4cb3d99afff1daf7d431b38a33a9804fedc41626618928ed059df6f6fe9f298a046b594ffee951ed4d4e1400f +803fd346be540c5242667c18ee41b26bc812456ab13ff117196ed69b90ee608c8cb6554396b64066a546ec87a71ed6a9 +a9c18d81ffd029c0339c72c499bb51685392253b996b6eabd8b76f05c6191ed8444a1397d63b9923743661a319517f7e +a048d5c390d08f07161faac71c5994baf152c883b205f3bb10d3501709d6516ae54d491b486303a11b751857a31f0052 +9156fb4803e40e28d8d57d928481a8de4373687288da44fe88c5676a8ae013ed1fcc09d56a31140bf74e7f767253810e +98e289c725b18e0085afdfaf2acbc674dae7b0a2ecc2537a7d0b87e20eb785404ab05973a787f0495d2adb3e5565c09b +8a7237b249325bd67cdc1f9fb278710069033c304afbf270b7ea24dbc10c8eabe559a484d3edc733c77b4384932deb41 +9056f2e5b02e5c2e04a69fa1323bbf1859d143761268d18e74632e43800a2a9c76fd681e924a19bc141de0e128d3e462 +b9f2bf9e4e7263014296a82b9ecbb05d3f1efa4b2e675e3b38d3eace59da06a89c859256e1b77847886d6aa15f98f649 +83b22949cca19030289bbf7cd2a0d8b84e1d468e78bc85271a6753241b89122627632723bc293cf904a5eb2b5dc6c3ae +a919aaf35dd0116168d2ee845122026416bec9633df113fbd913d8db5996221e234f98470d029a8ff182825b59fda20a +91726901f49d32b41afa15219073842278f60dcee223640903d871e318a1c2b541136b7b38a7b2ab7d31e4242fc29674 +942b77666545bc9a858d36cfe857ab1a787c9528f4a0b87918a06bf510793264dcafd12ae6bd3ee300179dab7f40aed0 +80adc1f2f9c47a96d416e44fcba41628abc0fae1f88f6a26aea4648419ab726f7fcc2187c7d5145e3d8f5a75c03937f4 +8041e0f66ba9dcee01e336dd4d16ae5e4e1618512fc147cc8230003aa2940848162dc2187d4130bf550dc1f3559849d4 +999e8adc51bab54386af1c5e8822986ad1b7ecaf1f8a4c2baa5bb2fe9d10710e49545c5a8bd89ed0e61a3d73a908e5ef +89272ffd39b6e9f99fafdd58bd9dc00f66f26a1d36b38a1ac6215e3546d966739eecda7fc236335479207cef95cce484 +b8e0b7532af13f15dc04a0eb4ea8abd67e58f1b1c6ad2e70c0ffa04a5c18ec2018b5d7f4be2f9f86db5e0b3986f639d9 +b96bd11b0f6ead4abd5fe1e4c6e995da7583b901afd01cc05e87d04663fb997997d6d39dd9fb067c62cb1b1cbb67516f +94ab08914088b973e8dbd5685decb95f3bf9e7e4700d50a05dbf5aaac9aea4be2c10c83096c02252e9238ceea1351d05 +a188de419b062af21275d976494c131ba18d2b2ead8bdbfa38a777832448e64d4d9725c6a1d530ffb6513f18d5b68d9d +8f73c8c118fa25c76a4ec5611351953c491452743056a819c8c82ba4737a37d88da0b55f837e7239a5f46d2c05a1bbba +894a44769e0be1c26648b0d89c4c9f46dbdeb3a71b90c493093bee372bb9f2d3f319850fd886d51f4f58db0de5641742 +87d239923b0db024a8d9b0281111d47b0761d81c50652268b074efa3ea70d793e30f874a91ce33a4acecd0cf38c01951 +b1b48b75a97f9fc2dc9530dc69f6268829dd0ddd574516e7eb1b9f5c3a90058889a7bcf3d378738e6d4b02f5fbfa44db +83e3ee9526ffcb60c6e75b75550fc017912ec0daf96d0a0d5f58c1b229cce90c684ac7c3e17fb998def8e7e2e155d750 +b9b7bba579e474b0abdc7775ff5f84c9f117c6ca17788cf5a5f01b2c35a14aa39036031c8d799fec2cfb371d9f7471fd +90d7faf4891fbc368a32f575dfb69f13e37161ab4f63a7139be103285a49490c2851a907f8d36e09e7d1a190dddbc6cd +968c8b9affe18fc34a4e21f0d8c5518341c566099e6b45b8721c9912bab3693c9cc343406fe90279692a1eef2a3f7311 +8735baaf4704207550f77df73fb701d9a63329993a8cb355ccc0d80daf950145f37e9b4b22be2aba29898e974f9fd552 +90f52b2dccf525b9191d836b205ffe966d9a94f6c5800f8f51f51f6c822619e5abdf1257ee523597858032d2e21014ec +831209f8f5257bb3eb452d3ee643d5f063299f8e4bfea91b47fc27453ac49fd0ba3cf9d493c24f2ca10d3c06d7c51cd6 +a5a4db4571f69b0f60fb3e63af37c3c2f99b2add4fc0e5baf1a22de24f456e6146c8dc66a2ecaafeb71dce970083cd68 +b63da69108fad437e48bd5c4fc6f7a06c4274afc904b77e3993db4575d3275fce6cffa1246de1346c10a617074b57c07 +a449448d4156b6b701b1fa6e0fe334d7d5dd758432a0f91d785b4d45fb8a78e29d42631bc22aaa4ea26f8669e531fed7 +aabe43de1350b6831ef03b0eef52c49ffb0ccd6189cce6f87f97c57a510ac0440806700ce2902e2e0b7a57b851405845 +91015f144fe12d5d0b0808c61fa03efe0249058e1829bb18770242f5fb3811e4c8b57ff9cb43deccfc70552e4993892f +8e9c570811ce44133ce3e0a208053acb2493ef18aade57c319276ad532578a60d939ed0bde92f98b0e6a8d8aabd60111 +8b21839b5dc1c9a38515c1076b45cedec245d1c185c0faac1d3d317f71f1bfebba57c2559bcdb413d9d7f0a2b07f3563 +90413bbd162be1b711e9355d83769e6aac52fdfa74802d628ff009325aa174c68f5329ddd552ef93e8fdcb9b03b34af3 +8b6b02e3f9dd1031ebd3df9a30432a3c86e64306062ef00a6d1243620d0cb66dc76f8d0d412eceff877ff8768c2696ce +9894b41d9fc715f8f6addace65451f41dc5ce7b983dd8cb33757b4d7259bef12f144e0077d0b662aa847d5a45f33c563 +a353a9740f6188d73aa4175a6c5f97898a05ed7aae9d2a365f15b91dfa7c28b921fdef0a32d90b6fb82718b33d3ddb8d +984eab8faed87c403c9979f2d2340fb090cc26d00cb4092aeb187c3f4ee1df3f57cb8363f7764073188790b16dfc464b +a5c5ae0ba435fb7f3ddd5ad962358da326239ff236fc3b51bd22e88296236b109951cee1b98f444302badc58d1b5bfbe +880be1006b0156f2788813432f450f613d235f41aba52a6000d2ad310408ad73d86b79f6081aef1e8c51010d404ba670 +937da751aae68f865c7a33fa38d718f20e2a1c65cb18c8e08f8441f0cdc77662789d2793794dd0a427cad30cd0b33f42 +9496fde66c834ff86f205897db12bbf9a9bb78d9ba8b5fb539cd0a2c927cc6b4120c017b0a652750b45edbe5f650e5dd +97a6f409ffeb593e149307a14bc47befb632412d70565c5f13d6b7d032acd2e3ed0f7b6af701b387f11d69ee4a8094d7 +97ed94934263dc0260f4f7513745ed3483cdddb9adb85dc33193c3a8b4d52affaf1ded23b59c34651afbffe80d40dc36 +b2b26378d44f916bcf999db218b9892e06de8075f205c7dafd6d37a252185c2d1b58e2e809c717963d25627e31f068e4 +b8f9fa1fb45fb19a45223f7be06c37d3a3501dd227c3e15999d1c34b605f888123026590697d0ae24d6c421df8112520 +997aa71e3b2e8c780f6855e94453c682bee1356b5ce804619ef14834475511105b1e4d01470fe4e2215dc72182d9909c +ac2cb2a7cf55aaf990cfada0218453853047e813d3f51f5a623d09f4714da79de6592671358a5edf938a67f905b6cb5b +8d8340d0c3081cd30d34f3ff6191e1ff6ad7994b4ebac19e5936f1157ca84e1813228b7605ee226366d6bab1e2bf62a2 +9693b17669086003cb46c75fed26ea83914a54901a145e18c799a777db1df9c9ca6b2ea3ee91e7b0ab848dc89cf77f19 +a6b6b2a6cd8c4922d78c8ba379373b375d66ac6ea04b830a23d5a496cf714a9439d81c865da92d52600aa4e2e43afcf1 +89cb665020abc3f5e11a03c7ba5ec9d890fa9ed2630f1443a8e45a28c32786ed980b5343ffffaea60eeff5b313bc0d66 +b37b989106594221bc6cf33a1a83c3e65ecdef279e90333a9e105b8139dc28384bb2277edd4b77c9e59d15e6afe074c5 +98ce5aee5918d18b2326b30c1ba41669cce20bc7a1d1b585363305fbdea66055164a7ac398ca0f0e670291a3061022eb +b57f472d5f34beb4cf430d7c0f8ac5bd1c0621a284633ed36e6f7804bc2b7847f54b469c7ea163a436510d9e3b32f97e +ae673a6579dbf0504c8fd0c8fc0252d2f7ae8da615a06f4d215c2f8a8f516201f24e5cc42967630c252905e5dbbd6377 +97c1501835a31091a5a83f0546e01c85ee847a0ca52fb3cc0653f6a826e13d25ddc623a5dea139108f7270a1fd7043ea +9376ee667f3834f6c0da4324fdcca5c04712e0649877ee19da79a2d23be24640c38758fce562470ce2134ca34148ffe3 +818af89c40379a10074cfaba6d5968ecf667f1a68a7edaa18e8977ccb34e0829f237c5634fbd079e7f22928b277f1096 +b8e0af0be0a252b28df25d4a509f31878bcddf702af0e5553393c3dfd4a1f1247ad8dc2668bc8dedc9b41f6ad8e71b15 +811667ffb60bc4316e44bd04573503f5b4dc44d1ec824393a699c950e5fa085b146537ddd6a08a3fede7700396a0df7d +ad834cbf850b2f61ce799c4a0f8ab0c57039d4e1113933c50b0c00175171aadee84894d1376cf325bfd434c3deb44315 +a8b7dfcdb40373ba4d55e751ccfb9070554434df9e359fc165284ee3dc35db6fb6055657ecf5a9e9b7b8e2e1abea4375 +b56a5b9fd41c9d3f65532aa58bf71a38fcf07782e1ae0084dc537862fa02e6d66658b19d6f71c39cd5dbfac418da1837 +a935af5ed224b9533b41a7e79f872f6851591da9e9d906050ccd1b2c772a1d6d010c5fc7160c4f8cd7d3aa14c3bcdc26 +a81e580fc98692567b28323fc746f70c3139d989fb6aabf3529504d42d0620f05327e3385c2bd5faea010d60dd5c8bdf +a8b352054cdcde8ddb24989329a249b71498a5593a13edad1e913c795dcad3d24789abca9c7ed1d57efcc9e3156da479 +b0de8a2bd7f93284b2bc700e442f52ada16a22ad8d86329591547411c23fff0333b2ab0c9edf82bf7903ebf69916eed1 +843e9781b653d1a427f3534b2e86add49d308ca247546f9fcf565f9e08df921e4d969e1b8ed83f3f849e98c0f63e39be +84a4098c5dca9f73e827d44025473096101affd7193c40a0307e3215e850e753e9a08e6e74a442d57626ff26df77faac +b463eaaa2f3315b511c22a97fad353014d840a6a95fe0d457d0677e63e571407d7f5268f8775381a5e7adc3b4163eb88 +ad0417edaa16cfddc288eef4173aa7057ca4f81e815541ac588ef5f24b98d56fed6845deb6ae1a9740a28bb1cd8780a7 +9271963b8fb2288a96e07eac13c0543ec41abdc6d978bd7c44ae08251ea49994412b542c77c8208cd71fd8e7852d4a70 +8b68b6db9044d8bafc155d69e0daba95cd59d6afebb085791e999afed4f33a2479c633d31d534ff767b8cd433d591a23 +a6a06a0e433e385437d9996ce823abda9848754aa9cdd25ec8701af35c9ec15df999825669bbc2e17cedb597a96e8eeb +94d414bff8b6b8597634b77a77d1060db8e1af0d0ddfb737a9bf1c66c8430e93a425510af2464bce4a7b29bc66cf325b +b6514049562af1c6fb7d0e8df6987b020f0b7a6e721f4862e36b1ba0e19af19414ede04b346be22d348b50875803d1bf +a42c7fb34f2fbee8aaccd1d86672d0acdf4e6bb083ff0456512d7e1e43be041cc0924322fcd986e6e1bce5d5ecce6f92 +867cbdd169a52440ae0a75d33a28c7d00aa92b4b65aaac5e62aa53a8fc367c08ab8828cc8fa18b6e7d1f908d158e3382 +a6fe0b768fff3e4a6153e59a7b7508eb2ee8165eaf5274d41ac2812bd4563c4ca2b132f0e27ea2f1c98759cc3589b61c +b3eb1dba43d10b9e17ffec8def053fc96f9883bacb49330a089a0ca5b9ab0182e8b5111ad4aa55c1ce1b6f4afa5c70a3 +a1531351098bdfcda566ff4d811301c0305626c77f954a38420c490e7c684f517eb1a4e4bd2c3904a10bac889cba314a +92278d106ad2f27eacdb86bdb1faa0a07a93765bb79dcff191873c52253af83480114b2299ffe5324f9c31d0abbdbbd1 +8900ba95a90c447fb6fa1f528af3d7a378aec25feb0620516b6b97e54b328fc31af42e46a8ad5e6e3029d83a6f2bbe5f +86053d481179c1ac910d5e7b9a5de82794b442f20e854583512ce1f9c3f09e71d1bf97d6700fe776debfe1527ab97a82 +a32a60de492fc4340336416bccbd2591b5e414fca0aead82281212e24490acc01747537b3da783684e27aeb987245cc8 +9820fe8e0338f21797143f368177e3669a1f3894b40ae9fa3b353125f7c8e85cc424dcf89878f2c7667f65db3b1e4165 +934d64711b4348ac5e1395cc6a3215e5643b540f591380d254165486b0ec2a1d0d21c7d2c6310f9e0eed3d08ecf4b57c +b9fd32d589432eddcb66dc30ad78981360915854cc44b2afeb826b5d48a08e377dc91be66f5bf1e783d1a8bb320f7ccb +98c972cf01efff4fc2e485b47572e2d8dde22461d127ef401b71a111b0603203971e3cde40912643affd7341cd27e57a +8db6c1620760063edabd376f4399b6e1355462e04f5c81cdcb3989fdc00f9a466bc85ed899e886c89c149adad69edbad +ad7b7fda0aa6e2aa66a27235ac5cc680aa04b85dce329fc4be84f75c9c961120a3d9e446aa44539aaac8ea203eecb4eb +8ccb01eaf41d816ce69ebd57754859e263530915e775c4e7d9dac37b2457a9099b9ae9b4c6cb09eb5ff246e3c9320c59 +b895b83b5f7ca46e02697dbaa6157df6c7571864c83e504a8c77d965bc2ba97bf9353a71c56a020df64498bd40e30b21 +8018c07a81c522fbc25f2cb14f2321c61b98bd8962ed8eb7d5823dbe5d1958a5ec2fb5622fd0868e991bcb6cae016ea1 +95b16364e94d01b3664812264d7185032722a4afc23bdd33bc16ae87ee61816c741657c37138d9312cebfb5fcfbb3b2d +94a709209990a8b09bfb4b9581ab471aae3a29526eae861108b28edb84aab6d28f1d7a25dddd8150b70af34bee4ca2e4 +ae06c80839c5a13269b984ff4d8a5938c6f4d8d647b1b1daa8cf7f6145340b76a286cd615ec251a65501e6290162da50 +875cbd0694eeb90d3567da9dc7f570d97b02bd9cf17bfa011efdd48f1d580608a3213bff4006603b8b4079fa66bded10 +b27f88c455f025e1cd902097d6a224d76bdf9c9195adee30bef4a0b0411fff980787285896e1943a62271d0aca531446 +8024880cde783cdb2b863e3dd856be92bacc5b2a1347e96e039fe34279ce528560d2df7d4d1624a4595dbafb40529697 +8883d02c2a5c0e026d941c785128d4ac6f7a9de625ea735b7d6ff27a5ba10fa4d6370d450d99a855d919f40d64f86afc +a1beb985c45fdc30ac536f1c385b40b6113ef6fabc2f76d255490fe529468847a776efa674ba8fed72180f07d3f701f1 +ab83bd9b007561695210e3276fde72e507456ba277ad4c348a2aec7a6e9ebdc2277cb4bd0bca73bd79bd2240a1fc4456 +8db27f516153812149854fd6bb1250e843a3ae1c9637df818b08bd016a769d0497ab6087fe3b2fd4080882713607bf46 +b3891dde4e00d60386aeff161b4a0fbc30bb31ee7918ce5fc0b49aac3238a000ced192c9c4c08d90de3a0ba973d7cfd6 +90a2049a15c02e59024a7a1cb0adea97501c60b1c7442fbbe560054c3d69264e69627ac57b7d9be01bef498bb2a60198 +87df67a4bd72444b5faa4f3b067204c4927c869dd3b29ad192d859589a9b2c1d6d35ed68310081e140add254a9463092 +8f80986a8dc8a0d6408ebbcb4f234e76413c11cb0d66067f9436bb232373100f20a4fded60f08dec3525315abfaa8523 +b061e10beb12ba3683688a4ae3a91600d14878ef78a308d01b93e4918efc666450e3f7b0e56283468e218934231df98c +86b9e55f3783d62e381659d3e06699d788b88aab1ff99848db328a83c97d223f602201bf2127c5ecf419752fed0a224d +858d878e29925c87243e010020007f96fa33264e89c8693af12857b362aee3fac2244057e159651c476ebe1dfbd67bcb +8fd47cdef87d7a569ffce806d2c2dad100692d6c53e5f5dfc6e274f897dccadcee30fc6c6e61373961bbc1f3ecbfa698 +892f2822daf3df3a759bef03168c1cb07408df62e024747a788e94d2da325f880bb9c6e136c7f6643f45b021c6ccb654 +8714e37ac24f5a198f219e7c88a92172fc3db129e044e914663ac708d8101851e7c53fce79d32d0e6da74f2ccd1d30ff +ae95e1dbba8b9e2c8dfbe1c202e9ccfd04fa396470035a699b902fbd86d5e6a31732a7c8cae00b9a4f6e51c8d560c7c3 +b0cd058e77498e860fa20c5f8d9bd09bb249add1badf84ba8d1bd49e704b9b4bcd67a5c3d211840a2c8fefab3fea639b +b78e468d3a7da0dd481f333ae56534e2ef97587be2e259a458e25aa37952aed1cc5f835640f812d8052f5bada8f57b12 +835de7965c6b26e7ad1b92eb6f0261d1f376fa12d61eb618d9b342b597c9c117a5a8f6a36269aeea88072b4641e6b5bf +b4d0eb99136b3643468c9c48a20fad62785a60fbdd3c054efac4bd1fa7979b4c9ca6c2c0b18069c0912bea2f19832790 +a00c47315dc0700a850966836a95f3cebfde04dd094bde0742dee77b89a05b5ad655921f86fafd1e902938ff34d4c58d +ab13fa0afaa92229a71ee91efae6d1b15f14b6eacefffb7401d41d0d6db24e24a8dbe8ee19b4680ecb69d2a0cb4e84e7 +aa56c0fb18401210062dbc653df8e3732aa8921a1280e9737e99b26a0100a13a9cba8ad0317a69bba16193362ee0f030 +8b410324a6406b345df0fa25f541ac20b7313fa55832752f70cf4c79f43b0bd3d5b4cdc447e6ba7bca08d0edffa8e29c +893362241ae412d9e5df46506407595c58ffbd7fb1fdaf0694c3432470599291238997abe118bf7737e56a4f5c9dc292 +921618194a756be81cb49d6357cb392b32cc62d96c8ffb7e16d9659a0f226a0436bd378da7b835054dbe0de2c6372ef2 +94a2904f10994928ff5367b777e1430047736fbece33442cf452018bfdeae62e84cd75cf80f8468285e347d504c94111 +b4b81545b767f380bfe10e0fea9c3cc62ca8db40b43c83ffb245259378731298e3eb6c3bdc3a16932f88f5d8a86edc4d +936203c2453ff01c6fc635e4d54320d69e60047d805daae3b75633c2259108497b778f011e5a057249f11b2b888ea76c +b90bf6378d29339443c3f2008b1e2b5f0345f86e393027f14a295e583bf6e6c2b10f54b6dcc42079ff0d356c405b03bb +916913f550d327de2d8d6c7723dcef2e3869efaf95fd963d95c8980b97748c61ad8e2e629cead8577266d93fe39203bd +a033c6f3d5ecbabeb83eb363e54e5faa7ed2d7f4fb771b161762c4f003eac4e1afb236806b784baf2222cad54e2d3cd9 +ab289d4a5771147e6c29ff9ac2bf65d70081ea6c6af2d9b728c3c144574a31b5fd8632af57c18c389aa2cd994938bb0b +9488da2019ff13e290eeac132b491df58b5b7b23c2898ff1a67bffd7e9c9464c39bc8177a57950fd28589e3d9ff9c6c4 +a5abe42b2e0891851440fb2aa6c1d8a86b571bce8b80c8e9e2692e5cb6d45a1b2f055c9fc4c74a7cd292871604129ea9 +90bfef698e83c2ba4dc9304aa01edd274169a978b7154bca518daef394f55857d0d1922ebef3d91fc5ecb3b895d9e0ec +92328f1372b6406ec80786041b6d57018b8507e3881a08727aadfecfdfcfb0824394cbb1150117ac5da5d71b89e895ae +9719751c5f7a65ae2bed8aff7b4b8c34539ff011b259b7ff54f63f9d987b3fbdce5c99534ed561aadaf07bb6e939e208 +a151816774aa9379fccec21cf212429a1c68cf91b055cbb9d931f461a8d5616c693331a11ac5c6fcfbd17d84ee0b44e4 +a72977b1285618a45943ad00f33f37102e2885eccd2f76785254eeca495068fb1d8d49865343e9e8313c6c2c3b2024da +a6f5ad2e023a1585d90625c9f7094f0e8851c79f0eede8ec582ee8e063407cc5b8298e5fdc4c786e4fbbcecaf33e787e +82901e008febcea0c0a14ae21d985a397630e18ee6e346f4a449f23be228e8f338df567d30211a11180b94fbc5204bec +b9b57fdb8d14d1be87a25f89553b3966eb7869e0519ffdf4cc4d51f4cec90d68f7b81cdc0450e04207276e9c63ace721 +a06eabcf43585a001448f3dc30411f3d5b74fd0a695c81eda9981842ba2bb0081d3f5a8360aa18b6d43ef13ea78b293d +926fe48a7e8f07559b7237beff9504476dd97b5b4d67acd01a3633358a6ba4c7abed5c87683a11209aa2ee759888e00e +a716cd3a84a963e2a5a46145b6ef4ebce705de52bf2945c374152a1e41c228a9c4eae0b6d1e222c1eea8b9c13c002177 +8a9b5985df6fb32cdb06ba1591a977545444478f2fe985ed1b10de61c630f0a4693c2185d63f0dc0256b208072c43b17 +a8eab26ae0ebcdf96a59fad1dc2d5e83b94abb2ea1774b607023f9d9e0fe065853b1e2242e794f989a80a47f550c0bd9 +84adbf38164cd04f3d770a7f4b8eae7a5d25b4a803fb63c02b95b71b33e454319c44e07a760d22bf5f58e7e372d09a16 +90f443a3ba1b9129a0bee400b5b29d42e50bb2aa56b0022bbfc3c6f8d69db40299871ec7c1b68421cc89e1af6b13a39a +81c5a94b379eb98c494a8d0067c748ba47e87a2ada0105202ed7651eb4e5111a0cd8569b06ae68d392c4fd74a37833d2 +8f92324b14a1549ee0b186073a26691088e41556d33b54258fc6e0b000e9624156db4e97861a0ec22960e6c47ca8a1dd +8b021cd0fffe055068cc460aec3cc455952e2ac32be5fa060e0d1b6cf30ed15381618f801249e893b1b9f10dd82077b0 +b3e9f0dcb3d6f0b138f589fa54dfb01f849890ab97016372d004aac55103f363a64bc0e606ddf75430f1534a30fc522d +8fdfe64af891db89b25daa859864d479cb7599486bd6f36e593f8f2f839f942261ffc3eed5001a93fde44cbcdc24c583 +a9e4554373c5073e135874e2bacbee69c65308eb0785532fec6a37834e8d0b437b77a2f11cc63c87d7183b82cd9b6bc9 +b4c47daca723ad7193ac5098cad4dcab654186ec5ea5c0fd014a3ac39726be954565a901694ba211820c011fa1c59e18 +8835427e86cdceb4c11cbea331ed724e4e78af15e3bab5be54f6b926bf66b5d99bcc40dbc456d86342c9fa83a033c2d5 +8ea84590a400cedba047c2661378921a42f5ca0421da58c1bcb37bc686a2aed98afab3fa5e6ba3a51029390ef3cdf4d4 +b48551170fc479d69fffb00fae4fba301e92e37cae08f596db6f6489c3b7020edc074f9e8d7465b84e9dcef1b6b3aecc +a6f318b1eaab00836a330710e88bfe400395b3081485f6a212e3cba9463f6fe7864ba4f71e57a411ecdf2bcb4d189f96 +848d5137a39999141a79f4bdf91150796ba36352d8525821bf3bd6e070b352792d79147341b8254dd60fa8c36e9e2618 +a8526f8904b1eac4ae2a25534aa91e8031e9aac7b8f58d8f49897e920c36c0232f4a30aa6eed305deb0f7793c115b267 +b8b6a727c44c37a8388383e959d195d1d0e51a657d4ba360633d219d43c5df645383e2406c25f1d418e72b862c3a6e9b +92e64adf65b42c978f36dd03ab22ba983bfbb61944efccdb45b337ceb486beda99818bf20d32a545503c4572bb0a4983 +9653bb83df66260a0bd059cd4244ef7c661b089e403d26ba777d2090783ff31f963f5d3a9c125b1ad1a1d19134f3fc8d +a74e72355e71ae5eb36dc75191643500ca3e67f18833ee981010e7e7e60a68e1b01b05901eff05014b9ef29aa4829f45 +8b2139a5da14524cf6acc593144db23db424b95b8c7041d8f6c7a14a6725dda1cd09c42bb3ae26a5a3650affaa742800 +a60ddff4300ca44a7c7a00a1f98441ad1438e07c30275bc46551cee1b681926d2c825cc8f90399ee5f36bb9fbd07d3dd +a04e5e9958867a5acc15fdea0d88951cfebd37c657102f6ba1dcdaa5e46cf1c823ad0d98718e88e436f260b770599102 +95e977abeb70d46fe8d7584204770f14c856a77680607304ce58077550152733758e7a8b98b11b378540542b1175fecd +8c9ec93ed35a25ce00d61609e92d567459a45e39922ccd1c64ab512e292787125bd4164c00af4cf89fd3cf9deddcd8bb +819819ad0338250d9c89aceda9e217df12ac54e940c77fb8420575caa3fa78930689d0377ba88f16d38179a807135dc6 +8baafb379d4150ac382b14a64788d819146480d7a1dccd3deef6889686ded375900f5df069843ef14d754ad3d7540401 +ab827236996bb79b447714c6993af941c5ae66248df4d9a6f3650d44b853badb5c0cb67804210e07a7b9d66ca43092f6 +927656c3eac8d2eb575e3daeb77f9605771170c325bee6aeade10c083d42bd8dcbf3bcc3d929ea437001c7cf9a95e2da +af22b212d5ee44fd4197966b9690487c38a119cd6536cfb8c181f38a94610dd9e057f95774047a446504dd96dd11e326 +a44bd94b9e01e3ba36340f2ac2201ecb477495d4f1fb6726a6b439302deabb5a35d237c6a6aeb7e3b0a65649f8656716 +af367aeeae3bba14fbdb05bcc1a521000dd9d37f5c34ae56fb306d3dfda201d0329a8b6e89d98e15825cb3c6bfdb1194 +abcc4fbdea43e50ded9e2fb01464f4e87fb136e960141e8d39214f92794cfab5634f22cd40b18d8c0e501f2307aad23e +920786cbd674348b9853689915dfcab02cce2a4596d117962bce36aadddf4bdd143891e22f2c8015517039a64e8aede3 +8cde63b9bd57cb3ef743f1f3e8250669eed739e5fbd68c500a3cc0c12f93862a69aebcdbc69dd8f476c2eb307f572a53 +b967e65a5f1cd8d5d570f5e87e7e186fba51b9504f8e466392a76d8a971fb91fd9b7565bcc1647f50d7d15e48b93bc95 +8d5a87b25fedf5edd57d870304bfd9081dc78c3e3e3b38b997260a92edac7feccdaf24feb51822d2edc223b70bb4ed5f +b6cd5d340a57f8ec73723c4f3ecd6601620dc8137a3e75a5d3c578bc79a9cae86b379950c644dee2ff99dad780d025c1 +b6f0a8e754b7f52a85a2a2e6512cfd017f7fb0418d19bb318308951c4e242d3c65bbcb9748da9cbc91a738f9ca577332 +a89dcf7d410bccec385400dd96b1cc6af89026a431d0f531aa992cbd7bc8bfd7c5f360bcb665bda1d72efa17bb982551 +97788e7522427a46c4b6258d15623ef7a565712812fa80d001e1de8dc1791392702f3fa3cce5a8cd1c5755625a0ad10a +b5338fb5e137ff625b27c5148298f27ce8f493e2527c5d0facaa49f29cae34580d0d6c3c1074a2e46cd8db3f56004ea9 +8962f006d7b1095dd0dd132ffe7e87e328510c95ad893cf3b2ab21c177c5cf2c27f47d8856f87e9762c547be009d25c0 +87fee9ce9c26aa476e67e0791a809e0a06a8a98facf3faea730d438d3e516cdf75d645fa75c906e4e44ab9237a22c016 +b75ab972e1a1214bab0b38cc3e973d44bb233acda5b4291f5e110b6fb78fdcab93dc63f01168debd898e165f615be1f7 +b5a0fb52bca279d3853761a94b206acaf313df33ae6303d9b71edae90b66fc507adbc60fb11e758888736c81d5d80c0a +849b8f0005010e684701cd3a4e59e8c89e5fec59af6d2de5b6332cde03b865ea84f07f0b80ec3404380b0e148fbd2c24 +96e2b0b6fe78408f9208f809f5c40398100b2dac202c8c5c33c2189560dea868270a598c419871a5a2b67783354f6014 +b234b81f996142d0df2c719760bf996544820a03195a6dc0ff6a72543692f5a369bf63d1f0b477ef2fe7b3234e41f685 +b85e39bcf40da1a12a535740176f4de749a93824079deb5fdaa004f3282fdefaf5275e3418c88c419bd42a3dd2ed2b3b +a27279304b89a18a4e2b443246f2368fb8b15f46a34533179b6bd2ef683f6e98e222b7a32880b39b8fac1afa90133803 +8923c22cf15c9c1964213d725b337ece9ea854775a06f75f232c4859c7142a3942f418354e33066298aedfba3cb27e62 +b109f714311fb9bc431ef57911e2cad6a3949455b9f23255cd7edea35be629e07f845fe53e2b12a32305ee2f4f264f27 +b51e82ae5c7d48050e405897d0053e9ea4b2714d002e88f78c9a307cd50b9c6b3ee7cb86f86527be9d964b01895fab20 +90db256931c7f98bcf3bffff4d496739185e7a20f329ee7bffd4e0850a37739948ec745285703967f4ca50ec370cf68b +a0485ac0445d88dafac56bfba2563b020cfc370f54c1606c89d12cfd8a4d1336d2ba50306e476155a6f5b0e0a1f2d092 +a00754c3462e74bda928da855bbf90f9077db395e32f03cce9b2955546d900b72330d247b7d607b65e130f5b0d883de0 +8547d56727c3ad8b5c8ce622ed9ad86fe8cd78e6e4848c9845914b5063b17330bd10b46d8d3f18f83ca09ecb28d1afb2 +95b937b2a979bce0e159ac75c7d5d659be8599c92305e73e942aab414793364a3ec28c7c1c8491a5750ba84a29828d8d +b011e150f0294e45a0f4c69409999d0c2e602449dbd67ab95e8258466687cd733a0329083a31b03722f4e2580ddc95e9 +924651a733ad5e5d9adadad3ea6a6babb8e455c8d5f2cb5bdc83fa422e7752592190ccedaa827b866861e73506a6968e +a4d5180122f8e31503ae027e54da50f72f5cfb910a6f7309bd882b5cd666f454672591f1f20e461e182a47d03b47052a +ab19ae659c4f73ea3d21895269dbec583c7029955a36469124ebe295027010faab56c4a475973497f28e9a77c03b8fd0 +ae7ea1a803d0f439e91494f8f35fc1167dae23834c0c699ffe65d3da8b09f8df5a53195a99ca7b8558242279e69578fa +b9d63cf0e30f9800101b43b980bcd2f229758e74b21ad5354866b4e684791c08a184330dc316228a0d67fe0210f2bc4d +8c41629744391ddb96dcbbf9cd99b13d36e57d65962e0aeb92ebccf1c4cc769626feb3ec0363def08eceb102b3dd4ad6 +b2848ff24faf9e667a8c19d050a93896e9e75b86595f7b762c7c74ccdfb9db126ae094961fee7f5d1192776c1ac1a524 +af013bc29206743ce934d5887b8d0fb3667c89bda465d2321835a3618513fba6a459dd7566268220ffce7e0c97e22b2c +8bb799e36db1132da8e8b028ea8487dd3266b4628c56dfae4ea275f3c47c78e3d7445ab8d0aaee4cbf42148b3a148175 +ae2b81fd47c038b5195a52ab8431f0d3cab4cf24c4237252d955aad2156adc16dda9d3270157e0bfe5a44022e5c051ef +8e0129213b1698d2ec6df132356805a8633ba79e672e586dfef664ffccca71834253ba14f296da962651fcba2c002622 +a1ae30b500ae77cd9bbb803d737b4a5991cc780618ac22b5cc179efd8fe10afb8c135457f2e7b86ded485ea12eae70e5 +8a39723077b7c0df6e3bf6548afa3910c214ee275951fbe5155a39473be98099626ea14d844630a6fa90292b9594665d +a628386c79b61aa7314b01d9814aeec20c2a66e3deda322a39957e7135c2e52b1da486d1b9cd61c87afb22c1d10f6462 +97867f469b01249820aadd9a54e12d4fdadd4555f2d530450e1f8f6d2dae57360578e2c2c8ba41e3b5950df596537a98 +97f192d0457c217affa5a24267dd16cb4c01de8fefde9df4884e1906d2f22e73382dcee6c7d910bf6430bb03f4a4f1e1 +86d5b5739de8442dc74d0d8dc78e49210fe11bf8c6ff0f0faecbc47b64812d6b28c8afddf6d9c0212f1988451d6ccb1c +8ff3312ce9693cd4a9f4b8e75bd805f65b0790ee43fd9e075fe4cebc87185bdf161335049819f22530f54fed2779a5b9 +8dc41d85548bee5d51941d55752a500bde3c5a8f3b362da4eec307a963968e26605048a111c9166d448b8dddf6f53892 +996bdfd004b534151e309ac925fa5ee7801c9da4f6b4c43e156d1158b134535a2a3956e1255e0dd72ac2af6bddaebcaf +aead652704b788bf4983c8f725c644c327a6e9f6683215f5c826c09f82fd2e40631791f51d14e6aded91fdc018d45501 +991ffab58a82b98ed8fc7b00c3faca153589fe09cebf6a137ad506387a1ca4dba475b0e4a1b9bdad829f1422facaec39 +9652e6c4ae084221d6bad855ec0bc11b5f855c6efba67f644e0902ab790a98861cecc6ce047c68273c3aa7eeb2f4c7d9 +b88b816507aaeea6dc92b861eabdc96988b74d7883f20a4b30ba249158acaff3c50d261742fc9ad2e9eba888a8d59065 +acd028a51e16c07a10d2073b9d03070457ac5f1246365295a1359d015c460b92b4861125fabe6f114de8197045df408d +806d3cd9d02d41c49179fe7dac5b05dcfc9a205a283135d4f008d0771c58e6f963d7ad0f6798606edda718eb5c7ff3ed +b9b71f1657a6b206fc40159a941e127f252a7b324dea864ecd804f48c0ed86da9778a925fb65491204a92bc2a26fef32 +80ed67bd0e74350c875abedc0e07fd42ce7cb926f0f3fb1949c6ac73f2300b5a14a5c6f6ff8aed99d5ea5029bb8e7ae6 +9875f67a7a473714e4dd75ee0c763ddf88101532d9680724b3848fef69e218b04a96b90f88e0f4409aa40b9a21507ecc +b4a2bb1b421e5243e5e7576a0672dc19f9f70315a03f6411c19f76616ffbb70fc5dc0e57fd4ab85e24ea2261b7ce38ab +879723002ce43e6c75ba2246f51436efe3376242beff987d025c3c4476495af32d52a54fad5d9ec329a442b93bcff1ce +a4121efbefd9c3eb143619afa52a916f199c75024908047763b29466cdfc837c2fcc894aca63044c33c41c777e529b5b +895f637b497a9766714a3d9e3c275a1f0c9ddab105bf4c8b7e663f36cd79492022415bb4938c1a4849bda73106ace77c +b119acb8b161ce4384a924645a248a656a831af526cd337d97e08405415b9dd22060849c76b88a4785eb5e7214961759 +802e712f4c0a17009c4be6c1e5ba2ca3b82adcb68793ec81f4489b7985babd8a3873d544de63d5e5de0cb4dc5048c030 +ab111051e4651b910c68ecfdc33f2d99e7bf4182df68cedbdbbcac219a543e04d93ecb2763fe32b40c095c7ca193c331 +855c73ef6afc6bcaab4c1e6388519fd5cbb682f91995bebd558167715db454f38012291beccea8186a3fb7045c685b67 +a29d02ec6d9baf84c19dfd0eb378307703bfafc0744b73335550f3cd1b647275e70215f02d1f4ab82a5df4d4e12dd938 +91510a45b8a50cac982d2db8faf8318352418c3f1c59bc6bc95eab0089d5d3a3a215533c415380e50b7928b9d388ff89 +8286e7a2751ca4e23ea7a15851ad96d2cadf5b47f39f43165dde40d38ddb33f63a07bc00600c22e41d68a66fd8a0fa51 +a413d4e619b63799dd0f42ac57e99628d338b676d52aec2bb0d1bb39155ad9344b50cdfe1fe643ff041f1bc9e2cec833 +85524e5bb43ae58784d7e0966a664717289e541c8fcaff651541718d79a718f040a70aa8daf735f6635dabfc85c00663 +97f0d48a4028ff4266faf1c6997b6ad27404daa50ca4420c00b90f0b3e2d82ef8134d0a04108a74955e61e8dfeac082c +8df6145c6cc39034c2f7331d488b8a411931c8faa25d99c5432831292637fd983d4f6b1a6f55522b4a42a462d63c6845 +98c2060f67a916991b391e67fcf23e5f305112807fe95bdddb8ce6c4084126557e4c5f003afb32e30bc6808b30d4b526 +8964246b3c2b8f7312f0a99647c38ef41daf70d2b99b112412356e680185da6810ab8ee0855ad7409d334173bcc4438f +b56c2c416a7069c14bdb3f2e208c5a6ad5aac1cbe5b1faf99dc89c7141d0259d1c6250be9d9195500c4a41182ad2ec3d +b7864583a4cae3b1083dcdcff7f123d24a69920a57d6594d0b7219e31bf0e236682442b6499a1f6795cfeb4f5f236695 +a064f94139bf1b70d476bde97099631b1284aa6b4d87f16bfc65c075e58b2f1b3c2d057605259f806e545674a1169881 +80d1bc4acf14c0f487cd57c5d6157b7f38917e93cb660f1c25e474fcdcac3c3dfda50f6bcccfd6676bae25c4b6b5014e +8ad9a4976c4e3e282843518149fcf5d454240740f4b91466f6310b7216d23d70b9b47c42870293252f29f092f330967a +914197593d2d99d784c704cad7ecd3f0b9f55dce03fc928d13e1a1034566c4de754f1c2a5ade047b0956415fe40399ec +8d77f5e29c572ec3c0ca39cbae2072ba4102403265b3d8c347a00386da9c0b8688d6e3280c96037c300d57b3545f3773 +abfdf79d935fd4f06a04938d6580a8cbf9735f0d498f49677f26e73d3b34b7075d525afcb4f14ef1632cb375bef7dd55 +a97a8c446e3edc86efac7bda5e2e5d0158c909552a3bf86151df20ece63b8d18b608f477286fb1c7f05605ab7e6a7c2c +8618d946c7fd62486551c35486fa466bdfcdc63c941e4cff5a01fbbe566b7ea9dc763cbe73e2acae063060b619a212a9 +8d03ee468070936004b06acf64b868963f721f37faa09887f8a82c155ad5c5732572a6855b531db58af03b1afe034a18 +8d3247f75966ea63935ef6049f7c889c1651374adb446f49499fc9191dbcde7ea33cbc1f1e2d3d1756b6e69870404643 +afc853c3a3facb4ba0267512b8242327cd88007cef3bf549184ee891b5ddc8c27267bae7700758ad5bc32753ebf55dae +80df863eaea289de5a2101f2288046fdbfaa64f2cf1d6419a0e0eb8c93e3880d3a3fdf4940f7524ea1514eef77fb514e +8434b5888c2b51d12d57da6fb7392fff29393c2e3bfee8e3f9d395e23ddc016f10ebe3e3182d9584fddbd93a6effcefc +b78cbb4c9e80e3808c8f006dc3148a59a9cace55bcbb20dd27597557f931e5df7eb3efd18d880fe63466636701a8925e +acb140e44098414ae513b6ef38480e4f6180c6d5f9d1ca40ae7fbadb8b046829f79c97fe2cc663cbccd5ccf3994180c6 +936cb8dc959e1fc574f6bb31f28b756499532ebb79b2c97ff58b720d1cd50dc24b1c17d3beb853ba76cb8334106ce807 +adda2116d9fab2c214ec10c0b75f7f1d75e0dd01e9c3e295a0a126af0ea2c66373d977f0aefdda2e569c0a25f4921d0e +89a5cefb80c92dcad7653b1545f11701d6312aef392986835d048f39d5bc062cabc8a9501c5439c2b922efc5f04954d0 +b9acb52747ce7f759b9cdc781f54938968c7eeacb27c1a080474e59394a55ae1d5734caf22d80289d3392aab76441e89 +8564f72ce60f15a4225f1a223d757ebd19300e341fd9c1fe5a8ece8776c69c601938fa2d5c21b0935bd2bb593293272b +a5567d7b277c4ebf80e09c7e200c20d6cb27acbaa118c66ef71cbccb33ee3ddce0e0f57b77277ae1db9c66ed6e2d8f30 +b82e9c2d8df1cdd3b2417bf316d53e9f3cb58473c4cb5383f521ef53e0af961ef916e4f6557a6d8b4655ec01415231cd +aa816dfd2814c8a25bd2cbaf66303ee49784df471bac4b3188074ea30816f00f425234454d40d8ad8035aa925d74da36 +9919f384df20faaa2d226b521cab207dd2b62420d25ebbda28c9b2ca76a2a52203b2ad7844c1a25f5c75f005c5a83149 +b24a6aa35c2d0f87e36598b36224c64427cd69642b6f9c1bd478a62c70f8ee69f85028648f6603b4f04fb21355f2afb1 +892e044bdb1276b455eac2204be105e1821f987c2570494b1f32aa09506caba7ed343cd09b1bc126fed5e0fda3d0eaad +af0e01a3ad954dc048de18bc46bb1c4971db2467e839698e4dd05cd1adcb9261013fe9fd0cafb946c0b586f6aad86d4e +ac152f0a9ace425378daf02510eb7923ff1ed2c0f8d1deb918e4efb63655de1ba58c96438e9aa23abdf2431dc771370d +ad8c7419c097709347e2394195924e09617b47ac5c7a84aeb9deab8975f22155de0f70cf20d8a976551b14e3a2683a2b +808f14f67ae801536fb70a5898ab86e50ad35340cffd0648daed2f2c4564c9ad538034b2a179a6a8bfa27e9d93b4cbe0 +80a74ab7ce4769db93cfa695a166db95f0a9c47885ff826ad5d93310f36d6b18b5351c67c858b9837b925e85a1995b63 +95b88c3cdd64401c345828f4e4754b1a88b4875a14c08a668b90acd499b3b858842669ecd73a46c5d9f1de32ec1a0120 +8ddbd770b7b18a5917eb43926fa05004e819f1d1ead05b915269e4a86b53e0633a90559007e59f6705a3769e2126ac56 +ab6db5fc220754f19948bef98844e6e38dd623565d1695e1198040c228ac4fd863c1f168cac1d036bbfb718d9d8dd036 +97bef628e977c069e60c395a17740e0e1bc1828f5607ae7f30ce5a0c95f02b53af2ad062700a75212e462aa22c3c5465 +b68d465e04fd17ca98501e61eccb0ce30401855e98046e0c1debba71c2153d6a7a704aa36a6f12454696e78e87181cdc +a79cfdd048f4181e005bd0fbac0a8424495474956b58ce858d2b700fb0f931c406282bd33bfa25c8991bc528d12a69c1 +843f55fa0a6a0969daf2b48080738f30b269b2e7ec123a799e5b203c0b3b4b956dc95d095bc6550b0013918cdff8a225 +b683cdf2823036827e5b454bfe04af9bec1850d25a7a7a44aee7696b6ff0468b7ed6885a41dde2b8f3ecc4aec880c3d2 +8b500796e82acdc89778e0c0f230f744fb05f762000fee877bcf57e8fb703d212dbc2374887bdc2e7b7a273d83a85798 +ac35a8ee87bafecb1a87f15abc7ccf4109aab4ac91d357821e417f9b1474d196c38cc41cd13667f68d1ffab5e79a6e92 +b6e517739390cfed5b395d33b14bce7cd7aaece57fe79a7eb3cbf150dc10765c3ea9fef7976a21a2243687e6eea38ef6 +b53901eeee26692273365b789f2a60afc9b5f0df229c6d21b07016cf4c0e7985beec748aeca52262f68084393ab038e1 +ac4804f33d8ba2b4854ca3537bd8bf2dda72d4e94ff7ecaaf9bd3b7f098343d74d765471ef80072ae34f860b052cbfb1 +8c6a30a93f1dde18039bbdd1ef294552bf79856e20bce863e4b8dd72d906be3ff22468ff3610e06b5a7d1745dde7ead9 +88f0607fa3b7cefe20a02115572b16fc3222be86bb19e592c86c48afbe7e0dd523492b0c29a3bceb9a20f5538bc3134c +a660b801bbddad725975ddf9a8f606f76ecef831f954be224d6178c368e1c72d346f00c4a4c95c289b62d36f2af323cf +a75b9a6aea9542b698938dcd6cc2f6fe0c43e29f64b2f54aeb05d35fac73d41aa7fd750af4fa9333644aab8db90775b9 +83e1b7129d963d1cd076c3baa5fe422148e939273db173e4d59d1858a7d841eacac7fe817d15ab8f8a493bf46c2045e6 +9060a2e9c24de11f9c70e039b5ffe9e6d32f1ae39f3dda263610df2265d917679e689898e4a8bd84ad34613dca5e3761 +b42fc8b863a2af15e04d1fe6693c09b46007c0b8298973fb4762b45b4590ad7fe0aa758918b2fe5ed1ed0359754fd955 +83e6de7860fb256ecf7b47506a5e557d0fb0aefe57fb513c7dee2bd9604712d08ca26adca7ba9a54b712372a7c585a26 +90586e9cbbf71475ecd3e7b5753b286804dcce61e165502a82b960099e79272de8b7494b8877b54ae838eb5d0f71af2f +b2e4b0d21208f73b7b75e08df80cde20c4578e117d37092a490af82354e2afd3a7dbab46fa2d12fcb731cdaece69c2ba +a010961239bb8809fc7fb4aa08fa30d33a130f9f417ee9ea60f587dcc5ef4e1b7abcdcbf8e848ecdcb7972ef6af46e78 +8f511fd58d1e3403a5eefdc0a4ba6b8af848c7efddbf9575ee84449facde05ae9a24aa41a5725416467f6fbd11369c52 +b24ebbd2d4482eb618cea1ac4fbfd9ed8c46c0988a27259300a7ce5ce1bb256aeca0357828cbbc4cf0dfafbf586040e1 +b3ea29e9cca55250e9b7b9bd854edae40f0f0cc65fe478cd468795d1288cc20d7b34ced33bd1356f1f54a4291faa877d +8a8b20f222d9e65bbde33638033972e7d44c6a310b92a9d9c5273b324c4ad1a94f2a10cbce8300c34dbd9beb618c877d +b2436a9a647dc3f12c550e4ddc5b010e6f9cb3f3504742d377384b625fc38f5b71710a49fb73ffaf95b9856047c98201 +a13f8b77c70621e421be94c7412454adc1937b9e09845c2853ef72cdbe500e5c1bf08e3c8b8d6b8eff4bce5b8dec9213 +b25de8780c80d779e6c2e3c4e839a5a107d55b9cccc3ad7c575f9fe37ef44b35db4c1b58f6114a5f2f9ca11e1eb9c5fa +96ba6ad4358c7a645e5edb07d23836cbd35c47d9a66937d09486570e68da3c8f72a578bd2e14188d3acc17e563a652d7 +a7f55989814051fda73f83b5f1a3d5385cd31dc34baf94b37c208b3eaca008ff696fd7f41e2ecffc2dd586de905bf613 +882d0c7c81e58eb9560349f35c35e4498dcde7af7be8d7974b79d262304c26ab67ffa5ed287bb193d5f0ab46b4096015 +a607158f0c1fd0377a8ee5e9715ac230abf97406c19b233d22f5911ebe716967cc10425546dc44e40c38bd6c2b4bca2e +87e8cde50e5d852d3f073a43d652f7186bac7354612517cfaecd4a1b942f06fef6f14546279c0dc0262e2997b835b2a4 +a1c93acc6db9d5ee426fb4a0b846bb7a7b8d5915bec777a9fe6907246b0beafb8938941c8c79ed6082155f75dbc1e332 +b1e4f61457b86f76cd93eafd7536f72baf239ce5a62bd5a8085a34e90576b1e118e25002d2de49b01d6e9a245ee7d3a2 +a0435fe9a4bd1031ec5973a103ec9396b2ce9fd982f6d9ed780fa80ac06a6e47a0a6eb2daf52df1dc9292db622ee9fa3 +b66d8e8a1717e4bfa42083b6ef4490e090a73168b2912f2111743e089027be0a4945a229ecf5d0b5eec11b23f0e11303 +8eb764f26904eea4f4169be6e75beaa6a39e4eb524625a15a78befe3d8e3cc82692d9b135590c20ed460d6e4ba630ef7 +b7e4aea6bb09829e53fe83e53f49a7a331a6d7bf76e0073d758577e6d6fbe63dab642b23657355cad48896ad8715119c +8f94207982373a99ffa282673f192aa98d0c4461fb77c31dc4549628bd9687a249f1b3c66b1840929341e42516c5c64a +a9c673cb247b13e17fa5e616f0399b7f5c7ad043e143e44ae68855a840870ab3d2aad737ebcf74c2cc9688d17ef3a794 +b02635104dd28c02068985256975c0af783899eb996e37d021d9a35238deeea9e836760db21869be7b6c82aa687ded29 +b33bc0966389710812b5f6698afa3e9c84839a1b85492ba11e6ded26695260abf66be6fb355d12d3a8524966f0f89e0f +a79c0dd09506951c33da3cbc23843fd02d641fc24c640a205e6e8150240372847312b9381fb03c5d301fe4dbee8d0da2 +b74de6f3a2c502b5b658ebe8a9b7edd78afd036f5a2736aa06502863b6865d131b9e3542e72a86fa2e1d2db4927661ed +99e365def1452ff9fb4b9eccd36ff4154d128469ba5bd73e83ae457ab53977cf6fc04a5d05bdcde357ab539e34bd9fe0 +b4f2bfb95abb47c67870aa6ca38ac8f3ae1b1a2bed064b1be7ff90865ea12e4930fcf66429c7ecd1183fae4a01539386 +ae4bde87f36b912e92398bf72e11d5389e93b2de1b277d7ed4b6fb5a9ab9f71a959ec3bcb734c11079440fe42b86fafd +b826459e568efdeeb66688482b67ef5020787275123fd3192f979b6175e3b0ed59e17cb734a0a052bf13f0afc7bd237c +a99dd735f4a7c85cb23dcc7f4835f9ab32026886909aaa95876b98029c37dc4d621726c872d3a9e50403443c958f4029 +99083545034768010988bf8a9f34486c2cd9da27a1d10db3ab86eb69a1dd9c8ee723e7da4ef2aced63c1dbd53ccc52cb +8ac3209349f0142546c714ef7e9d1b094aab5469b8f080c0a37cb0362da5349e108760f272fbba770aa468e48d9a34c4 +af5f48ed74b21e3f2c1430192adb4b804dc873cd7e8f07130c556c30e7b78df0ef5a14b205368848fa9185e5a68dee0d +b8b741b65d68df89443523ba74203226f1e0d13bab073d183662d124e83e76cd318b2bfff09879c04d81b577ac895638 +914abe4282d11176d4f2f08c6f15e6c2d0cde1ab4de00bbe888015c205f51929d97296a0a8d3ca5641f085a29ea89505 +83ec306b2a9a6780efafe799df90b1aebdbff7d47921a136ea8a5648b9708a97231245a1082fea38e47ecafbbe000528 +95d6b58d70b388dfcee4eda0c9805362ccfb60a87603add565b175b2c14ed92999dfdb0d3724ee3e5d30535f282641e9 +97eeb4de607c8306e1d4e494f0d5db126d53fd04983ab5674ec5996b971899e734fa4011f2c889da21154ea1e76dbd2f +84ff21977fbd873ea06bec444d4ec9ff0e3902edc29dfa25f3bed269b3709e3116e99dc06cc3e77f53c53b736bf8fc29 +8ecf483874a040a4a1c293af145094fedf203a5eb37c3e165857e108cce3e1210e0bfc0f26f4ae5e2194024929ba034d +97d9b92b2ef34609d69402167f81bce225ed3a95718a3b403f702b93e96a121a8f7f072d0ff47e8b25164e204d1576bf +ab87c39cca1803b4e84b32e40ff30289e3cbbcfbe16a70f9e025643824752359be1f10c3e5398df402b6fec64d5a3537 +af84ca57e6944332884b5c84750afe0d5950015e127acec161853d55d48fd864c7da8d59cc5aba4ceceac650b813fcc0 +b1d23d98edbe7089ce0a8432e0eb3b427c350fb4bb39eb2aca3c2bef68c432078cb9b4b2c4966255e00e734fa616638b +8e2b5252e0ea96d40835ebfb5693af49946509975682d68651396d6bb1463f09e75fd0afa04ccea49893b5b9c3e77e40 +8db25e762f1d4a89a9a1cbc61c01698e775906bc88a921b2905735457a35df9ab84bae12e1b1b8dafadd50212f1acda1 +b5f7cd163a801770a4034e2b837e00191b0ac63a2b91032ae9a99ec182d748798df48a14644935fabdbac9a43a26749a +998e7232e5906843d6272d4e04f3f00ca41a57e6dcc393c68b5b5899e6d3f23001913a24383ed00955d5ec823dbd3844 +ab2110a5174ae55ebb0a788f753597bd060ee8d6beafc5f7ce25046ea036dba939d67104bba91103d7838b50e36703d1 +a211972a4f6a0303bec6c86f5c23c0d25ab4df0ba25876cbaad66ae010b5a00aa0c5daded85e4326261a17a563508a25 +a49f53496a4041a01e07f2c2cf1e84e2ee726917bb103fd267451b9b7bb1331c0afde85a79a55409bfde27328b2a4745 +934e915c67c7fc47adeabdde49f63f04644fe234672003be2aa0a2454dc8d9288f94293478936a450f2e3f249d395b5b +b6e69e9d6808ff7f60a01b7aea6781495d7a20f5b547852d3f0af727a7434209d3015a9dd04cbe3e272918e32e345508 +b348d3462092b5c6fead7e515e09611438db8d69650876dd3b56226e303252bbeb9e9f3b888fb911445b0c87132a1d0e +8d6510334a905efe5a32001e167f1ba06f9bc4af7ffbf11b7f7bf3c0076b5cca373d8c47e98c1ba8755bb22632bfe0e7 +a2d5200f20985dcd473d119ee97e1c0fafafa0f191185bfed9cac429cef8198d17665dac4f70342eea66e6e4a7370d58 +8dd7eb6b1841b3f33425a158d33a172b79b2dc8a01378e4174e67a1a4c8f4b887f02c7c3a8f354ed9eac718155bcdf37 +b16ca19388642f71afcd9f7007b490d82f83210ac1a989da9d4bf4c419de07af8c048cd301ec7e01b9d06abda7c169d5 +93cb2d847d1a88de8c1c9d5b3c83efd0b7afb3682942bd2c8ab5ef35b33dc31a097a3e181daab8630d4e840b677216dc +a8b648c769e77a7b41c0c689fe2fba9bc585067e004bcb1732cb7b1618e97b317781c36c23a00680fc780b58c301a789 +918c321100d57712866bdae84edf7e42df30a32853af257e0cb4da028842a43b49e775f3cecb85cd817269c728de7319 +a7b0f6ce42e00c519e69b2c78fd9b75a2e7103e5892d3c1afd70c9b5b9e706180a4bf73dbb2d3eed52bfd521103ec5b3 +90041994af3322b010891356afd8115340bd7fd7ba328716fbc4fe458236c8cad8c7564ae473d6091ec3a54bdab524c0 +acb1ac83809573846231f9be2dc5f3e986cc36dd9574a620b1cced45bad0b11ea957ce8c6cbf964a0af916781c574f05 +ac54677dc002698fc4d454c7beb862ad085d0514f92576f3485a44c0cb47afb9db2c085058918a3508f9b3de0137d97c +8dea56e1bfa150e442f8484b2952b116781d08cfa3072d08657cc09b0217276efc4ab6f5fd726bfd826f6976ced8da29 +a2b09e25baf01d4364b5205fa0c4dea84ef8fe03709113b034f88a0f0a502a81bf92c1d4641e2ac9f3a6f4203d3645ee +b95fe37aa351b4292691a9c2e547224c37ec2751a31ecce59810cb2ae0993da6fbe5efe0ab82f164462fa3764b6eb20f +a3498947e91a3a540e86940be664fc82f1e83ff41a0d95eb84b925e820602a41b7393c8b458bd4ebbe574a754586787a +aa2516d3620c832e5728fefdb1af0be30c871cbad4b166a7a4565af676e73bddc2f2f51acc603b3a022056daad2b330e +a9251b56467fb55f64c70729e2ec77a59d7eac79cc0b4b25ee405ac02aea46bf1cbc858bc773934a6d9bea57cb528185 +ae8c0a4ca7ba6bdca8764bac98df0581f00358db904e57867e6ffdf15542e55f7bad2dedac152ef88038b466ed901934 +b0881e27e52cc6a57c4f3f278dffc7f63a9174b68bc867c16d8a151d9cc4d0aeb703d1074d1927faa9ffb43e10912c9a +b67138465d6654ded486d18e682f11a238d6a65d90f23d6b13eb6a1b7471efbac9ada6345dfb13e5432196d2a256829a +944c69a6f1126edd38f6eef60b8a5bd17147ab511e44e8e0a442e87244d8f35236ee0b8d3dac0631f8598f16486a5f74 +995679dbe03dec775da26708cb9200dabcad983825f1ba601eb9395f9da350ca71e8af61dbff4c668fd0eebac7e4e356 +89de362f02dc14de6995d43cdea3c854a0986c605ba5eb5dacf24e3a85983229bc99a2fcf50aba3df59f0fb20daffe29 +84607f0e2d078df22d0866285614f5d78cf7697c94a7d1b5e02b770101ceecbfd53806b377b124a7320d9fed65000b97 +93e3faab60050dac76ab44a29bcd521813e76ec8e4ae22712d77bb489bb49f98f9087acfd6a77016a09a42ddedab2d73 +b7d64a7a35f21747b8e6a874be31ba770c0d13cbd41448411994e8cebb59591295a26bacbf74ee91e248a5b111aacca0 +8dcad429a2b0d66b9eb8c1c3924d7a72979727db6a535526a3518bed2a9532d12aad1c5a778824ca4cb98e3e513f85f8 +980882895faa347bd2fd1dda7b8ee7ed49e69843afe646f677b371eecc7a10e0f4e40bb55f28995a40080df471876816 +89e8e7fb51df79971e2f7bf65783614abbb0d7f3f1b4a15d3f0d160deafa7ed1c446d9a5ae1a77160d4dd94ceed8af13 +93fda8d350392e9c4d4ffe6534f7e7be53f32483d9319093e8436fbb8166a3c01085dc858373e65c7f4d014e0dc2bab7 +897521a87b7ebf7152de5260c0875e3c7df1c53e734c672569219ee6f9bd196c5ecef159b6a1d3b7cd95e91b9b8803ff +b59affa408a0f7bd7930fa3b88750fd043ce672c10a3adeba95a12f23f0dda1793f761a86f7409ce1e6fd3b3b7195381 +b4422ccc12f4fe99c530cda610053af9ffe635b633d52492fd81271d1f6f91b87171d572d5bd0e46ff63e221fb2fc4a5 +a4542cdf3346ee0867c08d630c2aefc57442f1c05c0eba52d223bfdca5e9d0bb80775cff6ce2e28aa2730231fd7b1bb1 +a7d297bb09118b914d286e5d1e87bdf13f7d174b988e38fb5427902e8e8c674072f36b19055a1070abcf357f8668f35b +9213b0ae24b7cb43ae95e25c09fead8bdbac55141694137d67eb5eab5e90a348a13d4d4d2cbc6436fc4f4f9f7334ced2 +8aed71a0d116d832a372b42a0bb92a1980f3edf8189bdbaed7cde89fc0418b3ab21a04f5c6e1d3b8edf73f1f62bd6b15 +a6c47d77d714c285c84c6b9458cbec5e3b191c0502dffd10ce049cf1ea27ddf868ef0cff13a2377289fa6c932b8e4f28 +92f45622ec02483f2c1e07075a6695416d3768c8984856f284f40734346d56cb5b3322f20c2c9f0ef8e58ddc294a309a +af6450d02b79ac9fc79f35655b58fd3619cd5d38c5317564b453f5f2d79d7a030bf767e399fe01b658a72fbd2cac2356 +a3c01fed5240eb8a61ffa8ff4a120dbcebb53b8e19845949c77fb4f9b2c3dd52c7001df6219ad2f76c785a4ee0f64a2a +af3136bfe8f774187bdf87555a1ac505322a956229a285d28bab1c88d4f4d12245af8dff35914a62e90e49f3dce6acb0 +b20e21d28444fc96737958cd951858fda324b924b4d3d08932540fd4b87150f053db6985b96903906ce83dde0578cbb2 +b7978101071268d1f485134b4dfd1e35f89b82c7d99ae91f58b6745f5e0273b7e06f3b23009033ecc3e41b2e9e85219b +9104b7d75245b784187175912cc0ad869e12f1983b98e052710fb33663224362bffd69ceed43e7d4ad7f998c0a699eb7 +a7624cd71b92699ce3fde0e747976ee04ee820032ac45dd27d769edf3b3379a4b8db358e50c9d057c63b5a9b13d76bcd +9354a76f294005de8c59db10e638ae6e8c6d6b86a699d8da93143da8478d36116211c788d8285d8e01ea6647dfcaa1aa +b85935c04cae14af9848db5339ab6420122c041075ec1549314e3c9c5a610d9b794ea3617c50ca7af6b4aec8b06bc7dd +ad6835a62311c84b30ce90e86c91c0f31c4a44bf0a1db65bf331b7cf530cca0488efaac009ab9ed14c1d487da9e88feb +80339f0245cc37a42bd14cd58d2a8d50c554364d3a8485d0520ea6d2c83db3597bf51a858b10c838bfc8b6bc35619638 +b370420ac1a011f6d8f930511b788708ccf2fe23ca7b775b65faa5f5a15c112a4667ed6496ae452baf2204e9ce0dbf09 +8ceab3dadca807a1c8de58ac5788313419c37bc89603692c7a4d96e2311b7fe9e813cc691a7e25a242828cdf98f8bbcd +ac1526ebc6bd4ac92ee1b239f915e494d0279fbd065e4cab1f1b8a1663f67daa89560f6c99bbc3e63fa845520316d2e6 +8240ab0bc36a29d43ec3059c7e6355ff39567e135f93b243145d3ada97fd1c970743819e0d58bd5171967daec144e7a1 +a99743192a6f1967511b2d3038cc73edacb7e85f84b2926d8880d932d2fa12f5215592311a7548494b68a87ec70c93eb +8ffffc31c235997e59ab33c2f79f468399eb52b776fd7968f37a73e41949111957434f2c0a27645ab34c741eb627cd1f +8949d955309415d6d2cf6ee682ccd0427565142c1bfe43b17c38de05cd7185c48549a35b67665a0380f51aef10b62a8e +9614f727a9dac8ecd22b5b81b6e14d34f516db23a1a7d81771ddaa11f516ed04d4e78b78fda5dc9c276a55372f44c4d4 +aa85d3ef157407bd8aa74032f66bc375fddaff90c612470b5ff5d93659f8c3523b2d1b6937b3cc4201c2aa339621180e +86f8fe8bf4c262dc6a04620a848e3844f5e39a2e1700c960f20ee66d4a559a90141ef4e5091d0f32acb1e915af1e0472 +b3af2eb785b00588371beb3b49536b7919a3f2175d4817de5dcbf7fcc20c512852ef0f313327fd0589b10173f77b92e0 +8388703c512eea59190351f3bd2cce83ff8bcb3c5aefc114cccf9e9b3f78200d8034c3ebe60448aaf6c912f0ff8f0cc4 +95d0dbbbf08ec1ed3975fe7dd542be0a05156a2b3db5092825d918a849411ee536ed958201f74a5513e9743674d6658d +8d1a48802f1a2db247e633ddf61d3ef7a2c062c48dda59bf858916e04f56651a7d51e367d6535964ebf3ae6d2b21b421 +971436871bfe868f25247145a55802945409b3150008535b372c949760d7949dd2fdb40d9b96ae7473bc8f6e9b83ecdb +8ca431728ac0f156763090828a7b6d860bf591e5b9dd3bb3b7f3ba0ca74191f9710ee55efd32db7d18eab5b479cee8a4 +81e28f1a506e84c2b9aba1df720cb50e0b597b2c22f98acc34e710c934cc6f97dcaf33d589e845c2c1f6d8716d05ccac +8f43b11d3f00c41d16c9bc9bc0c44227c056bd77de4f1ca9a799418c5601e744f99066bef47da2d9088ae88eb259327c +8d330aa52744c08ef98cc5599eec8b9b4dd18aa01b803f1d1ca0e29b74f1aa2886ed0224390fc377af25852851fbee03 +a06f5b203b67134c685039ec2bdbcc787353e2575ce73a415db24a517c0c31b59d1de89f12b97cbef0219fb6a1e90a20 +9269a5f49bbb8fec1a387b5d105df88a027de615d5ca6afae20fe89b11746f8d23880db78dac238c955fc8bb3de18046 +af5074b3bc0656421c314547b45b5abd3045ca1b17f5e34ba39d8c1f7928a55d4ca5ea9c2ab59a55909b25255233e04e +8e7ee5d733c8e08f3fb7d85f0628de3de6835121672c65374905dc6d19e02fa2df14c13d5e9835dacd609a4df09abd26 +a9b9aaf83d31e879dfb8e73a0708801b4dbdb5d7c8654b27d2c0f5797ebcacc8d00a82143e2060f0917c9d41f1a03de6 +904872aa1c093cb00e1c8e369a3bdae6931c5b1ed705dd3bffba243dc4f42df3e7d7cf70303d513b34d2245743d765cf +8a4d6b3b1d6afe67383c66693f70b397e510be28e3d97dbc8ec543d699b6cbb0e72eb90a7f65e83cf9f7ef50fb18b128 +a914de13916e6a0dc0e0fefecb3a443cca80d83276513b70c22c6e566a2d41acbd33a0e2836ee09abeffd3a4894e437e +b9c408f5f05934b0aefab301ba22f8254c5ebbf5405b6aa788f76e4b328c150b395f441e3566015a0deb3eca89afe9ff +8d32aa2c81b2a8b89f347c2e0b6567b2117ddbb778fda8a3f19004b7f5aa9dd814b9b3ad35f9223715d2447b2d12f159 +8230e8b9c84cada1bf14ea6aa9ecdadd978d893cf5962fee6c7167ed21239210ea491987f2c8f2e8cfea8c140704ca28 +a5d7b6285fea51c6f21d0976a7c3a97baa3d733a201bfaac0994db6c65611d91c5fc0ebc2a7724ee02b371e575573649 +a54f00a9530f6930069f5e3a8b8b1d52ee1def0aad1763e3c609ec07f25410969b43d5943a94c235ed5eb207b33a402e +a8dc6e96399b81397734c61c3a8154e55a670fa25fa5854b3c66734cbb4ec0d8f6ba650ee3c71da3773ffc9e37abf8bd +8841fbfae1af4d400d49f74495f864804f043416c09c64705251d021b3ab7881f134a00b0241e61010617d04979d747d +95acea7ff4861cc969c1d8cc8775c5eae014ad6e2e0e2d0a911dd916c34ae69f53eef779cc24ff1eac18c2b478d3ba2b +a5dce74abcfb8c68031b47364bd9baf71a91db01e45514ab6216f5eb582ef8fe9b06aaa02f17be8b93392d9b19ab9c06 +89e111169e4ae2f4016c07c574a3bdacd8d2f359561fbbdaa3474de9bc24ef8936784dfe6fe0e29a13cac85a3e622b61 +a4c511af6bdf3892939aab651828259e4ef6ebecfdd503ecc14e61001575b313a89e209cb55a77ec19a64d29ada066ef +923c62156fbf3a44926ffb5dc71f7cef602dbe941a98c61f019a27a18a50c16b6135b6099fe04a2e1dc88a6cad989fb7 +afb9191c541b61afa0ef14652e563cc5a557842ce2afea13e21507dde0ebbe6da5233af949c998c00865c79bb3d45ec8 +8a1f0ad65cb2b225931f41dc53547d756111ecbf5bc57c5ee2cc1ffd61b126d0389d311ffe26cf06eaead95af09c5ca3 +9040b20b5ac2e1a9d30abf7a4eea1ec2db8f3077cb2cfc8736b37222d8d3937f5d9f421167086dc5551e9f0bd2522d07 +b6d888b8c6bd448dccaf99c3f690d47f802e134709ce102fb6f6fc68156943c0762be6f386338163e01eed2d1dd5f734 +b94f0e27bbcda793e4a272603b3dcc739d3bf3207798df7319f8dc9d37cbd850e3724bdd30498c929debad971950223c +9769827767be9d7bacba1b687289e0794c6fe630d33c9b607da1f6a65e3f34cb8bd65327d9287c8c5f3c8b5f6d3d133e +aaac72c993aa2356c9a6a030950441de42b2d746bace29865382f0ef54835bc96958b2f00237d805ee6a69ca82117c1b +a2b1f027d80c1b0e79bfc7dd252e095b436fba23a97a1b2b16cdd39fd39a49e06a1ca9a1345c4dbb3d601ffa99f42bdc +b3fa0ad1478ca571e8aa230921f95d81aed7eca00275a51b33aadabd5cb9c530030691d1242a6ff24e2d4cfd72a47203 +a43ed4368e78daad51b9bf1a685b1e1bfe05bed7340d4a00df718133f686690c99198b60031513328fc353c6825a5f2f +965e145711ecf998b01a18843cbb8db6b91ff46f668229281d4ca52236c4d40804ebc54276e9c168d2a2bfc299bcf397 +ae18e6efc6f54c1d9230210ac859c2f19180f31d2e37a94da2983a4264dbb58ad328ab3cbc6884ce4637c8c2390f7fc1 +83a9200486d4d85f5671643b6daf3d0290b2e41520fb7ea7030e7e342d7789023da6a293a3984308b27eb55f879ad99d +b925fb6ca83479355a44abbcdf182bfac8a3c7cce6cfc7962be277ce34460eb837c561257569be3cb28023208dea80dd +9583dd991b62ae4bd5f379ccd3cec72cfae1c08137ddfbacc659a9641e7d5a82083de60005f74fc807bd2acd218d0789 +ae73bc32e9ff5926e1e06c07a3963080881b976c9875777f8e4cf96af91bf41bdbed4bd77e91253b8ec3c15b4a6d3977 +b2a3ea90aa398717ba7d8c46743e4c487b63c5abb140555d8d20e5115df2f70d3c84a2cb9a5e0536b2d93d24f271b38d +91d119d3bf1d34cd839eb69c6de998b78482ab66bc93fa97e31fb9592f36cdfcd673f52366f8c8e8877e313b92d4a2ad +a1907e20120902cf68912cc3046f8806cabbd7673e80218814cb088e080dd93b5dccba395b13e0025f5755c183276c3a +b2e2011df72504065ec4c12cbc2137b95cfcd1355509671feb7b00dbf7f8d500476a49754cb7fb9219cb5cba7c8afe01 +a48589fb7a74a3dfd782cb3503e6294a81dbb6adb412887569f9408e9079371edbd9822388e0b7ec8d3297ba270f53ef +a203909bfe196ac65ed3e6800d577b6ca5c8fe1d40f7f925a43852951e38883f2ffd250a9e16fab3ed3dc1249650247b +997ac293722a8b98f7e819f8e6c2d4c5bd1103b82d489d8b8aabeb905e95450b9b75bd61442cf68cc957212ec1c55617 +9895a3de62395c33509b153b7820bd94fd2b011f0cac135fcf916482f1eda272ecc79f83a61837e99c3a3c4ab2c5c2a2 +98c2ece4d49a64ec8e06407a0585081003bcef88af35210e22eab91169f8f0c044d611494b755e5bd915804b1d857747 +8bc6dd083b36d076ddf0e0bb1bb87cfd059283ddabb3886f02eb7e27f1f0539b2819527b56b5c13436523c4603ac1d12 +85ab8b7a696333c82dd5e179e12b2e127e67d911de609ff9a03cab95cbeedb1f364aa1f2b5e59353e4ba0d177f996151 +a9478e214afa68c395aa2c7daf8ba1627feb71ad6d8bc7339734cdcdd5a42838e032736c28e6251c808d5a4875ef0d06 +8c53f62cf06a35321c8af3871ee4459768d0745ebf48942b9f464206309f42fc7b2c50f196ae1e43b664f0e2e718a23a +8ba80662f6642d8866e832ec8082a4204ebc993fc304c4b794666856de0407620131a18dc053597bb40a3de0bf8aca22 +8c8fac6b911785d1561a985580c03fb2ebc613ae33e486a92638aa7d4493374118d9a6d9d99121e29c68c3d67ee4e3f3 +90f2c793eee07ad90157040b30558bb3b0164e8ddf856389d6742cf5bd1c712e4c6a8e5678da70a8e9e242ec7864117e +954abed8f6d58896b7f6438c9780236c1c83b02d60a29fa7361559e619e5bc9d67b3646ee39ffafe2b3019bb3357fb50 +b79874f757a33085e1e751544de8fe3afbea92e0234f9c00254c2b36115a16ee46f085f22aa66e0c9177e5106f51b03b +aa148b287cf4f60c64f774282b421aae075f0eaa93a45aab4927750f47e2ef0b811d1846bbb15eeb2f293c80a7612e83 +a588d8825e7b0168d45499dcff6faf0dfe1ba4f090fdc7c06d50344960c0121f10ad109b0b9d13b06ef22de5a04eef87 +8f61ec93d14ebfa9c31731f9ef0fb8907505fedc79378e9a3f65c27bed4d74b41e129c97672ce5f567d897befbceec8c +a008218633f1da10efd01c155f7ed739faec902da6dc48e9f19ccbc8d32bb318d71806285cf2003de2c907bbdd4f8b22 +88ad82c66f7085632d7e348d69da84200c53594553acf5432b50dd1e87f410c802dfea91be3cf804e3117ce13103f23e +8498dba17de0318af227a3f9ed86df37a5c33f9a538be9823f8dce4efc3579e8296cb3b7200cee7c5e0bfd9da23a4b69 +b3c0342231dffe4c9bc7d9265597bc8cc4a82e2980ac6d1407108db5b00349dc91d5116fab51cf2802d58f05f653861d +b3f2730455f9bf5a058598bc60f47740117ba51f6a767e1134516a4e42338b513f377027acf8825da5c4d047a62984fd +816360914fbc9d8b865157bfab07aeb7b90bb5a7c5cd64847b1c3184a52266cd3f8f8f3ef99309ba2edc4622304bacc0 +8fd21b2315b44a52d60b39ebc45970a47b9495f42b88217ae057bebcd3ea0e2476c0c3d13de7f72016ae12ae966a008d +b62014485bc217a0fe892ef1aef0e59604ad5a868face7a93f77a70ba3d7413443fbe7a44552a784d8eae1acb1d1c52b +a905822507e431b35f56724f6c8d2e93b0607ed7a4533073a99cce2b7c1c35367382447073a53036dfdb0d04978ccf2a +81672e39c2b31845142963351de3d9cd04c67c806fdfe77467867463dbbd8a9b0e2400ccc55016e57cbedb02d83a0544 +90919c970ec668de8ec48a2a73bb75cb94f0f8380c79a7909fd8084df61ecd631476ddd474b27103c6817c8f3f260db9 +8fbe37dfb04bf1d3029f8070fd988fc5e4b585e61eab6a8b66caf0ffef979d3ed6a662cd99468ce98ec802e985da5fad +950939aabb90b57a3d667f9820880eb0c4fee5c27fe211ce8ecd34663c21b5543c810b3676111d079ac98644c75ee0ae +b06201ec3c3cfdaf864a66af128effee8ec42d25f1e173c1edf9207979fa52c871757000c591d71a9b6cde40f5001a06 +a79054e8febd0450c96ac7a5fd6bf419c4b17a5926f3bc23a8616f0cfbc2849d97470174cd1baa7c739b12615334b6b7 +81c7391b2a1844ed26a84f054b5f03865b442b7a8d614cd44805b5705fe6a356ac182b66a3c8d415132e389efac5f6b2 +825af1563d0fe53925ec9ac0df65d8211b333474e59359bf1bde8861eecd03f2ac74534d34b7e61031227c2fa7a74e1e +b60dd9bf036f1825295cd2014ef1f6d520cf729b4d6cee0b42cb871b60ae539b27c83aa3f96ee3d490ec27ce7e915115 +89ca43d5b7f3622b42df7887572297a7f52d5204d85e2e1ac6e5d7aa7f8aaea5e3a07280477d910db025d17cd2e7373b +b93a2bc9b1b597f0e514fde76ce5bfb6e61eee39cbf1971ea6db38c3ecb055e7913ec8cd07fb0b0ffae3ca345883101c +8d45546bc30266b20c6c59fc4339eb633155aa58f115a8f976d13789eaae20a95b064fedead247c46665cc13ba856663 +aa8eacfe00e8a4d9815de3f7619d9c420629ada6489933ca66a571bf6c044d08b391e0d9eec7d1cbebe8def1e7523f1e +b32fefc59a0d0319ccb1946b351ed70445d78d9fbb536fa710d3162b9659f10288f12d82b32ecc026d55f16cbad55441 +99c7c45c34044c056b24e8f57123ba5e2c2c039e9f038a66899362840cffe021733e078866a8708504cdc35816cb335d +80def162c134540d5ec071b25ccc3eef4efe158be453af41a310b7916c49ec0ce06bb43dfee96b6d77339e11587de448 +b5f2fa4f68f6a26bcb70d8eab62ad73509c08ee7aa622a14b3d16973ffff508ce6f1aff9ced77b8dcfef7319245cf2de +b4d0436019e779c789464716e1741c189e8945dab7f3072720bd9aa89882fa5b085a1755c48da21541f3cd70a41b0a71 +931e798ef672e1472f4f84c727a101e70d77b3a9f0c0803a5220958d6bbeb8aeeb56c769ab472a3d6451249a13a3f56e +918c10a84de268aa8f1ba24b38fe55ff907be07b1e86b4a4adbf305c0d705c1cf5f65ce99e03e11676cedc89f1a4f331 +8e55a8413b823715ccd92daee357cedd797e69a0e78b6fcdacb7318646b9903dfe05e5501f47b3c52e74055b9eb619a4 +8b329bb63e6c985d7d072dff4680b3f8b1217ed20543277386bd30ec25240d9dc378837dcd5cf4fd9548658635f4c537 +8c2be5386052b22986b33dbc63c5afacb6d0095495564ba4aa28fc8c880a3c78242fb083248d788ed928deb1e30a82c2 +83a2b7bdfcbd25d6b059f27218e009ecb5ecc4da68ead885e00216411d8222062ca42f21c4d9cfa19c31522080af677b +9620334d2633e85646b2e2fc48dc6c3f09c64ef1706ed78a3bb6ce1f6b274a727364df71e97531dfdcb392f70f27f536 +b6c84970ec04545121ec3b79376f4e45053c97e8bf2b11922cc2490a429c38735466097ecb81cc9d9692c74d2fb8abc8 +8e55d707dcf265c5ae29a32c27ce66f200fddb724faa5bbf145ef42280ef645fa2f0cc3cfe2db8599b26c83b91e077df +b910b96b763966402bbebd68a32c15a225ec21e1357fa298478c5981a4310e556103fef0c73bd8903e11c4ed2c065647 +a8fd933a0e9fe8c459809bd93b8ce153e2af55df94b61a1490736b19c89469954da8b72dbd072d798fc06fc3d7a3d60a +811b279c113828e114fd82c2070caa7eb089a46c8cabf865f9c77354a77ebebe0c4c6400dda0e66dd017cfc44d76851d +8ed03e91c331afb3ad6e42767e1b3e8d3a35fb831805ff1b5fd3e91878e04027ff5af1165a3ac295f1578faf2c83b581 +95bf53683d64a0621bf1ca6ee17446783f6c535b7a54d6ea57723487a215759a54f886597a55dfdd560424e368ab2759 +a9bea378768fb1d7ba365a16531c51fc1975f1c73caf2a0891da28509805fa84e2a8db7c6ccfbc620e9002317abf174c +b8308250891015deaf851c4e5a4cf4704d104f94064418488d7e3076d49f36240dcf6fdcf83f45fe8a1d97fb02e3db59 +adcda6b63da21f4074f142f8e7f3a2274f624c733e3a4001054a1809711529c61356aa087f73aed877a58ccb41d38d12 +b80e7869239ae26d1da2e6683f064d1dc93cf4a2b66e9439b3ad9b25324e969bf98014760d29e6b8de7ff152ef498d0f +8e9bf968911df3bb5e3a7655e9d8143e91ee87f14464d7ba9c86e1e31b03ab31b91eda121281b79cd974d9ed2657e33e +9007277e8335a43e6bc3c2f5f98c0ba7024a679b7156aeefe964f1a962e5ac82154ac39d1ffbad85a8f2440f3c1e354b +9422b9d670e997b7c919a429499f38e863c69c6a4d2bb28d85e36ae0895c620f68b71e39eba785e3d39a45be91507757 +926094e01132938000d82dd9a571fef5ef104cd25b4015a25e3442af0329e585aaad5472f0e7a69899ba2d6f734b40aa +95552d8057f7e32c24d69e4d6c51c98403f198a20c5be8826254d19cab2f84d5758e2220cea7e38b7c8a7a23178fd564 +8abcf8dcc8488bcc9ab23c51b9e7a0d91dfc7bebe88b7ed370ee68eceba643e939c5eae66a4aa5fe85120751780e351c +a91bf8198f029e6a4cf6f0cc39b629e9aeff1c77b8739e1d5c73d8c1d3fb5c8f6f23e27b435bf10b5b4ec1cf6a7249ed +b932d87ee3a4b81341511f90fe5aa36c571e8b914f25abcc33dd40ca67a3f6444fe9362c1434744e4af18d6e045c54a3 +a8e960c2be9b1d805d387b3ebe2134d421a65f1fd4c1b4cccdce78f9926f139eea78e3afb449b3d6dd19b5d16ace48fe +a7e2f57cce509fe66707eaba9b4c042c1be93fd6034a9b51d1d30c45c4363eac79d54663d525c9873ab0eec0b1cc4ed3 +aa162a31c2078f4b080199debf24494a8dfdfb9d8fc85b198a861b12a629c73128c55a883e4c2de3dfed6e0e1b83eeab +b5a4d075433eaf4115717a84b4dc37f843d44bba0bf820c92ecdedd5afb61be60f7708c8a151a678d9d5c0ae531bffb7 +b56ab96f7a463c0079e05dc766f3a6a31cae5c5044947734ebe0a26e01367c6763cc8de6c2ee2f3b8218f05bef217474 +b60792ac506b901065a8bc0180a86e028fe34b62ceae1ad640c759538ebf3a2ad9c8c927d662deed6f489ff3ff7813c4 +8c8c2cdf075504d12d441a58542e1f8e4bdf92b3ee4775e836b2734c5ec1e3df919b931386417d04489a1dca806c87d2 +8ed78e91e5c4a68894cefc2f7fa71f02e5e12d40f1bb74332139bc7be4d92c24e07d5ece0e82150ed474aa1337af4c18 +87119c22ff8aa31150bde537d863cad661cc5159b12f084cc319224c533f0deb28526ed8568d00a1441e7d8bb4f05673 +83a60ba5a9cccf22cebadf7318b706c9f29abd25db0e2fc1c802965351b53cbf316df72ee3e9b2d3ae7f3c4494cfdff1 +b73b6a9fdd3e7463fbdaabc9a885b7c82201ad867d1bced1c2484300a01cbbb3f1e21afa95d4c7cbb6cb983416b63b90 +b1d89ad16981ff9217708090d4017662d8838f21f3a3296cffe14590b533905fa06a20e40dd497bd291fa4dfd1bfc511 +8abde560083e071a402e3c7bf31930f537f67d2a7bbc734a7480b1b760aa712ebd1cbcb65b00e11e384e980222fe14a9 +89c731d8f31afea8bdc9c32527bdca257f2a840764d40f6e49403b8e75ae51017d505ea4fff91bf28b6f3a1bc65b8bbc +80e9ac8e077e86ad050ee73dfce268a69564ff1b8419e9c236d981fe7a5f0c2bc756e8603ec604b3b9e36da8fe10a49c +b4f1eea0f304898b1323c6382732e6f40e556bfc68af9ce73f6d54e92f5f23cc4f78eb3f43d578d81e7627fb40f092b3 +a0e3a8d1348f8f153e08ac4839232d75d1d6e81b5de184ec4724f8213baf98d3fe739a96f6b39d79a053b628c3a09981 +a6915ba0b52ffe4a381bbb8ff3791d9d3b848bf89b3bacbb2a7d2e5ae21f1353cdc304b3cb6e82416f7e604035c27d7e +b2c4c9cdfdd2fc9a340ba3ade9423344b9f429e8c7e20a8abbf26400376e312f3ae35d1c456be99dfb5c02fc8a36cbfa +9657d57ca0641825a0aa5687f3f87659d893f33aee819bafa5b1ca1db554811c1c844f971e278606e3a2f096defdc67c +a4ad24d0a557704ada24d8e27a15604bca28679e260b2c69ccc8e6cae5499866724b700605a90df7dfb35130756939b9 +b18d9ea6682f73a1f99a9a4fc98c38fcda02c1a18e8c5fc080cf935a2ac877dc5223fca273dcde190b906178d0fd05bc +8ea5fefad0799c885f50ff10d94bd0af5b99b0a446cd1f367ae5ff529cc47e09f3018115f3c0ccac2fa05bb65b84945e +92450d52e6c7d13ebfcdf5674d6761bbae2fc5aabc865d35d031b588c383e0a64cf69a73dc93948632e2b98f74a5ed86 +a356f171a98df4ec5a96d556eaccc6ad34b4238aafcf0e94ece27cdbb491749fc9692e78b84dfe80bdef2914079d34b5 +b918703a4d3507d266414712ba8eb7ad17da07cc5f952b5c62ef130cc6ed1ae3bf01237fc8848c179725bdddd465b301 +ad2b0554570bfc9d97510cf59bc38e10ca54a93649c30ac9919bd0255e43bf525ab11b74f78a51ac0973cd0c5a5dcb54 +a7ecaf4b631d179d32ac1632390d95196a0035e00da6c0e6e13b5c09ae44b15ae6c21538b5a31b73bc5f650ecd979b59 +a37704eb4d728df2a367e59fcb6c26023136230e37f3b8a2f3ceeb1467f5cd30186fc0116f98b64a8146fd2c5903e8d9 +b09373ce92314678299ae10ec1f93c702911beb4115c6b5ba6efbcab9c7afb599f59793912df70a98868bce6545a33dd +b52a878a1393094fd2b93f2d1eccabf2830ab10800ba4cc24dcc7849cd0978733263aef2fcb766a7cb575a7a99383db8 +8dac097e006fda4fb9d6d7ae52adabd9448ebc8d5bd5b38ac0c4ed38ceb510763174f7adfb0b473c38e52147ccab4239 +86b19c41efb949937d74a7875549ee5e997f9fdac7f7198085afda233cf74341a38d0ca3767c76cd35f875b89a35f78c +99f0d927e5ad25cd134f1c70b72631cc6b5cb4ddb86c0642b900464e33d971213a5239dddaf71f7a42f2d6d02a12dcc6 +8355c38806c335d747d4e97f0083fb96585677da18b409a85175ec35dc3f74671817b34203eb18c2f729717ce083ede8 +abb3603adb061a036eae0afa5f23d79c3b62442e0e3bcdeef896f88995585c1105cd3065410368456a4d36b5b0485a83 +9051c5c0011784885187d04749f774b9b4f6bc594b0e4e18226de79dedc4d7aefa3529c3d2c728e180f96f3e204d578b +91888213e7d321d0bfac884edbd5cb756b280753bb5f8bc6acfc208f525757beca24bdf86fc68d3d8736ef176a960b49 +91258bd7ce6e3b7516fe2f5391a368d826da299e0e99b1f82eaa44b62b110ab696adc92debab8ba098a52f38dfb3c5d8 +96e3907340dffa9da3602d3b94bacff7e1bb8649edd3b9bbd06e1bc6781e78f91ababab12c0b9be7c66dfedc7001b66e +9513555688fcfb12ba63952ab36a67b36affdd71f7b843e8eb99ccbd45421698024608233efbdc905eaeb26b334b33af +9913ca9bcf11eeb408da02e4317c5ca0010fb2f4490b282ddb758001c08b438c3b35351a8cbe10b7fffc1293ccd22d4b +85dc2471860ebca88e5a2766161fdd77f926d2a34825d1134a30418f91a741759668e32fd1e37c415d07ab5824338e8a +8b128917e828a0b5eb6fa8ed72b52fae2dfaf74febee69a2e2f87e8df702f0c5bc0fb620c8d1d2a07f35a15ec9c0f5a8 +964c39e7840c130b01bb481ae7bfc92682b0f124c9c383f9dbf3027f2249151925f4faf36905af476a54778d69da3f48 +80671ece658cf850e522d46d25678f934ce6df043f25f8707235125765d40c2eaaf39eda6092f75039b22cb58bf2c29d +ad4bb0e79fdaa340b1347a46b0f64e801c72a89770dda0a6e4bfd35f2df5146fce9934e4baecb1c2671077c771eb8089 +80b3bd3adc6cf198fcd997f8867d2839a2eb28f57390352ec423b8a14cc1f2ab21c6e286505d6a21fb134dcd8d8f11cf +a26d46a6b8a75748895a1d599e7fd120d896340e79813167a400b2fe463452532a4cab419074663fe1d29fa716b76a33 +82b1f3a8a1df29207d7ff020809113ab06080a7f0c631f76ad33f47cdfb6a567143144df97b4ed7f676d929195b04bba +ad96633a3744648ff0a2e4491e8219c9c6ba6e655cb058c36320a8f72cd5f72c00bddf97083d07650ea9ddc005fc1ff4 +91d0783788626c91662359dc3ff36a8bcc6831e3f4114f85c99910256b1d8f88a8612f53c7c417d55581dea486f38926 +84edd9e87ff3d193ebb25f43474c33fe502a1e2100fd3f93fda6520f5e42214cc12e9f8045f99aa2423a0ee35e671854 +b55e06a4b1fc3ff9a5520e0b7c8b5ac11b28385cce78d91ce93b82f1bd7f7afdd4195d0c13a76e80d0ed5a4f12325fa7 +b0b15c7ddede2b81d9c835ecaa887650622e75d0d85f81b8bbec7ef24e9a31a9c9e3de1f382d8c76d878d1b01373f6c8 +b1adb47c20f29784116b80f3670182d01b17612d5d91bd6502b0dcecdcf072541f582aafc5e7dd9a765cad52151684f4 +8efd1018df9c9e9814a9c48f68c168551b999914a6719229f0c5bf0f20a288a2f5ba4a48ba966c5bffb0fbd346a4fcc6 +b34ea2bd3269a4ddb2fbf2514401d2712fc46c22642f3557e3b9c7acbce9b454dcf789573ede9aa14f39605fdd03f8c4 +a9e1428ce24eacfc460aec2e787c053327ba612f50d93510d58b2cb0f13291ca3d16358325ab3e86693fe686e4f526f7 +91eac7361af4c66f725c153da665a3c55aca9ae73ead84ca2662cf736fe6a348a301be1954723206dda4a2120202954b +a6f02db89739c686407825fa7e84000ceedb9bd943e8a0908fef6f0d35dbc33c336072ba65e33e15ecfcd5714d01c2f0 +a25666faa12e843a80365c0fef7d328a480c6e3cb7f224763c11d8cbabd0e7e91a5b647585ee905cc036afca14842bae +b4348576439cd2e48c01cb9cded7cc4a0ea364ab936dd679ddc7d58b48807e7fab070f2f1ea88595b11af4500849026a +a8c6c731e0d0464ef7e4fc1b049065eb4ce100c01e1a376365c636a0b23851022bf55805963bc15eb57434a837e81167 +b0952937b154e3a4c206f96cd96c76ba37624956b0e4d43470bdd97b4af878326b589e3eaee82fc192437123096799a2 +97d07ec31ecc9923192e48d37df2cf08750050fb452dcfbdb350fbc43e146bae3590c5b732b31ebfa1ce5d884ad5ad57 +a69359aebbfe4cbc4d39d178150039fbf284cbc0edc68a6bd635ee3a1c76569a4a575c907fff691b2a4d82a384c2945f +b321c2c0f6b5902ee9056cce7404d858da9a573d27348c1a6bfea29b2746f2aee7abcb6192504e5a583b0caeaba117d7 +a74e738aa6eb4eea58855ae6f422af22812fb388c83aacca5bd5fa4a88d4c01463174a229aea2830c348dd9ab9307854 +94306a3b106bc1644346bc45c05cdc8287811d5c86cad691bde0c65d6a686eb9c0ce79ad91baa4547e5d058ae8bf7310 +b64140fd77a07633e4ca8d60786452311dcdb8ce7095ba51dad8486f57c3bf4e69bced92603f71da992a48ad817ab275 +affe7f4310f1dc68e5e3cd640bedf864f51bfb46bb752063bfc18e95930021f784e509261ff9c560f53000c361b142d1 +b0d2fee222c6f963ba3385547f921a48964da031d737892604f8f2677d4905dbf615046db57eae6c6dd756709ae6932a +81700c66aad7c2e51168e028b0fe086dea75d3b17d93a4dc1f47a6a0f025df0bae1c8c997901837ad859a84197e7bb00 +aa4ac5fdd602f8b79cace18690e67bad557a93d00c0e295074185e8c6b4059a65495d9971685de2fc01d2171ac8b706a +a8becb3a64fdf35d65d2857898dcf8053b5057a73ab8c5bb5324af1a8015cff47efb85dc3eae7364cd5c850b7962bedf +b72ea09bd0b72f8cde3466f359ea69b194ede93dced534efba1b9ebc6f3bd53942fe2965e992e82edb6050cac4ed88dd +85bb8dd7eef023a251fb6f220af54687747f4c91983ff728163c4618ffac40ee6edc29a0aa6d455276bbe017f63757c2 +85a485254a11b4c4a943d9ec509c0dd1cbfc0ff5273a00cf5c9f0babec973efb15348e5d9451b548293d778e3a2b62a5 +b109f3ac809391e772b589c196b013db69a9b2b10ac3898feb70b986973731f30722b573cd0c9324158ec20416825385 +8a4eb579a840d438bed008644f373ea9ba2f28470d50cf1d70af38ba0e17326c948527b1719dd1bd9ac656ebd5aedd10 +a52e9d66ead5ee1e02ce6108e4ded790d8ec83164a0fa275ab1f89a32200726c8e988d66df131df9e62dd80203c13dce +b541cee9febf15d252475507e11d65c4b7819c26cf6d90352f5e8a8f5c63e254eddf22df0c35a7be5b244233e8e4ee5e +8153c297772adf4603c39349142f98cc15baeccaeae10c3230ee87d62255f6814d88d6ed208c368d2c02332426589748 +970dc9782f1828474e9fab7dcdec19aa106725465a5844caed948eef5c9e48199c1b6bc1a637ed7864116927e84bc65a +a975a920624967f4ecc77ea5d9869c434caa64c330024194615a8d0640c5d4d4fb139ea11a0c73a5c6ae6dd3fbf0ab5d +811f0f9e0c12acfb4b9dca359eaef3bed18083bad96188befc036ad3143b121fff4777ca6dc70a835bbc4921bd25f5ff +82341c6ebdb97c8b72910da95c7eebccd1308b6a92999886aab552f0642882d5c7cc60931577d200efd6066530c998dd +860f7162c2f5fd1c0953c6ce75bd8c52eaa48032b914410681b8cc05e00b64130d1f96ec5a52df66a04c78a9f9f42981 +8a578e674875571fe1a0459843495a5ee1d9fb6cd684b244feb9488f999a46f43363938cd0542879ea18ed14fba10a6e +8df217aba4da6781f0f5139aced472025523ed6e17e504511c04b677ca8197488e237d8bb5dff7b6b3898cd5a6393dd5 +b2c9230ad35d7b471d3aee6f771517cf3145ad26200bd6fe9c7cf28120e2945fed402e212d2330a692f97bb9ac4dcf12 +b78b89e29e8b782603b222cc8724eeb83b2d9d56bc02f59a3c899ab76429dc721358b07dcdaf422f59520b7e7ab4fb55 +82682a5617843c4ac8d4efb4c3ce715c76c1da2c3bab1ede387db503f3489c1bfdfc07d9231d96f955df84fd225bc81b +b0f53725cc610e78b8e8a4e6823a2ffe44dd15a9a5bc8151ab7a3787ddd97e1d7f2f0e6efd2876e5f96417157143e3bf +92c5a93233085e2b244519078770c7192af62f3562113abc8902f9d72591eacf52bd15ce78653ab9170d5067606287f8 +a43ef97dcd9b6ad288846bf31fccf78df72f94bc7ad768baf5bf0d5dfa27bd74ffcc6b6c6ed1d1f09e09be3afa5eaedf +817d43bd684a261fb30f709f7926cc4e1a31fd3a1a5e7e53ba4d664856827b340d7867e23d55617ab3514c8a26a7040d +a599e22d3286b32fafaaf79bd5b0c5b72f6bf266ec68948478f055391336d756b58f9afea0167b961fd94234989f0f02 +b70db7d8e8356df2e2070f8d658e560081442f3f3b95e20f4bf30106835d76161101163659d5d12cc0f335fb042dc66e +b8f725b70c957aa3cd6b4bef0d9647393f7c9e0b7343e92439372f0e9aa3ceddd0cb9c30be331742b87c53f2eb030593 +b2fb5e7762f26036e7e966f4454f886758804d1f4c2da17f3d13b0b67ca337f1fd89fd3cc798b07da6e05e8582c9537b +a377f944dccc300921e238ed67989872338137fe57f04cb5a913c787842e08b8a1adcfb4d2200abdc911fc1c766a7092 +b82e98a606071c2a33f2ad44e7ace6d9471d5434500de8307b5d4e0083e3a5cbc67f0609ca8055f0ea0ee7501b9ed916 +8e58f9a04d33a41ace4944615041662dc35057e645f63e127cf0d70f96ac307d33a62ce98f164d6eed8536c1a747dcbe +b5b11388071ffbf57ac47fc195736613b964ebb91cc8e2c17b32646f91d64ea506282b881897fca96c317364d3290de2 +a40ee9b7551133856cfb3904837f9949a9558e59a418898affb78adf1500fd6ef6328fc4422161909aea2c79ad08c14b +81f9eb4ef28aacdb43e11dfc9aa92ba990be4d3c14b484fa677edad3a3fbfeaa859a7f9322b5e95818240d7326215abf +84939b2b6bc859437d1a7a8d6ec9a357c6b716c4b4cc22abc274af872655940cfc72c99f5d0283d90e05191fcdb1c232 +b78a5b74a90a805410b6225fb9576d6d73752520f25cc3fd1edf8ea9f6559d3080f9acaa2246809b6a66879cd2ae446b +8d0a92baa88bf38dce5385ccf15d345b28e2e5d0a2d469e689353d80eaed8e8408933816d70ad752f226c59a0d5b5f0c +a7e15f8a8c1655b7b346c9488cff278c793505379b781b31b273b4bf09b3bdfca1c8ab2334746075d636b2e05859f215 +b70daf14f2adce03c7b92d6aa181f0c507a80a37493d8dd12419d5ed5f943a98099fefb46ac827d6e4efb9b8233c99d6 +8c2480814661744d116fba7355bc6b1914975e44cf0e976d50b6a20092bb1c636b7b44ed3fe8d63b5555ffc89fa759d6 +a6059528a4fed36abb74ab992b22a4f9bf1d05c5de2bfe6837b9af1adfed98bc37ed7481b5a99675d432743021fcfdb3 +b7e19f1b25bc159e5a769811e773c3a8ffe8be8ac77ed0b711540915e5c6e7bafdb407cf9b85c551f67fd621ce8142a5 +a2f66d4f7d16ed3e7ef5fc90b42676c61a98ff18bd26ccce91de03b6a0130c1db17a6bc57be135e410a76d2255b15813 +a139c916927dc3d3fb83598da9217ca64f0ae127215332e9a7ed82be923b89a801c44580d5617297175f9dafb1c4eaf3 +af08e1e1b04ec95366a12d99c80a9a9ac40ac984a575dd0230cdf4eb346a7686da55ef0a276f3356f814af31f9cbf1aa +98840aefe287369221c0721cd7c1b15b1d670c3cbbfda191cdb5434bcad757e59c30ec82b2d8c75947405888d44da435 +b7c61c8d42daf2e278a12d8f6eed76090b71c82275f8b33504aba75d95103840e8acd083e97a5a5aa79897876a68940d +a0264048d2a2061d32eee4f661957ff351e78436bf49ef973c059612874ce9c91970869d011dc13a5b7c754476880a68 +897199a4d8db8aa2db5d9be3d4f4312e41fa0739eb06c62e2e046c4b9be829a447e5d47227e2d96195d3b7b66eb59da6 +b512a9082881f5dc90b02f8bc4f38b133348c2e933813852f6a8e7d8c270c9ce68a5524af7d1d3123e53b2d02a53d465 +80b332469254a96f53c95ec79bb5a8bb1c387d40e58b73d72f84384c696ba0d3c81d6ac90be2979c364c44294e90432e +ab680c2e547ea5cbf95bf813020beb461d50ee4341dea944eb48f6a8584d35682d20186e3b190b849a1ba25625a7f499 +9070581993a0531d6be372d370c2e4ab2ee53f30e04a75ae61ea0fc2c320914506c4d2d4b4487c1f8fa88356fc45c895 +8424303dad6b4051ab633ad27ee51783b2ead61c5a6dae1eb3ed72fc1f36e2a9b1f315504a4bd90f9664091f2f403d4c +82225611eee626556553b9316dab4043aff241a81826a33aebd9864a91e299b765ba1fb43eea2c2047e6b75b6d7fe3de +8a3fb221c616ad55c352dd5e0c09ee892022013d6965aef40d4f277a42e9fa01226fe973cb99aaf6ffe4f4f348fb54d1 +b07c07679aa51713e8a7d7bc304dc15ed5664b66bd371877023f3b110b3927e09e259ef22895c4001421a69c6c013cc6 +83556c76bdac0dd8db6da231b863c335be076e7299802eebc259e0818c369f933a4a4b18e2df8ca07e82f60767b462e0 +a516f659b7915d2f7cd0f0f5ea2491b15f0c84dcb191e7671b28adf7cf14a56d42cfc0da94b3c269b45c535f6eeded49 +80d7cc6f26066f753041b17ff1bd27f6d4b5603a43729d33d596e21a67356db84ca9710158089def425f6afaf3207f9e +b802a47f9009dbd48851209ea1e2739020e717f0ae80671d9f97a0e43de923273f66b7fcc136a064c8467372a5b02d28 +ac92fec1864a8a911633f377df87aab56713876316d48240fefeee49ab97f7406c22e70f4938b5912c5c4e766146b7a5 +89224225b9835d04428b0a74edbff53dee2be285ddd1e5a3a8c37307c0500578155f0c4052e4bc8be04c56862fac099d +b1d3c8492fbf22ea60732745edd3b0163ba5a20d1a3315e3773f2540ee38cf308d42ec72cbb3e3dcea457d1d132c3904 +8bd00e38ec30ee6c44a0e5b222f1f737c9ed2a4bb9225f1741d6334df966318c8a0fd2fbb109557fe8c9479694b8d8dc +a930ce5454efc0b247dc148aff869963fc5c240241d5590415cbd36634801a04d3873d93635911bb9c0c42ecb005cc63 +b83d4f80e9e0fa47b42175df74935ba8aad2e559b80e84478ab1685bc3eb65d51b93e5738d5ca968cc055ca0c552a03c +b3ae21258f98051f13af3878b8103bc541fe6f20b1c3f8fb4689ddb8800b3c25cca9b55f0a4104bdf15dc4d5844abb8c +831ef8684c1cd446c58c59d0152aeade5cc305bca6aa296b92162615f052ba280fe289edd62fda6d9f0667c186445f52 +97bf9659b14f133885916733b7d4ac7e215495953caba970fa259f7bf6b79e661090ec8d79e1c9ce8dfb17e8552f93af +84d5a89cc2332baaaf3d19627a65f4b107f8dd9228a1434b327732f59883bb54fb8ce60d6acd026ed4b0e94e545d1c33 +8e66cb743f95ca5486400b0d89d02e20b98044be1e3a12983ff9fe086179e5a0ebf4dcd5098703191552e9aa660a6de5 +87b4cfb35bacec805f8148786788db84eb8f4bcecdd0570ecb592c705450ce1a90b6d183d37ef58780ede3995be67497 +a72a4fece5478011973afa543f6d8a8ea06a64b241cf7d8bd81fa3740ac2a4cf10e5120abcc1c1101f94da89507a40ca +89dc6001a96adcd2679916f43dd19ea00508c8d5dd6b0090eab7982fd2f3571b62f3029588a0649e73f49124525407ea +8ca75edf1259599e873530eff6151c822a4018e71a340534219ef8641cb6683215891df41d4e3c0ca2560e57a7aa913e +9282d32f868e5ee6f7fc229dda5b94b603476de30cec0a44a30edf396b52dc0ebd472b8f726d4b67d76179fecc1666a1 +afa24704223707db89690bcf9761f07a093f6009ca9fc945e0a8801fc29f9f51292bf95243e466fe736088af36c55ca6 +b51332508ddd9a2610edd2b0ad120272ca342e96c28baae37a2c4f07e689303a46c237712d07e446b1d67c75aa8ce32f +9219249f3799dfa4eb4770ee323f821e559e7406bb11b1f1889286221b22c8b40ccacbd9ac50ea3fa9ed754860bc24f0 +993515270c128ede64fe6f06755259105d0ec74947b7eb05924a375fa5c6d14822f3d7d41dd04fa5df8aa2aa205a1dec +a83be4c2511bae430034ab15b194ac719d7b7041f9c0e321317f513a97db39e97b9ee1df92a1962f265b7a3e98cdd753 +8ac7feaecd26f7b99fda3ed0b8a08bd6dd33ed5ba687c913ec0ffc64bbbefcda6f265072add4d944f2005634601ce68b +b4e3ac6b09299db9e1a469f3a0b2d8d724ee47a417a517bebc4c2ac3efc5cde086b57b9aa4efccdef2bcf8f456d973f6 +9262a24a84fb7b2a84d700f98dcf3fefab8b47293778c20bfc356860cb84e0bf102bae9facd9986d92d1762e0a955836 +97be2041c42bd25e5eb519279163b0857f8bef627492c27b1182f8bf0033769246be5886422cbd2409c08a2615352465 +b0b87d059a00e3effa2e5e4925da913b245785f2932ac3ed364ad19a064d3561b8aa6afea22c951316074f0df179af36 +891644b7b3321b06a2a40cd96c2b8b29d81cde5b48546483fdda439000982a9cbf1f6333fb6c089d39da6492cdfaefe9 +8da9149b7f4783a24240b7b9c7e6df4abf8d699d3834e31ee591489bf4744141ab199c173db64397c1f9bd5f9c862ca1 +8ad7f9fb2742654aa2964fd468e7645436cefd1308b064fd63fdf0d3adb4caf6cfe5426354f6cc284f208b03d6b2d918 +8435e4668f7aeb027100d21e4e0b6ee22b401d21966a3736b95610de86c7e2f2c9ee5d0f901353675eee5ff458dad69e +9010895f045538bd11b47bb8996f27198c8d6cffd3220569e6b7407f68f35c47d1efdbcecbf9b5e241c3c2879a4f6936 +92a9aa443b5ee7bf13b6f43f2d8d8db7f6f33fd4073a606ec5772421a55f464831419726130dd97829a7d4bfeb1ab078 +843f3266560be6dcbe0258c3c7d7e332330e10630c069892954290288eda301e247f479505a8a1bf7e59c99ccafd104f +915bd1dad808f8a568725bd243f80b5476a2999d0ef60ea3ef6e754155bc4121b2b879d01570725b510c5a3f09cd83ef +97250d781815b1825be192714884630e9f564b9bd737d55b8ac79ab48d0fb3ca53bd21ead7b2fa82a05f24083f25645d +81e2d52333391ff2faab39611689a62d6ead77039e8703f4e012d53eea17a4d46f2e3342e44b6edbe73a542b461bda45 +89c9f9fd5f638156b018831c1bb70c91215f4a2f5a73c84b1208bdf6ad652a55df7213336ce12bd910a0e1a726474f95 +92bd02984d090ea7e2f3eb7d36d1e7b9d731b6b047e3cdd4af7cc4ee177415fea7a145205e484b366d84191f06af85c9 +85a86fc61d5d916ccbb219db52953e1495230aaaca63237e9165276405f07ad9644e253ae394f1ccdd231944e7143313 +a2ca5b3fbc9f3530f88c0ed7071ec3d89b272174c366eedb5d15d2b648c65d23c0faa4e92c776357e7c6883a0084d03c +ad171f5badcc99c8ffc9d8b707d792046f86cd0aa478e0e2fbb32fe095f96cd134ca548d1f7713057694dc6b26465315 +96bd15d57da9980870fbadc98c68db76824407dff2700c45b859bb70d98374d4a4ba99e3ed0b0c17f480fe08f16c6b8a +8300bac69ca088c3ff35749b437215e9e35a16393e9dc094f520516ba57a485def7029d30adfc72bca36eeb285c19301 +8a09e20be64f346668fcc7b07fee9c0ea8094c935cbf4f3a4cdbb613d4b936c1edb9256b7c884efb72393d97c0da00e1 +b1f85827ee6f041f93ab174d847a55710824fa131c9ade9561168c3962a25c617475ebc4105eba6e738961a754442bc8 +a131558f92e215969f41b6a57d1e2f424149eea531723821dd4cf8c54325cbe66b002de2c8287de6b41ab4b5c35f060a +81ba492b8956f73557f361a856c6c884ebb300d828287d5699e22e0cfa75c8e77a61616551d0be5178263898c461d6f7 +b2608f44d3c22fac8e13cb59e4ade8b9a98c4eb1ec0959ea400c97eb937ae3f66837e91917057148befade8389af2f6a +a6ff0323b5a18a4becb2cc6b376086b47cb2baffbfd1b0f2229ef2286fb4a34c5cd83a5faed5def7bbad519fcab8a856 +857d879cb9eff22501d883071382832730704bfcc5cd5b07cdce7ab8dc41c565a1eb0e7e4befce8e0e03a4975d3f11ef +a2879a20c0360c516811c490289be7dfbf7dbd41d2f172c9239f99e3d091957e0446854f9d0f753d90384a80feb6fa56 +83518624f33f19f87096a47d7b8e5f2d019b927e935a9021823fac6564c4f2328dcb172e25bb052748191e75ac682bd0 +817ec79132faa4e2950665712b2c503d7fb542aa57b7b36e324f77cda79f8b77bde12314e2df65c5b5296a6bca9bb0b4 +b2abf8fb7c3690816fa133d5b4aa509cd5a6e3257cfeb7513d1408b12371c4d58c44d123ac07360be0d0dd378e5bcf99 +a9fe1e4fb1574c1affac5560939face1af6657f5d6abce08d32fc9d98ef03186dbb2dbb9fd1decd6d8f4e4687afecce9 +89b2f41e51f33c3ca3e44b692e8a6681eb42a7f90b81c9e0a0bc538341df9e2039ee61f26d2ebe9e68df5ed1bccf8cdf +8b35aa7b1d9e2135b35a1d801f6c9f47c08a80e48603f3850b425f64e7fb9860d1adda04f92a1ba22d00dd0a26e781ca +960574978cadedbd4cd9f764bee92f94e08b7af65403de36b21bffc9424bcee845b3b028af2e9e545dd77cf1e69a6a7d +840aa0f34b5b6c39471f54d9e85f1eb946468c4fc01963a9027cd7864df01f73c2e864f1f07aeed4b1b1af72808dfa07 +834464a84a11200e3c60f816044c254a7d9baed64aed45a17325cef7fd62338e0a26da78d199d30ac3411714dc813223 +b4ac6fe2f5059546f4ad9a361426ead33237b6b9030b129bf0122085c85fe4ccb33cf90f5a7f23c5b708a5ac64b487f6 +a12aa9035464795f2a67f3eaba478d5ebc838ed9e997c7dfa241e1ed60a94b367d3f969ccf0ef02028c35215698b309f +ac8d926492ec2bb68c6d8aa9bce49085d3d266f3d5f1f924032b87c42b44e41da7c047eeb01e4618f9d0f123dcaa537d +a5142425825d813ed8ce1849d81aa40b11f1cc3daa89a9f798dd83065c74820b4da6122b3308f528b074531df66e1a5e +87ff55c9f5aae079e7bf24084dd9c6b3bc260727d942d79cbe8dc13341d98525b4ece3ed8169994b56a387642f09134a +88e680f148ef2ecdcfed33b61f9e0224790fddc9069bd6999e9bede1791e761637c0fd60b52990b6c93e6e5429e483ce +94bc20bf5aac6e9f1060d02eacd06c42aeac9a1c5635b15a83985dfb03938ddb4999a822e865635201489c7f75601b29 +849221cab7599f25f0b114df092bd5e8c2430503ae959bef1543a101de0790a78245db6a145e26f40b5f9bcf533219a3 +88b6f2c2e7a7954fad11009d839ce50780921f80292320868d481e38d26aecd80fa607e82219a99532d88cf33b39f562 +b0d82947dc23c0b88b86c321b582c15decdb825ed909a731b42d46bc895009515a3dc646c98dbec7d71b0722df82392e +a2cfb9f7c1a76c8073363c1c3bebe5dc29fa76533caea41046c51ea9bbdc693a121b957cd96be5b6da18704d1865cff7 +8f0ffab9a83355a22683a9d998d1c1089449eb308711eaad4265f05927ec6d0d1ca39217082a0b372e02234e78dbaaad +ab024661e2b2937ad374c8cf2e3669f1dc55558a3a881e9ec4d461f27e0fa92e2bc88230f038bfb051cf2145ca747a07 +b98d9b9ec9eefa56d38cca959ce1aee7b6d4b41a8dbbd34b3f50c0a5f97f84ed2502ded1ce8cdb5895872360d4ba6d61 +851244158b3184a62d2c98d148e2b1102cf0d5500906bbc2deda95acc5e3bc4b4a3344febbb31ce05a56dfee86a74913 +860d9e2cb886bd3620b5d7499d14b415532482569bd45fd76e3e8052d78a73ae4b2b41f139f9cfb136564108cd93c0f3 +8305a052a0fb2bcd41f3aca075c5f7f233bd8f861451d03f3a6e6e31f7d08dd89fe1eb4dd7b238a78b12ddceaad9768c +adb703e4778c7e14fb83541ab00b5fc344108243ec6827c5d9b302ee68321aa569da1718424e6a57979ab7536d5eb43b +b1a754b87b9e21aeb86217ec5b4fadb7535344567f1bd15e88ec12a833fed68e26bfbe03b7709ce24ba6c925ea0a0e07 +8c1e2f6bf820e1653f3b8213e9d959d8649196223c2aab57b7ebda094f4919f88d883bcc6a0cd0be335f26f5a2a9c962 +a082deb9865fe8668e91db0e4fd7fb50fb3fdae3e7bf1217ce0aa6f286a624624cf936d762bb2b6c3fead6826694f846 +a10540ca05fbcccdd0a2a66aabab3b36e9bb525794cbae68bc3dace6116f58942218e9d5e9af10d67b5f6fb6c774fdd4 +b81d22c4ab0ccaf447cc5fc2ff3bd21746617e6773bf43257c0d80331be2e8437b88c9c45309ee46402b38d3d4911caf +84c7c6e924713cab3b149f641dabf63ad5abbc17c1d8ee7802a6630507aa1137f7e034ba1d12ec13f1e31efbab79bf13 +8773b9d236e5fcfa8c32e471b555264692006bf9a869a3c327aed33da22dfbf5780ecea7158904d4d6ac4acfe9789388 +a4c2c1bb7290eb7af2013f7dde78282148593f066b09faf42e61a3fcf81297caa5a00fdbf6b93609c8c5782a0f25341a +a7bfa6e3f273da3dcfac7cb9906bbe9fa4fc2872b184d79813ee273e6cc4d7f37f46164362707a1976f5b6a2c5d7ed1a +8b71502019e4263fcda354a0fd10aaa7da47f4abb7a0c715c7b017e9eea14f2b64009b29b467394668c7ca995adedf82 +ad7460fba7deccc3f9a7d204233de47ce30ffa55e1e164975cdf06480a6108720bc397b93ca8c959df77d44a1e1f05f4 +a5b8df96ccb7b078a3918e74b1b10da21df982538d2c9313f5129b2797c8a6db9ff8707241ff72d3e9d5983397321736 +aa6cfa6386660c01879656da6c4e72497690708bae6c5cd1d088f443cb5bbbe75561d6eec256a72b9728377eb83ef973 +b9699ce7c5c878e44114ab7a598646c6c7616b8e08a9ef8ec291189ef9945c1a538d2abf1ce3b0da0f8eecb303b81b43 +b8d0fd1d278f53c455de92ec4357885fc6648dc5f276930263da7dc885b4a9628a2113e28b66b1e64fd08189427c614f +84ad8d262f6ef5d93e82ff6f4af995148eedf6d8e079124daee9b99f506e2968922eac2c7d4aea741fceb7733f20b2d2 +ab5e30ab54641e3a44450118b8235554e0fcfffdfbe1430ceb3f7ef33325725741995fbbbb0c16f0875aef0f1e0c98ec +80e2cf8bf386ebda46045852751611f2af80eca2e910d9ec5f6e2c7376611534604ceafa639272b3d503b02bd66525a6 +aaac69af8fbb87da1c1b7c1b9e59942887ae839a91f0c1d191c40fe8163d7f1dbe984e4fd33619c73e63abfa7058f1e3 +a6194224ad838ab86e84dc80e9b8abb121ae6c3c7fddc476463d81f14168131e429a9757e18219b3896a667edda2c751 +b68f36aa57aedc7d65752b74761e49127afa65466005a42556230dd608ecc8f5efdb2ce90bb445a8466e1fc780eea8c3 +886c3fa235d6977822846b3d6eccb77f1e2cd8ba3dc04780666cf070cae208b7513dc4525d19a3fb6385cb55f5048e2a +a9801273ef850b99eb28f3dee84ba4c4017c95398730c447efe8c1146b0719f252709d3397ce60509e05da74ed0f373f +a58c2a5dd13e08ffa26a6c5e5eb18bd8f761ab64a711e928e6101512401ef2b1c41f67ba6d0823e16e89395d6b03ebb7 +91318b564ec8b2d8c347ca827d4d3a060272aec585e1acd693b2bafa750565c72fec6a52c73bb3ae964fdaa479700532 +a058db5d76f329c7e6873e80c7b6a088974522390ccaf171896066f0476742fd87a12fe9606c20d80920786a88d42cec +9838e07f9ed8b3fbca701be0ef32a3f90752bbe325aca4eaea5150d99eb2243332745c9e544fd1bb17e7e917202edab9 +85a9ae7dd354f36e73baa5ecf8465d03f0c53b24caf510036b3e796e4764a2bc17f0373013af5b9f1b8973226eb58cd1 +896a4ff4508d069a7da6ef7bed66e1080991daee8b227f3c959b4f47feaf75fd1b9e03d0917b247c2db11e105395d685 +a36d9a6a037bf498dfc0e535f2034e6cd433c7b52e520469811eb2e9f04499a6ce40257d2905300df7d81f38d1bba075 +97aac3c5492aca879b4c06db1834b30b8850a244d29296046a84c637d9580c8521ab4752ef814c96f255a139660d7639 +8552bf592a84ab4b356d01643c90347377ebf1f2b38a8c2e55a3f34537b8c7dcbd62e6776d6c2114f2bc2d4344d1567c +84474ad163db8e590943ccd1dc50b4f444beb8275919b33f53d42cba89831e9d42ce2de52b26f4412e2a0676ce913277 +900799dfaf5eafeb297c7b4f892438bf2a65ce04034d66f8e5cc3836e4eaffe782fba4f4455a0fcab49102a240d1780e +817176415e35ad4a204b9fd5771bae6cc270f6ff050996cec89efbe461b2940ae5dd3c6c7d7e31b1da5285b207efed27 +965e5791c927d47569bc54ec9b4c5305788aecd87a26e402aabeaeccc03480df46f0586ca2e2a9918885cd03332af166 +b96d9ada4b5a04a94807d71726bd557de94fbd44042d7dba40560eebe8658d1da49eba54499360619f3b2c38e8b5ed6a +a07b6d641a43e02e7868f30db4dd5069a2f221b4f122ce9b11eac04abadc4f25f3207f1d2d86c7935b1a3d9992ea9814 +8250d4d8ccac846a4b1a9fa392d9279b5bf2283c8b95d8164c3c0d199fec8849eab85755f2a2a99d584a0407742e3200 +8324cf49f56fc14162f9a9ebda1ebda0388d09d8688f1938aef7dbf9505fc119069efc552f68cc7cd9213f96fda2c6de +a98e6f1e85268dccbe3bf4e92c9f455c58dcb53de1dba3b78589adf2e50e79f8e245f956e0d098eb46f5d3746826c6dd +b103ec12f266b4153d67b54d8fc079357ee342cbe5008adc3e0689a7f788534c4601e60e939731f49e4a1e24fd589f82 +b2d7681e866420413cc98eae67614d383943e3762d5742cb3c57e26157633c20880eea1209feaf68402d5d33dd699708 +99fed0ae4112ec9ed74baac70d202a885aa51cb555a3886b49016744dd4017640dd5dd564998c4d842a9f38f3e004e68 +95c35401314467219c8bfb1ccd1f1eae6ef4fa9e48fbea14f70d5315e67b16c46cd03554471840e4a5030b077d2a3856 +8d029380e0c294400d6b8673a23aed43697cb6460fc1bcf217aca3b47cf240886644ed09521d6a05f6abf56f99722d84 +8ef54d1dc0b84575d3a01ecba8a249739edfd25513714dd4d1941fbde99dbbc392f7eb9fb96690d7052609af23aa57f7 +b8ad2b7af4812417aa8de8f33a26547f84bb84f39501d4b7c484cc8bb54c7e166c849b95240fbe459a4719a6e3bf1651 +9858545de898721d19930d8b360cacc5ce262c8e004867a050f849f7a2f2aba968c28d51f24a9af56aaba23a9ded4349 +94ea5043b70df1db63f9b66b4f9d8082776f721b559f27d37b45e0a84faf47f948d7c4532dfd854a4bac49fb2ec8e69e +a2fd88d7b15e3c2778f6c74470d0f9e1a1f979a4d58bd205361eacadab9973d585a6508e685e640b272d6f8a448eae05 +88defd6bccd55db8ca84e3c8d0fc55a3456b41788f1e209d0aec19c9c70febebf3ae32cacaa1dbbf796d7ddea4b17995 +88b8cde2449d5ee7de2ee2f32e845d27e171a51ef64f1d3d8a5fd7dbb9f898ea70eb7f6410cddfd7b7ae70ea8073cc2e +8e044fff6ec557824866ac76301b6d93ed19b7177aa6baa95046330f5d69b572b59200e3653cf2f2b559455e782e8960 +b5446b4d6741c824885790d2d26258729dc0ba2f469c85a47d38886d933b785a4f38a951d37f3ef4bd5091c03fa3a071 +956c8afa8056e9a71ab2e8be5241ddbb3a8b3cff2110cb0e7389493d9fa45e6c4b769ebef540a952db6dcd8bd55baf64 +925950cae25615246e29d594ebf34fa7d52f78a9867338648158f2131e6eb4dc17e18f9db8a5fdd76d017b3a9798b3a7 +a17ea4b43211ba990270c21562690b3ef154a46c3d669c4674c80bd424cdfa95d8850c8e882b8d06504f929cba3d93af +b315ec723973a138508afc387ef651fd8a8804f93975fc36c2eeb796a304eeb1508518d8703e666a74d14318253f526f +a995742d7433b3f230e622de23cb2d81cac76de54831491cc29768eb4a56da60a5cbd573e1da81fddc359b489a98f85c +adb2e89f0d15294d7118fc06d4fdbd9c51d3ecbcc23c69797e5b8197eea0d6cd1240910cf22fcab4ef1e2dc2dd99da91 +b5ec9f9fcd0b5d176b643df989bb4c4c1c167112373d662fb414875662d1a93160dc0b5cdf540e8a30e5fcbe6cfbbd49 +b1291b53f90aed275df8b540c74a1f9c6f582e16c5df9f5393a453a3e95624ab7552e93d6e2999784e164046e92ef219 +8bc7b7b1a584a12d5ae63d0bbe4dc1b63c9df9c89bdd1095ff4b8e7c822bf8c1994c92310a3644033c7c9689f4b7d2b0 +ad7fc45506a10ca48f991714ecc055cea376c0cbe667f3b40ee8dad8446218835439ae59bccc474cf47b053748ceba6d +b134756828a5f5725c0b95109e09ca450e3834b127163a0aeeb544e63cc0cdcdf66f8ed98c331c7c98758f46af369a84 +94535bf1636be0974b112fcec480ed8eafc529933f3065c40e417e608e43a392206cfde8bb5a87b720263446c90de663 +a4df4f6efbc3701000fb072e5cbed2754b9ef5618386c51ff12f95d281d1b700fea81fc1365f4afc66a7c83bd0228fbf +b0336b3552b721087c7e2194976a9119aee13ebed9f1c3c494353707fffde52d004a712965f460062ec9443620716302 +99a39d1d1ee4283b75fa8c1fa42b6a3836b734be48bdd48050f9b05e48db6354fef509623c6ec8d447d630a9b3352b77 +8e3dc3583d40956f9e784e8bbd0b5e65671d2ff2a7c387b20fcb7da9b969f2d122aaf7f054d450dc611737604548c03a +b5068ec5b7bcb5d8583d51cb25345990f50d1f7b82fe535a6a6b17756355885047916f466ea3ab09eef5516bbf2dda90 +a8284ec1eb1d21e693f31a6c074199ee85d8a8da2167bffab5fe240defa2773971c8437e358a18f7e58d1e2954f57f6f +aa7415639d29081acbaac3e9c6b059d68e8702db3f430b86bb6e220d476fa74841c875e9d471c8a5423c58b6fee3cb54 +8afcfe6f65fa6e07c2cb3e1756c0ef2c589830be96edd50c3c248e3b17f51a4b08ba92ef7eed7991d81667ddfbf2bf7f +83b9c8dec8ca8f9b85f0e36c08c5523cfeafb15a544398e6f93b48b5fc4b15a0bd05c0f176a9c2469664acab8dffb0a8 +82a128a89ea46b9debe5c903b950c0ab30cd7570b979ca911500b5c2cca5c4ee6b2c2fa414b5f28e367f4671ffce60f4 +b79fd0ccd2629a361cd6f9307c02ecd4d1f07e4ee03ce4b542997e055b07a026cbc0ba05fe3da309efc58db2e401a8fe +b190751141093823b4b5324cc26c4f3258552f7893241201f2fca1ae9b1a1d4d4964a9abdde8642cf308ded61ce5ef09 +935fd48b95aa6f9eada0cf9a25a573f0ffe039888b3410788c41d173747bf384c0ec40371bb4383ddcc7d9f2db3d386b +b9affe100d878491ff345636ffd874ce1f27852a92417694afce4163e6a80c78b2f28d78102fd06c3283ef273ad37642 +a877670276d49ec1d16c9f1671e43ade11c0c1a1413755f6b92be9ad56bc283e4bd2ad860367c675d5b32ff567301fc4 +8c660d16464878590761bd1990fd0fc30766e7e49e97b82ec24346937856f43990e45aa8ad37283cb83fa16080d4a818 +ae1412087da5a88f3ccc45b1483096aeb4dcf4f519ff3dbe613f63712f484bdd8b2c98a152a9db54cf1a239ae808f075 +ad83cead97a9c3d26a141604268f8a627a100c3db7e5eefaf55a1787ddc1dd5ffc7544e4947784cb73b90d1729003c8f +97c3140ce435512a509e6ff3150da385fdf9e0883a5dc7cb83d616ec8d0a0014e4e0fa57a4d12c7997cd84e07d49a303 +a353773ff68f1615454555bf658eabdcca40a9c7bced8537ea6fa8d54764fd1f032889e910d2a2a342835513352e2d2e +89e8df0c17a36ffe08149c2ef8b27306d04cdf437135aaeba697abc65e3c8e91bcf1817919a8a826acdbbe7dce79a18a +9928c2da15ac6cb20b15859c22508cfcd452c5643cd22eb84abf5f0a1a694fdefcd8fc329c9b40babc52630743d6b65a +99d837b556f8d13108eef6c26333a183f59383b39958dd807b10590c3d37f62ade6c4a320ca2e70567e0218b0ad5807d +9272da080e4aa18720b634640b01bf1fe506c7c8a89dee8759a53e2ca5cdbbd4a4f3aca54924c46b935362cf1eca066e +b4d39752c882de1c1daf3854202c1d58c2bcf35c882006eb640fe54a97be2655281cdb91c30d1a41c698617c2cf64b01 +8bf827f4a7d47e07374d338a3d8b5c2cc3183015b5a474b64b6086fcf0cdcf4852046c9e34d7917d69caa65a9f80346c +901bffc7db9c9416e06f593a76d14f6d9e5dea1c5f9557bd8c93b9e70aa4782bab3518775c2a5b285739323579f7cf0a +af7e204388568627ca23e517bcf95112ca8afd4c6056b7f2c77c4da4b838c48791191565fd38398587761c8047d11c47 +ab2576b5366e6bd88b347703f9549da7947520d4e9de95d7e49966d98249406ed9270fe69347c7752dad47e42c4ea2f4 +b12e3b228b761dedd99d02928105494ded6d4fea3026d73d65ebffa2e85e2cd75b6d091135d418dd95ac102c22b5ee31 +a20b4a752685d5e31ee7e2353c8a1b9a5265f12bb775004d282a3ecd9deda44831bac1ac5151646428b66909b2a423f5 +91a1d4bc0062a86cc6786a96fd3eb4436d8a4a187b7cbba02190d1cd6ed3c3797d9ae7d6ddc413f1c94a21f62bd04ef5 +977f18da1a5df5cfdd0276f583cfba2b2a0fc6139520664e20068f8dfdde33e29d179abfd722f142448f4677aa47be6c +abc3ece90f0f7b1d80fd917de27ab0d88cca584ef959da520825e54cb5a71336b15f8b348532d08d47a6fa600527ef25 +888d36a2c7cc13a1c1aa338a183a74a1f57713e76cb825f9837f43279ce4741999b76a16928147537bcc20f2e0195b0f +af3f5dfdc2dcfe19de893f385f39f550cb1dab67c2e97f1d5fa735e5ec96d6680066803e8a0eb010dd4399f654195513 +a0fb4e08ff56530a940a86c28830956eb6dec2f020f7faaea7566faf0a4fafe0cffe01480e87763ec22f201be51a6451 +92343c5b107910b203c64a79c93d354f7ee5b7d1e62e56732386776e275285561cb887019cc00d3fdbe3b5d54460bec1 +acfe7df83c4624188a1011ad88c1e1490d31a8a8c8016b40aebcdd7590d9c0793e80d2d7ce6a7048876621c252a06a5e +a7da001dc1e33e0e129c192d469d2bd6e5d2982eb38f3ba78bae0670690c8e70f40e8114a57bd0718c870ca5dd25b648 +a903de5ff97dc83628290d781e206ef9d7c6b6d00cadc5bacffb31dc8935623ab96ade616413cb196a50f533e63641d6 +8f9658d42ad14a60bbf7263f6bd516cfee6b37b91a8f53715d69f718a090ad92484061c2cef999816760a78552fae45b +8c15b72b3d5fcb9ffd377fd67d9dfbdd706593fba9629002639973db12aac987bd1db70250ded31c88e19efff612cdb8 +88a2a4034decd854fb557960194ff3404e239953818a8a891bf72a0b26a8e570a65c4a630884de991ae7452b3234f31a +a09cae5c4c190537bf1dd75bd7bce56f7b799762af865bb9d1ee970f6a133c27cce0dd0f14a0e0516ceac41054e6998f +9760ebb1b40f9a97530c3b940d4ef772a225e5b63bf18283f8e302b9436c5209f6294980fd37058060e429fb7fdc3a56 +adaa9400eb86d857dc591b25dbe3bc8f207b69e77b03cb5ee01f7e4b006b5c8f6ba2b51b5a45687479885708509363de +949efe6b00b3248846747a9ad4a934d6e4255994c2b540a59fbbde395fe96d69bb67908441cfadd8c8bbb561fe52da03 +a19a45504b6b1dc3a0fe0e6a1384734a3dcd5a7cb8fb59eb70e49426c4fc44946547443d558e5719a04884ab3a2811ca +8934c9ee21e8d1435426fd0f64232a0670a7946ec524c054cd4f2cc8b1be9f89cc11002ca8aebae646a2050d91716b10 +b1150ff8ffb34ffdcf7d603348c0aed61e5f90ee0a1b814079fc2a41325c75f2f9ee81542797ede3f947884266a772e0 +86ce8cc7c1f92af68de2bca96ccb732f9b3374dad6657dfd523a95e8a931a0af2a80df74098514a06174406a40c16ba5 +90faabb9ace9e13fd9584932846ab28a618f50958d2ce0d50310a50c3bc6b0da4338288e06e5fcbaa499f24a42c000d5 +af4a935c2d8df73332a16dc6da490075cf93365bd0e53e2374ef397514c30c250bcac569b6df443985cf3720a4534889 +b7f948ee90f394789eb0644d9f5ad0b700c8e44e5e9ed0e49da4cc18483676d25740710b1c15a557965da635f425b62e +a917913091245beed6a997ff7043ecf60c4d655c4db0b1ef1c704fd9b0e1ea1335ce8b9f45d6e120f81805ce31555e30 +a48099da8406399bfb1ba834f6f7d864111d0036969a5cb64089947a63dd9467d3857b605e9f57f5ad5f4ec915088d9b +9784c3f9be42eed354542b1446d734521f8e3f01cd9d495ae98f2e4a3a16767fe2ad909e0def5d9a6267f3fc6a172cd2 +8d9afaa323847a3226ad7d7b60d87322ffcda2e4a8df89f58a076f7972d896588de685a2e155e243bcf9456b0a0d6d1f +994413faf0b843f4ec1842c706c45ea5f24351c68674a27887bc8b182eda756856e507a4e8bbfd937e2c4c581b629ee6 +b3e72d9d1ddaa00c7d22f25462d6e9f2faf55e30d138dce8bb1517eb0b67132db758668aac26164fd934d732633bdea5 +8e95875e338f714e9e293df104f0ad66833bbd7a49d53a4f7f5fd5b18a66a61aa0a0f65cc31d55e0c075e0d3e412cb90 +b980091862b1a9f9334b428eae14bbf1cecb4849e3a5809773b0d071d609727270f6ad97f329eca896c178ce65883db9 +915d7ae5ae780bdba27ba51a9788a8852a15355b569581d1f18f0d94bcdfed2c1ed5a4f58e049e9825cda11f92b2c2d4 +83e581058edf9259d0b06128282327cacbb6afc939578223cbf93544599f799a8dce1fb21d52464f990a877086f42506 +803612a38b6f6efb97941997e101ac1878e192456f8fbddb3359aa7f3023434ed8fa92e60ec8e7b4473b1948850e4311 +864a1bf4ac046161617dde282e44ab3cc1843da01a09ca58aa00ed00eaea9351a07a9ec16d910819e7dcc28b8d2c8ada +922eb142845975d5f6f7dcfee6cac8c299b3730400e6bf82cc0bdd9888de21de9d9f1530640f702c003e1ed63b140cc7 +a7db03c5be647dce1385ebc02f4825a654447fa8c4c8d4b22e635dbdd2b3ccdf219384e49a80cfb1e9e6182b6e4227ed +a167289ff0f0967bbab6479e4a8a6f508b001bbe0d16cad36ab4c105ad44f3f180e39a6694e6cd53bc300fe64dac1e8c +b7766431f6379ce62cba22ab938cdbb1b0c7903dfb43980a417e0ee96c10b86b447241e9dd4722fa716283061b847fb3 +90cda18c5d66f5945c07c8c7dc453dee1370217ccb851bbea32578599aa669b4dd245dd8a9711b27c5df918eadf9746c +ac690cd2af39932874385fbf73c22b5d0162f371c2d818ec8a83761e0a57d2db2fca1d757343e141e1a0348016d5fc44 +abac820f170ae9daa820661f32a603ed81013c6130d1ca1659137d94835e1546c39a2be898b187108662cdcbb99d24fe +b2ea5a5950096772f2b210d9f562f1a4cfacc021c2e3801ac3a935f2120d537471307d27b13d538dcbf877a35ff79a2e +ad94af4d0699cd49ba8ca3f15945bd09f3f7d20c3aa282a3113cdf89f943d7793e59468386b067e3c1d53425dfe84db4 +83788367ec97cc4bbc18241cbed465b19baa76fab51759355d5618067009298c79d0a62a22e2a1e6dc63c7b90f21a4a5 +a3e142d879096d90b1e0a778e726351fa71996466c39ee58a964e6b5a29855123d4a8af47e159027e8e6be0ca93d9955 +860831f8d3edaabd41be5d4d79c94921625252aaec806251fb508e364e39fde8808d38b10d557e487603a1b274c9bc3a +88da39f334bd656a73c414ec17dda532059183664bbbac44eb4686c2601629ef8ff9da992c337a842e3885b684dd0032 +b50addbdf7164e8303f33de5ce854d6f023d39c1c1984b214d9e5fb6f6001cd5bdda816f048a438ff3d696872672f805 +999e58c4c69a912b84561cb09610e415b43832beeb95897eca8c403ef4754f4277754d492eef3673afd4362f50060fc9 +b88ea0f60f8119c5a1fd9294796d387472dfad22442b29659713d1d88e7d854cb7cf5c9ef773627781188626bb2fb573 +a068b3844e9dbcf74b54fd55904d56af754d8ce4c619fead7a07f9bfb9d02118db7c512ccec2489d2a84374ec1d1fb6d +871dee023768636003c799e6f6fd8d31315a4c0da7286345cd64264a016693b3485e0732be1bbd34dd5fa04dfa58a983 +8021e8f508680df12e4a5a1bd49f2d7142df65158b0a7198ffa83abd16053a542fb93ffc33e5279020ba8c6a26feacf2 +b5d3cd64df5bc965228b0bd4ce9e5797c409f7b64a172ba165e44a8e4b38e3d5fabc3e0b9a19afbfe427f887c40a315d +a54fdebbb594bafcefb1a03697711e0091c072e1cc24fb441fefd4e0a0518675a1d7b0966cb8294051d7ec0ac175d0cd +93922202337f72969d6d6e14a29c9c75e0420dfba712029941d1504b9f6f9761d706cbc0652cd09a1aa5d22aec766af1 +9711ebf1c7c7426190d4afd5dd03b014a456bbd9d90ed101623866a280550df26a629dde400c03ee3699f7d827dc0bb9 +b4d686d8bc5c1e822a50124c1cc23c6bc3a1577a3d0b8d4b70d1797418aaa763283c09e8a0d31ae6d4e6115f39e713c4 +a533ea2ac683e4ba07e320501a5d82a1cfc4fa1d65451000c3043f0fdac0a765cc1125d6cc14fe69975f3b346be0fdde +94ee563134fe233a4a48cf1380df55ead2a8ec3bf58313c208659003fb615a71477e5c994dc4dcfb2a8c6f2d0cb27594 +93e97d3f3f70664d0925be7aee3a358e95ae7da394220928ae48da7251e287a6dfbd3e04003a31fab771c874328ae005 +b57440d34615e2e7b1f676f2a8e379e1d961209fe00a0cf6798f42b7c28dbd03172fce689305e5b83e54424bc3f4a47c +97644084c6f7b4162bc098bed781dd3af6e49e7661db510975528f1dea8154f3d87e979bcae90c3df3a7752eb0752889 +a923b27b225b2a6dd5bdc2e3d295b101cac5b629a86c483577e073cea1c7d942c457d7ff66b42fcf33e26c510b180bc2 +86698d3b3873ed3f8ab3269556f03ac8d53c6e2c47e5174ec5d14b3ed5c939750245441c00e2e9bb4d6f604179f255ef +87946826d3aa6c7d53435c78005509b178fdb9befc191c107aee0b48fbe4c88a54cebf1aae08c32c3df103c678bad0ca +860864896c32b5d4cb075176f4755ea87fea6b9cb541c255a83d56c0a4092f92396a3e2b357c71833979b23508865457 +b78fa75d687349e28b4ddfe9e2d32bb6a3be13220b8f3ff1ded712088bd0643da9b72778bcca9e3b103b80097f48bdd0 +8a188b940446598d1f0e8c6d81d3cada34c4c1ae0118ec7e0eacc70d1bced28ae34b99667d5793d9d315a414601c3b22 +842ac6f7dc14191ab6dddffcbc7cb9effba42700a77584aa6a8e17a855cd444c5d138f9d61bf55f43c6ffbcc83f92bc9 +b6742902c3d145a6af9738c01cf9880dd05c85f0d0ef7dbe93c06fdd6493333d218339ebc2a02be1895436a2f734a866 +98bf18488483c627b7181b049d3e6f849fce1f15794de59dcde6e5a9b0d76fd484a46e48822a6a93001d3aa12f48bc6d +8769cac10bda8c53a1c19419ef073a5998f73dcf2ba1b849561615a17cbc0a49bfe3eb4ff8801dd36a22fa34b9a3a7e2 +b45c084d58028fdfae792210fcd183abc4ffddeb4cf52ebf3f8a50e4c4eec2a2758f1241b0920bebcb24b757c778577c +85c1216eec8e1fbc1af9b36b93c5d073a81d5fba86a6daae38748ec1573eacc6bef209e76c87a6efbd7a3f80e11d4c3c +b8007e34bb3f927ec06a050b51e633d7eb9e9a44715d5b39712e69c36177a03cd68391090cc3293098e54f6cf65f6caf +8e85527b27c9152b1ba3fdd532a76a79064ab097570508f233e09978761dfe3012d537411b47d0e4b65265eb32cea2ae +899779f3c31a20b76068ec8d59d97a64d2249588ddfd69dcbaac6bfaee8ce0ff3c5afc4e17c934ae7cd041b760eb555d +a5dac3d8f5fbef018509612e25d179f60d2a62451c76426bf546e9666fcdc73263d34aa6fa7e2bfd4c9947bbf5095eff +896900eeef9be2b2e755128e7b1c436af6fb3984f1e66c444bc15fcf3959013b4902c381f0eab1247f878a6ebd1f4ee0 +8cb17f4b0af2e9b2cbb56f46e6a5d6874ea0daf147aae77303020b4e592ddc92e0dd058def7da96258b3a68b223bf22d +a1b6d3f09a9fa7ecc021ab7c5396541895da6e9bf1f9a156c08fc6f2b815a57f18c337ccfe540b62d79e0d261facb2be +ae70888811434ef93da60aeee44f113510069fd21161e5bb787295492eb8df85103794663fc9305f04adcbcf11ff0c5e +a84bbc8624100acfae080ba8cfb48fd4d0229a60b62d070bd08fade709efc6914dc232d3f7bed76a59204f9252321aad +aea47d54652abd8ca213cfc623c8e30780f37b095b59ac4795252a29c2b6bc703a5203acff8831314478b8ee8771d4d7 +8dd438eb8be14935f759aa93021c2b24e1d588f7a162c42c90ec3a647b0ff857f60e24c0a8953eb7bb04e04be70f11ce +922b07b5469680a10e7532766e099896f4dc3d70c522d8add18f5f7765d4ddb840df109146607b51ceddd2189fa7b9c0 +83ef6ebd0ae6c569d580093e8b0b78daa964760556272d202d343e824c38eccb424262e5b7809d3c586f9e2e9c5c5f22 +97f98bd357db6e093e967fe180cf67ed09fa711580a5ad48f07cf095b2e8fabbe6319f97d1f15d62c0ec2227569d8dbf +a1953a4a22fe6c2beaf2a5e39666b0eb53018af6976e3a7aab5515550ff2efa89400605a43fb2c4ac1e51961dbd271d8 +a5cbd67f4c0bc98e20aa74c09e6f5fb6f42c08e59aaa477b4b4e61434c8884bc14f17cf11faecf46dc4b6c055affbad2 +87d96818f2c4f12fd7705cf4060a97bd28037c5ac0f0cc38f71189ec49361e438ce863e6617651977708094d5336d1da +85e7c2daae5fe59f8a1541c94df50402a671a17dbb8838113fa4b7aaff6114cf2bb5969410cf21e6a162857f2f7a83a8 +a19575083e1731bb04bb4a49414e97aaadb36d883aa993d1f6847db50007315444814740e67e10177a14e0e074fd4c7d +a00ebfb5bcc3a6da835078189038a1e56b7dab6be74332b5ff7440e53b0f9e1eb9973effecbbf37000021fcf50c7c1ff +8969d7943abd3b1375fdfc7d6124dde82b0f7193068ed6ec83bcf908734daf3487a6a30f7b322e54a4818ae5f86d91c0 +b959c8d210fa43af9b20d1fe0ea8c4921280eb4544ef6ea913309ff9d61c9327096707e84dc1662960519be8e7d080a4 +9011d8ac651c42e0cb03931a9e960f58e02524c6b666047525e3b9097e9f35fb2b4b278efcce2bd5ad463c6d7fd56694 +937e3b22ed0fcdbd9ea5a1b97b84bbe86b7f5b2de3866a930611112f2217f4ee7d9822c4ab1253823f77bceeae0c8e10 +828997e5d121f4c305e018a0a0ba338bd6a34a7b4dc3c5ceab098ee57490311c130e2c045b9238a83908d07098d9fc32 +8d114808eac0f2e1a942d80dad16756ec24f0276763cd6771acb6049472e05a9bb1d3bbd5957f092936b415d25c746b0 +a063c5c26267ae12887387cbebbe51fd31bc604630b3a6e8e177e71d4f26263be89112cd12d139dd4c39f55f0e496be0 +ab1e1582c8d67196d10f969eeb44e6e16214f1316aa4a2a821f65ba5834326da6cba04373eabfd3b3072e79e5c9717e6 +a17b1dbaa11d41457e71a9d45d032448091df7a006c1a7836557923ab1a8d7290ec92a7a02b7e2a29fcea8f8e374c096 +a1ed7198da3591771c7c6802a1d547cf4fcd055ca9010756d2a89a49a3581dfe9886e02ee08c4a2f00b2688d0600509a +af09aa60c0a185e19b3d99ffdc8c6196d8806169086c8ff577bf3801c8ab371e74165ba0f7329981e9252bfe965be617 +98c04cc8bb26ffce187fa0051d068977c8f09303a08a575175072744e0a5fb61191b1769f663a426c30d405515329986 +a542bf1c9c3262d488ea896f973d62923be982e572172e2461e0146190f2a531f62acd44a5e955a9f1e242b3e46d63ae +aef7b7f30efd50e4a66c87482386f39f095bff6108e68f74fd3bb92156c71c75757912b111060cdee46a6b3452eed657 +8afe1e0ccd00079702f16ab364a23bbbd3da1889d07c4f8cb04fd994bf9353216360dbd364492932bfe20b8b69ae8028 +9896c690999db3c08cd7b25efb1b912c3e0f976db98a3e830f086aef93222d06ce570a7b2babcd7c81d8f9955169669c +ac7bcab6a281468907ef1ea8a6c1cd624159c88839131bef6aa0c22f331fc87ec6128a2c2a333fb79df549e4587e1a12 +987935c08a30b099d19f96901315a2e60591baf898581c40bf5eddcda806ff24a4536e30ed1e6c0b128a83fc77b6e81d +a0a6945bbede3bb09a4a09ef27baa20619d3e15af5673b9350601bcebe952597c989870746cf75767ffb73b32c6c9c6f +b0f5590079f0a0302b08a0cc1b7a5f39cc6900c2a5cdc7baa333d8328a731b2df5dbb67e27a154d3c44ed1a795fc4adb +a7294bdeea210e528f277f3d50e89e6d79950494478998181ecb38de675020130256f2f2a075899170be964d478458b0 +8ab3041b895a631869b439d5599a66facba919226ca9b39d915f19d59f9fc82393ea781377e9bd3bcc5a310e41376914 +8da399b59151fd48b2579948bb82698e3c9804d70ec7d6f3cc7e82901f9f2de5ee850349a7d6f43e5e9ebd47bd78620f +80e8c32de83d1083916d768b11a982955614a345d26d85b457f2280ff6c52bb776958add7c1c8878f7d520d815b8e014 +81bbec7bd99d2917d2dcd8a288722fb33ad5a4bf5416fba8609fa215fb80e0f873535349e7dc287f892aa56eb9e39c4a +9665796fe04c8519206fba58496bc84a8b9113e7ea8e152b65f7f732e88beea271dc97b1ea420dbc8257cc4b18a77463 +a97e342aaaf693ddc87e02790278e4bb50117af4413cd703bdf3b7cad2d1facf31fde1303b43ab2e0265467474f97a8a +925549ebebed348886e37773b05cd8ad04906eca4536bfed951d1ee41b3d362ddc6e1a302c21ff3a2d1e70e95117922c +818fdf74d7903502101551bbf48d3c7819786b04b192d9e94362d2fcb85760d8b6f45165a5443aa5221bef400525ddb4 +a9d29de7e8fd31b59f4a087168d062a478b1329cd3c81c31e56de4fb40de7a5be9a5269ef0be452c487443a0b097dd50 +a85286ad573db4c9aa56221135da1e31d742e0f6ff01d6b159086d7258f78b08dad55ec8eb5c91ee9d3404b2eeb67e1e +92a79b37db5e777f9ebbebde24a95430a199e866e56597c7d0b0e7fb54c7b092c2f6cf61fb24470ddf250cf609898281 +8d79f5ca67ed67d52c82949af342a9fc60fb793c47c76d84b4863c550796fcae2dd59e285897c6fb96fe31cee1efa62c +8ad2e0bda03415ab86324992bb62dfa3612d2d003765bcad1468087c27971d08bdbae5252681f0115a184f4885d444e4 +a08815af979286538c31b4aa5ec805053790af1ca58a8c4341be51136d094a8a05e569d876a079033298ad355ccb7ca8 +b96c2978d0165d619d08281d295e90df78bc2375d0afbc3142ebff9c2cd4b0f0aa97a9a0e3740bc4dce0ff8a9fac8252 +b7752cd0e582f35ab0d0036ca9c0a9fe893a6ad325164d78d865a604a85d3d23729e0362553e8b8a3d51816beeaa30cf +99cef1fafc29e7adfe247c753c475ad4bda7a5f9558b79c86e8a65968ede67adb38dc30071925c9d66a13860027a6735 +b9f6c65af178c791b6137d71980651fb09cb5b42f268999c728c6e129985a9c7d77b3dc3b50751bd29ec9ee0b3111dfc +8d73ae61fff5be883a281782698075c5650083f00399992688738856d76d159803be0059fbd9dec48f4f0432f0590bbb +a8a4a2865226de9bbf19e12c7e75318439fa6cf1cbf344d5e79a8f363439d3bc5bcf4df91b54581e7866e46db04eaf0d +894582aeff222e145f092ba15c60d3207340c38f2c6792ee2ab4d82d50fb544ae366c2985cc2b6c2f970bcc5f4b46385 +956014ba2d20a056fd86cb8c7ceeab9a2c6f905dae24fc1c5278fa5b84335148ebdefec5dcde8eb9b084700724fc93d7 +af217fe2b654eff6d11a2a79fe0339a1d4cb3708b7be9f09d852158b5a44b4f9b04406d6d67c4f144fb6b69a41ae9d0f +a90752a784bc00df94d960e523f5596695d16a534fc806179e0f878fc0e82a91b25e758e91a165debd815dd1af5f1028 +a697606fb32979549ad822b31df8eaaf50de4ead984439a0a33e955937d326519bb9f62c8243ad37f764655f8d32cc80 +a3ad4a30922e45a3e665551e5611384f1c2d414f6fa806184b0c826af05f014dc872585e255543794ee41e43cdadd856 +b29c255843a82ea74a013bac6c36a694646e61e6b9cefc4c130e2ee261e3bb5da3e0fe3ee7e6fbb009deed0530bc1c82 +87e1cc7febefa829cf050aa2aea59385d1048f8617abba691f7ea9ef58eb90ad12eeb9c439af228b0e34897ba1cf1b47 +994d3222f89e9c8c154362190be7167c8c2662f0cfa9d50eb4d8175b255ff0de09dc548ee312fc8226963c8c16f43e8b +8f1a980be640820f2d1e953264ca4c30330878971669852be3d5d6b41c488be1628b935388bfa2bd4de484acb0fe661d +854d90d0721579c8c88e147a4aa83553c960617b18075f8224b975562dccb30b0e02e81fa9df7070f356a0eeffc3b14f +8e156da9d4330a03e32a25a2f0b861fd3ea5c719fa4f834119baab6e5fa5236a9baaf0d44147bf0841418900037f6eac +96586fc49e53a6799242ddf617000db5a0ad20c6cb1686af2102623d64a71aaddb8e468b15fa6d100d0384e448548db4 +b44d8d85c8df95d504f82d597f8c515866d4d4a326fa1b816dcc5bb0cc4ef1a52647aa5d2e84c62e194c01cae0885d21 +b75c43e676a7efd199f8b32ae31f176ec667e714df355e9eecee97246f72af5bef9c5b04c11e7e90fc37bb9163f957ec +a49835ac0565a79f6a9078cf0443c5be20561a68b448289589721fded55188583f1d301925a34eea647f90a6e66c6774 +b47c17ff6824a00b8f29df0adb7f06223208d062bd703b0f763c6eee4ae62d4217eef2da4f4dde33f0b469c2f2db9e42 +957cf039cea6f6d41e368e2bd0cf77315938a0738f15ed9ca342f0a28658b763659ac1d1a85ecb362f13de12b77bb582 +903a52f8d2439fa63f59e1e9aba864d87b0464ded63814474947112375236a6f84e8fa003cc4433c8208d80e05fbd1b0 +8afd524209ff08d1eb6312b078f7afeb8e1155af649e930ab711dedda226dc2db6b0354aab9652eea7f433f90015bf7b +a95c3c9277b11bc8fe191773bf567641be57c0549913b973fb18740ff9cd7b3f7ce198fa4dc1086b2b8a446012459193 +9455ce8163fce04aeff61e7808ef3aac4725e51404f0858fe5d39d7344f55dcc7871ca332aa5cb1a63a4399529e48907 +809fa35b6958f94e781f2c584438b33f5ed528a6b492d08960cf22ecf63ea3aa1e2d29bc879e17296e0a6cc495439cb6 +b0f50774de212dd33e5837f6b496556215c665437e657f674fc5117e5c07dadbd0d057e6ac4c42d50a8eb81edfebf315 +844c65e263891d0b2fea7db6934cc4b7fb6bee2c1d0b9ab4c47f2eb3e9c5d7197dad828d38c54139123740151420280b +b13c78c9efcbb3b28eb3fe0b971380b7d5151c80948a99cd93c78b4c3ab0e86df6226a64d91e0a2ea4a1c0a46bc0404e +90300a541decad460c348b8f4257f7a29687b2362ebee8d92fd03cc0e85b285ccb0ab1cb2ff5e29c5cc5295e351017cd +ac49b409ded770c6d74f6e70104c2cdc95b7b90609da0743c9923179e8e5201ead03becc0ab10d65b3d91a5be0d52371 +a257b815bd8289dfdfc21af218aaba12ccfd84ebf77642cc4cf744d9b0174ca0b0d7ab2a545c2a314fd5f63c140f41ab +a34778d8446e4d74d8fe33de64b2694ef1e50bc140e252af6eff3ce7b57acf8b6577a02ba94b74a8ae32e5113cf0a29b +ab9e935bcf0d8607e3d66f013d9bce7909962cb7a81174923db02dc89e485c2b1c33d6065bdc7bbbe0450b5c49fbe640 +94d2c5c5c309c9eac04be4636f61bc47fd9579b47aded57cc6c736fefb8dfd8f8a5de32210f7baf2052d04c0219d3b4b +b8dda9046ae265214086355101be3460421f7cd0ed01bde9c1621da510941d42bc93cd8060fd73f374fb1b0a5f38d45e +a6674649dab5f92ab9fa811d9da1d342cf89ff6eff13ad49f4d81de45438e81a384098d3ae5ccce4c67bda5dbe246d95 +8d619f7564677bacba29c346c4ef67c211f7a3a14c73433dd1a7692e16a7e2562f1d0532454af62fc04c2fd2bb1789b0 +a2b93d2fd4c707f5908f624a0fc889e20164d3c61850af9125f47a1719757a6ce6375aa1910eafa4c1e8b6e20c312775 +a07d5585447654d82817ef4d199984542328b238157976eb9a267f0bdb2229acc25aee510be68f65a312b68fdd9e0447 +8ef55cf95e2b24d8ec88e4136399a7763bd1b73d5e90ea45e9845123e9d39a625cc336e9b67988374b8ebcbc75f2ed21 +b62c1fc32e27c767c461411b02fe9aa44a86586e1427406f4ef0b346d077db91952abce79318b382ec75b7be23058cac +b252900345f5fa15a4b77fb6af6a2d04db16e878b7bd98005333f7f6e3c8e6e46cf38fc5d1b2bc399c5c2ff4af730dc6 +a4ab5ac0cc15d3d17b1747c6e3133d586870eae0a0d9c8fa7fd990ebd4fbb62e9090557ca2792a6bc6271856aa3c9a05 +8e706b3f2e902faee10b22742c6c33bea6f670a8937c243db96885143c1db5c979e33ab73a38359b52b8d668ccd092a9 +8a6792190ee6c959d79f60c22980ca140c638d88d75660adaf9bcbe6dc4692ab5f01e0c460170f09f74d5e582e85ff1f +97ffeedfc94c98ec85ea937e064d7b290a326838e62cebd407facd1ab4f08d9c0c109d79af7cb6170fccfa6c8243c127 +b79970b67c09453614ffd83a0c923c17f857c6ce3c87a356298f8351cab0def7ed83efd4f6638f48df67e07bef4ad9d8 +b90f1931c7cf1822cc0a97401119910cdfd0482daf09a4d7612e4e05046295cfb4cc50d5214b31676bb1a1c9d15f9c7f +922921ad813c01fb5d12fa7fb7ed8e0b0abbf7b19affa190b36013c55b88fe3c7df0ae663c970eec7725ba37b95a7cb7 +a124f33e7f28feabb4089a063a08d52b7395d24eecd06857a720439dd9414b7073bb86fbd0b04e7bfac62d3dc0fdb2f2 +b252fe50bc6677c004550f240fe670974a33ffe7191ed7675da6ac36c780c2f8d02be7da5d92cbe2d0ce90147847f8b1 +ae5f8c9c56070f919f3df2d2284348fa4b2e39881f7bc42c9b2f5b7cb1ebeef8ecac000f37329bbe04cc1680cefc7f4e +b432a4575caf7337f11eecfcbd34a6705d0f82c216301725ceae2b3c9df20fa53d1ebef65513e305013d1e0c2df522b6 +b7c016fbbc4614cdbb12db1c9ac41f9a45d5e5ce82594d568a30cd2c66c3cc9d91a2c959697b67c582a0913de661505d +8f6f3e5e0347dddc1b2a34ec0dbbbb7cafbf976f19c9c902efb5c1427d1bbd4b71abd9f3fba20dda75c35a39393c989f +b0042a1d33a1ee9fdf3fad2299b8d70c4f1862d8393b5ebe3ac2189a2c5a58bb826128cd7a39b70d524a6dd976097e26 +85297c4e8ae8d9b44c3fe51aa926c77d55db766c2a9f91b659040de36e34c9a4fc6f44380f8d61704498f6fd52395a49 +8c61a988b6a00fe5a277450f30bf6daa932e42a2eae844568e3babf8815e09311f3c352dae6eb2d57a98d16b7beb2d22 +990be28aaecd932e7edb2a97b9be2789a3905cb88737b1c79881302585801c69a3dd5fb230808b39db1352fc06e0b4a8 +82fd14bdb335aa46f022dfe0ed4d631911e6b6f5eefb10d11e9e2e02a7df55012ed8162249d10b58eb76ced5a7b06cda +ac39cb058df764e161db9c39b185f09aa210bddbd66f681f1697ddbe6b305735612d5dd321d3ffbb4876771bdb321e2f +858a3f7e57ccb81387caf8e89f9b6039e9aadeab06886d8688fe6427151a59ab2e77e85ba850c67d099965426c97779a +b57fb9ea623cec432946819937c6bded0b5d03c8c67b52b44a4b67d34adfb055e6cabca67a48e4d859b4be45162c5083 +b84d2990b563d6d7fe1f4c1894989db25b81745090b94b1fe2ef708ac3b2110ef93d647820b2a51fcf78e3f00fef5412 +817d85b9f5e1521733d2b1fa6d4f4957ac445dc803f97fc495e20b819b14e651332f9e0573d684b854fd47824c53f0e8 +b09e18e97e93a8523101af594422fb71afc5b8826002314269016fcc1b44002d91bcb7c90d923d460f0cc03bddfe9af1 +b867cbede82102de7cf6cd0dae68506869576eaa66c3fc806e73585310602682fc912dc37adf5ff6f0f34a07831735b1 +b1126255798368b692f2796a3470ed16e5ffdee2d8c9e0f7ee3d2e92950c3e6365c32895171c3494aff2a6d6356f7e25 +b05f0a0996dec16335c770a5df3f0b08e20020c838c2caaa1d3a4a2490ede98552f5de349de2ce6e4c4a839731d80919 +98c512bb91c8fa191120ddf5d63c88076581cf41e15eec3c168822f12b3dd0ce4d6df74a7e3093d3e35cad1cb3135421 +84ce38fd97f7f90012c2c1e59a67bf9f465a7ccfb6f308bdd0446cc82b8a26ff7c30e5c7cc375011718cad1b31adaa9f +93139db52c9fb96dee97a0825f21e34c5d6d36838e1e42f4d12d01eacbe94426c85a811fe16ca78e89e08f1c27383d28 +81454037b1e7a1765f67e4288b8742eebf6d864d9b0f508ab44fa3243168ce0ed30cb5f33dfcdb995cd2c2710ff97a6d +828deb2a26efb2ff1842f735e2cc27162360f619b6e3e27a85bedf384912d4726bb2759a3016937973092ece1bf90540 +87e5a7d4e7bd301078f625d9a99b99e6e8e1207c9f8a679f8ebbbfb467bfa0b5f7ef4a4d577c7d2670efa88221153012 +b9dc9d0ea48deee201e34379447bec789c8924aecd030eeb93db159af77eff230976ef60ea9f4b4a9e9e95c1f9f4284e +aa6528268d46bf0627d87d58e243d3ac34b863513c725908a2617e4c6a46ccb1d8c8334bd6dd0eea7ffebec44259dae5 +8d26c9ce07293f6a32a664d31e6df9a7ace47e6c38001635918efd9872aceab62de7757b13b783d422eb67bd28ce7bbb +b0d3ca88d9829a7459b89b0dcbdb8bbb5180b00d750bd959bd110f53c2dd5d4db554b6005c4765fbe7ec5903669e5ebc +a94d1c72bf3b2dc6bfebc9dee40f6a89a516b252bd9f4fad96f156e3dbfc151a9b8a02324d764c7656d59230a18eb61f +88996e79171e30b16505638d8ecb25afd875e5f3cc3e29860937f2b5e751c66e78dc77f744a0cc454a8a655142a93ffb +af4d94f342665fe7ecda318de6cf1bc1c40c37dd83d060fedaf827459728152b5f0e280286ff5e6a0012036f6715f53f +96beaa7a2d565ec14a4e5cb895d33624c69da56b75c8d06ac729cb6d0cb64470ed4f9b0387083cd827b1609c8cabde8c +96b773fa2fcb7377bf71a7e286f37f1f24ee42cba5b4f33903c4566e5e5bcc501ea360e3c8435749107c3de84e272d8e +a69ac6218454c3f40ad0beb48821a218fb0a4f33ebade986d2fffd9a3900d8cfa613bc71676c46cfeaa5f644d1f239a9 +857f139c08fcc45370f448ce3e4915bcb30f23daa4134407fc6d78efac7d718b2cd89e9a743eec7bf2cc0eccf55eb907 +adeeba36af137fd3c371a2adbefea614c3ae3a69f8755ce892d0dd7102fb60717f5245d30119c69c582804e7e56f1626 +afa97ca3548b35aeda6bfed7fbb39af907ed82a09348004d5705b4bb000173270ce44eb5d181819088aa5a2f20a547a2 +8423bd2d07073b0e87819b4e81997e4d3188b0a5592621a30981dc0a5a9d0578fde1638a364f015078a001afb00891c2 +b92e9d4ec3966981ee574695d6e4865810b8e75313e48c1e4bc5eebae77eb28740e97ecc3e5c42040f9eb1ee4b13b0ea +b07b218321d54cecfcd2ed54a5fd588a6be8d7a5b6a66dff7facfe061222c40553e076e57cbdfa0bdb08e0a009c94ba5 +a71e1ae4d6096eac9ea4c21f621c875423de7c620544e520fb6ec3cb41a78554aedd79493cbd2c2ba4f0387f902ddd2a +807cdac291246a02f60c8937532c8969e689b1cfe811f239bfdee0791e7aa0545e9686cfb9ed0c1df84748e5efa5e3da +a1faeb4504c057304d27d54fb3ec681462384a354a4f0b6c759d4fa313253a789250c6b0f44f751b0718592637438a19 +996bcd3215182d49f1cd15a05e1e0a4bf57e264400bf14f7253c6611d2571de7130cce81fd28e0411e0a80e9054f4f98 +89d15b38f14bcd46f4b2dcae82b0e7bf9a35e40bf57aa947e9c4a8f87a440b5cea95229708de08ca596762062c34aaa0 +8d8ddcaf79374c750b8b0b3d196acb6bb921e51b4619876a29d09161ba82a42271066187211ef746f9f40a5ca17b75f7 +a3dc7f70f3a6c7edc483e712770abbaa94bfa3174cfee872b2cc011b267e0ef9baa1ab49e4a6c6c30dbba0e0a1237117 +aa9e958bbdcb192b19c43fc6fd34afcd754949fdada98e9f4848e8db0e23acb27d19dd073c951a8819000f2356aa22e1 +a4714e45ec853eadfe5c3bee7f683b81f97857bbd7833192a48936dd1460aee68f700a21658658b74b737c4fecf90c7f +a1ecab4215c1892e4a8ff3405d710163875e5dfef8a8cb84f5cac4e317d89c7696e3f496ed1747ca6f52b304190f4ba1 +b9b48943eca3686219575026d395b969e6ff8159dc5317005df090e79d26901984e40ae4b1af060ed3ff6f42e0417d76 +9644b9f90a66edb0396abd8c00066886f978ebf56fc22081031fbc9ce371bf9b04aa5a4ef59e59319b3a05bb7fb88b43 +b2bb14f1c055a78596488e4e2d4135a6470c1ee43961952160b8498f674a4d23040606e937c02c1fc23dbd47e9bd4633 +8c61f2fce9a42b94a389c7e52d7d093fc011099d0f4914f6d6f05b631df7b88182826edf9bbb1225971a080ca5c0d15a +aa6a7b8499cc7d256043eacad18528d38bf3be970bea4c6d4cb886690280bdb373688ceba3e506471e1d9493dc76f3f4 +8127703363b3b35b06762c2353d4de82b7b85bb860db1028d3640f46bdb78f2d104fa77ee3e0d9db83833d2b12a966f8 +b7b01f5909f2c66ae0fab156be5d79954e3a304615e1fe55945049dd4bd95f973bb3821117eb54db7e9ed1ee9a527652 +8be47ba5dfe212420649193490838670c40540e0ea24adbab18c4a66e7ac3dcf94f068dec2533b60e08c1f64e7533e54 +905a6c7e24b86aa54a05c329a6b4616d335bb0b1f1e9987562eee0acf82ad302c7c44981a1dd6b24c6121ca12fb92996 +86969ccfd91deed93b355a2c21319e3bb08cc652b741463bf68c626b7ba2afce3f7cc397f2fb74588c2893477c948ae2 +b5a9d20eb12c331d0d300fd4b85b0ac0bb74573178a5fac8ec9dce5e95acba07fab444260355ece442a846737a2dcd1c +a13497c11df21b11fc1a63b0ffdcf7f432da4dc2c98f8d07d36da4fa68aceb57af2158088e5b05e334fe0f264aeb7a97 +882e4597cc66498a45e86a2ed9ee24652da4699af00ad35f73b5e74fde6ac3cee70630962d5ddd86162d4aaf11bbc11c +b748858c2bafa4a14ce44af35195e9c52aa75e109719243bbe278095acbfd6a7ae7e084caf8dae6939039b5a4e8fd675 +83a2e0524507e74f51fe976441108f8226ba1b3a33f4e16ec45c5661ce80cb1840a93d17122cb8ca9e0f80d14f69877d +846cd2946c93ee5f24243d9ebc69936b3a1a6d59f45fec6c79b1eddf15ce30a8e73ad03cf606ee66baea3d8ff115f70f +8d98d0a3a94f6efe158f8423c041b546416145c5c2254bfa157efea0d1c99fe58acc7df6424ef29f75960b18d664ea4e +a39fa47e4b79f54dbf59d0b1726f1e78bc219fcfc56ad238c84b4b610e7892ff1e65d537baf5118a32f5e2eb80d5ee0c +8c30969a4519131de5e30121c84c04f67b98c8ad109fa4710dd3149cae303d51778add3f258f0482f1c89c169824dffc +af7f80d141ceb78b4762015de17fef49d7ff6202d292e9604deb508272ee7569f7fd5be3b2438da1dfecf0c26533ef86 +97cf82f70128251944d79b8845506975405bd720e150d836205b048ff36ba8801eb74cdcc6425f28f6bc0acec0a81463 +8c276c876eb88688957d1868bf3a1462375e608ff72b49870a5dac82cbf6584e00e3f36f236f732348a47502ccf9539d +964765f1a5c8a41d8025ddf56dc01b78424703d8a64a4e5539e477cb2445cb541c70127c561e717256d13f91a830ba83 +a2aacd9e21b8c8efaf2319611addea1b9f41430aee42e7f2a640cc693aa395287cc8fdc2806b76b577d84fbd05378ead +ab11eabbf5be4345a77323a3b75f9ee93b011fd2a9d0154e88183cafe47f82a7888666af16b40d3cb677c94bcc755ff7 +a0bfe715a7af5a29b1b6148b8cbee585d2b49fa6ce59bcd173ea3bbc60d71a62f9da27ffcbbd5a6da75502112fe44d70 +902e6cc38ee42245103d90b65028a471bc7a48b825599d361aa81d8c56e0fcf9fbe8d4c13802040d2cfb85b7e022eea1 +8832e2b5014fdef4003bdbb87e3298fdbdbbe49673f6b66e2373f1cb2605f9c4af2cdf9bfd45d1993208681d29ee1c9d +a7d39d3fa1ec1e0c87730fa43d4900e91932d1cafb36c76b2934907becf7d15a1d84d7234591ad4c322b5a24673bba8d +836ed5f09d99624204aa3aa7ac601980fda223f3b4b96b4a8fb235c574a3545d518787c12f81bd5851987f2860d41886 +94235e94445e6086f6e9331923262070a4c2ed930ec519eabb8a30133bd4fc6debb99185f4b668431fae1b485c5c81b7 +9828ffe20b9405f117dac044159be2d3c6e2b50ecdd1651d6a73f7633e6e2a7ba3d783ae939973604446d3a1ef0fb20f +92f03dc365dfe9154743ca70e6dd2758f064e3286fc543cf8c50f68effdf7c554bd17b3507c6ff4127046d9bbb5522ef +91ed07df479d8eb3d31292a0e987672a7f3d45ecafe72935b7abbc3f23493605134ce573f309e226c9efe830b6868220 +93bee582661e6d6cefeff29002afc2f36dd2c13dbf33f0574c35b290ddc426170a5f7f196369ad592efcd72cfb6f8fc0 +89a51467d966f48fed15dea5a12dda54d0015f69e2169b5e34f44c7b5a5d4c282d6f138116a0cd06a8476980e420f8d8 +b8ccebc14b6679ba2399370848864f15f63512fd6139df7359b7b93e82c1007fd85137ecb0597294b46643e1a9e7ab5e +841fa301567fc57b2cd09508ce75326684e12bfb8add671dc208f579b2500b93d5b641e9f59bba798ed4ed1259757f7d +b3cb45c15eb00b4ccb7013299f761cb8fefc17adf6db50e9ecb8abe927a3bc7f28e359e64693813e078e1dac800ad55b +96e55d3b9f445f5679e34fa5425b3e87cb221cfbdd07f8353868c7f7f4ba388ee3841cb9a1d638583bc20d03a9d071f2 +a7dee9377de740270c5b57cf86699004ba8dc2766af56b388b5cb0814ec71bb99ecf43ee3d82a552733854ecc7def0fe +b129dfff23b3c1c95ddb214c4711961fcb129efe2b6557ec9e116ada909593d0d2eec2c628434493393c58c52aa86847 +aed2670e201cb3e38a8be3c86735a4d76255e1e5a4c67b91df6ed262d09c8d10b0a3891da3e6ab934058cc9a7178931b +b20b8921ae52e5b3c94fa3a8b46489044174f7b897779e7763d6eb419e808d76705b7e7ba5131576f425aa81b6b0de53 +a7e45bbc3ba1bc36617291ba7663806e247f1b57a89e31520c64a90cbf8d426cac2e2f381338baf78c8f92fdbbcb7026 +a99e651e73a507e9e663e2364fcc193ec77e8afdc08c2bed6ad864e49b537ec31e9114ee72291a7657899f2033a849e2 +af966033636c2e9e8280d173f556fe07f8b6940bbcf6b2df7e2165c30bea66cced2596f6c17ca7c1aa0e614174953ba9 +b69ca7a79e3d55ef21e0ebdc6f0c4bd17182d30cf6290cccca7d2551c91c12b966020d8e40e4ee4179488c9809c03ae4 +b981cd36244e035fef043f70b1d7188d7cd045b4de0581c459fc5730e10eb7f3d5893b54cc4243849c0855e4e621167a +b20fea858a36921b35a3051ce787b73f70fdecd3fef283c15a2eb1bffb1dcba5991eee4a047ce4e87802da923fd9457b +b040e6f2e56dc1860274c263d4045837456f74b354a679f6b5ea70919835ebe5d32bf1f519e218730096c98ff396dc9d +8d2dd60e702c923a7204b530e7d6c193c6f93ca648c4f7bb38f4edbeb0aaed84184213afafb8db6aeb9197c24364276c +95dfa7348709e43d71285b28a0bfad3ca805b6ed4ae99753e9f736c79d58a35a3a50b42760ccdd03eda50f6e59494968 +b8585632a13f18c139a411bb2f02df809591834d127cd1ff081e26d0abfe0e3fbb54abea26538b25a0dcb4d7e969590e +b46ba47858a29c6d523c9982660949567666daf2582b93393a4802a9e077eedbc0d49d454731696bc8e46ca50c7caa40 +84b756b901b98a4404e58d70f39f6ccac877146c866732ae65e7e82727448d1550343bf7cdff1bfd4ee1ed73793db255 +83e5be888eaf877a2c755897410865f64a6d1169a8ccf0336092f3932abab915e542ab75a35ffe016042340d581ee987 +8cb274fc39285aed451a7def72cfbf73168ee10be02affe355a2bf87cf361a81ad284e9334cf00c5bf99a13d9f75e116 +91ff6220924b94ae13f50eeac16a159232e4f16a73fbd5c22c0e185cd1998403904d36bad203baa82b85819ee4a8ac10 +87f46e08e09aea2ab37b55fc300689d9b58ff3e72f1cffe023386035888f714fac4673c7c5193d3f3f3c568c640694f0 +835d7d84ca7641e1b15095830114aa6072fe12260d2202456cafe2308c22651af9ffbcf6b7e56af97167dd0c4e2a4cf2 +91202183f79794f114fd9e3b9bd05553c0e8985919965101a57d97ef666b028863e6cea9735af016dc1864f1542dee51 +81ab2b02a9b0a490a74ae615ddd4fe560734c1bfdde6b8dd13303c1481ba0e8ab14473535a93cfe4e824a0ab29445f8c +8a32d73f4fc006551d4e2c61eec6130355ec9b8c39a65c24ec1edc00e80155ca83a8ef2455e892521a3d47634d82a987 +af70d7b8f13bc90193cc1cfb0c400c4224cf10f1887848aa93e6380f7087782fc41a159926ab53c53eb95c2383b1a849 +989bf42f9d357c51774f1c7c0f7c0c46a8cb7398a74497141c32685be098e38b4230ffe833a6d880ec391a35b1a747b6 +94cb6715ee95700020c630b8c19e35f231de970219bd7e6ba7ced01899197da473b6c45cacfab0d652ddaf547b4ea58c +b12e3331f1f7d7458393a785e22e9a5e1d1daea521b4e78c0ee8ca59b41ade1735a29820e18f6afb2f2c3c56fecc16b6 +ad4b7cf654349d136fb41fb0dd65b588199f68b462b05f5c4e5c2b468bfaa6c26329033e3c3f7873dc8ace89cf873ea5 +a3279969e1ab596df0559ffc5ac7a6dc849680354e01c3f4fd34c6413a3f9f046f89c1e1be0b315d8b6dfab3d23d5c14 +ac74cc5562836ed89d09a9ae6a3644c936d64bdda9e77659d9982f1be29541b03ef2723236d5465e398373ea19a4ccc6 +98138ebce1af531dd8b631b3e74c84f0c700355a2a9bde31e5e51bb10c8bbd766559c63f6041f4002568803fe08438e0 +9006445da131349fe5714e0777a4f82a82da343612589a0c1596393e8b6894ce1cf42784f95ff67a8384ffe1f1a4ad76 +88502a84a85e4ce54cfed297b5d355867cc770a8ffd0714a6f23b1ab320a9903c6e42809e034bb67dbf94c4fc0d9c790 +aa8b4bf123d1a6ccaa44b86be8f980005f2a0a388a76cb111b0e85cd072ef64167fb0c097c7b23c4bca64c0260f6cce0 +ad49eb35dfea9feabb513a78dd1152ad7eba22fbb02a80cefc494a7037699c8df81202dfec12acc1b9e33ad680cb72d2 +8694da730231b29afd5196371ddcb15b4dcc499574bdd063f4864ab80749833ea38ab8b0ca1629a367fe378e87a60a86 +8eca7b488e810c479e7e32e24b8afcd837f7df183fe4f621a0336b53a9ed77603c84bdc365d8be68179a32b71a1deb7e +8875cd3e23c7e1af55af1b091025a08255743984186770bcd43f30b4a58d175cfdf1984bad97a15e08dac2da27198c3d +abdafcf58ec72997e494d4714645f40d09dcd0fbd0733e640eca44eeea67c25bb0c270299c459991f2fae59d13b4f4d5 +8f040970141e61489284f3efd907705eae6ec757fe8e1d284eac123d313e9ac1e8dc14ae3f04d281e1effc49d5d2f51d +a7ff115f0d2dbf66c0e8770b3d05157b37357b9e33e9a447f0f3fa9da69ad04e371fd1e4848cfb9e8d05e3165bd969d8 +a39b1a8c39d317fcc97bf6c396e6ed4a85640aeeadbf45166bd02bc3bdfb6266509159c03afd492e642384c635b824c0 +a2e1b90f3dd2d0038eaa5be52127844ccf35d997143179d95ffd3749c0896398b130094d01eb1bb31ffe80ef34b42b48 +a2bbe31f89b0c3c375ffaf63c8b7831860a921d5e388eb7907dbf61f2601ea40db86bb3952ecaa26a5eca4317a848ff9 +87d885bb0f2ce04b40ce94d2557c15f1698dc652e938f9a2d69a73ccf4899e08eafa1a59a20cae92823795f5b94f04b9 +8f7746370f8a24a2889d351f3e36b8a7d60e75e50e8f5abeea7dafc75441e95915721654e61ceac51bb6f112780d352c +a7272847526ed3d9e0d0fea1d8685b07b5b908971490bf8a46748c8b1783c629b8644feb5bac772ae615daae383d5e72 +978c9aa2996d8bd6fda7e0393fa8b38747f8f99712427705c00f6e9a12c36f8d8b4cedb03fcb9867155cbddb5200e6e1 +a4dec4a2354b2b32434c5bcdc380bf84580c6f9940f94dc0498a5bfe89c675a0921e66b807a3d859a6059a464cb2a9ac +99459ddecc7abce437f68722dae556d8ffaf8ed974f459e52e6d4a64f176caa4d42c2f2ec57e8a5b5f2034638e8acb0a +928c68c0c9213fe6258ab5bb0c693d97203d15da359784de7824dec143212da57d062a1fc70a79172cee31adc7aff382 +aad3f318f1622ea87e12541dfd982d71629b8f1ded4c301f9f6b6af9432716ad057773c33bdaa6f15dc151b0ee4505ea +8eb8e978f149a983fd6ad01773f9aacf57bd0cc622d8a301e404184b37e610123dd081faeda571a0ab1f149a3960af10 +851e7191d7b94bd422bcece5b92609fc1b1c8556229bc53e32963b2d2fd1cacd8ce5da9040b599eca6e610540f8a7987 +9414157fe9d50e5a0b5a7397417681bcb3a651eec1cab63f2a88d5df68ab1fef6e4c1d7ba657cbaf241a7cb790297633 +b5cb2dafdc5408959780754a58b2da55b2a9136672ebca42f34da4e329ddc89360e7218cde3efdbf784ddb390deacc57 +ac6b70f65503a8e94b773fda3e72615745824930114fe72b6d833484285462392617c1b2eea4a250fedbee88f503f3ba +b0829a5312f9ac6c06fddee2f835a3452fe994f6d42c9edfc390d7d5b3240ca544433b544cbbddd6516b38a6d5d7c21d +95f8e2c59905957e34d53be3d6fb85732f834e2cb9ab4c333fea2f502452a87ccd035fc9075d7c0bd8530bb0a0c96527 +b93f279b7045f2d97c674495f6e69a3e352f32f43cc60300193b936c2850b2805c15457251f7e3f633f435cb2b60405c +915abf16cba1a0b655b92a8a70c03e7fb306b86f3bbfb66967ca63e64c003b59c7a5953675efa4fa0bce9bed536b6700 +ac2047f50a319d09df1ec44d71afdcec5ac3bd2765dc98aba347734aa780863545df9f6d71214d443e3f37edc0dae45a +ad49c74ddb24c8a26b14ec08bc807313c77c5967fbb36237f55994d7511bbac8d7e7b9b8ec53eb1b3b066989f078dbd9 +961483105f605e959213fe9e8a52b76dac62d7efd2319ec71fc4e92d68fbe44cd2f65d7adefb2eb64d591b91648b8085 +b67fcafc97d8df2b3075bbff7b3d7471dbf1f3048f309e55d5e2c5bcbc7a73aebcb0697859be9f387cbc7ce98041e154 +8da70ac16468cab6066992389cb37c79ff5e0babbe67d76878aef9408b9597a3dc2eb5de87428bc761a0d78957b0eb28 +aec0ce89770d299b631f15ae12f94b1e1014ac57d38fcf037c2c7712d770d074affa06e97c60691bad8733874b6ad2ed +8b702c85fa4c915a09fc86507f44d7aeda0993b77af87780d70cc98d580c6e996b64b7c16cdb4dd4562cb0f75da36ee7 +aaeb43aa472aac2253e211fd1066c3a5422ea041cef20168702d0618a1a742a44f7fb30a76677640fea1a24e7fae1996 +a8820e92825d6e02b9b4ad5ebc86161d3244cddd3d244333ba1576b6ae10948145b68d9e926bf6b7a2c25dab4cf43f3e +8ffdae28a1f1d15d7ffa473628a66ee9a739073f59ba781248286b39cb8f7255f66d62337064246713cbb5017e615174 +adfc5dd142b7911326d8424881d5d92006f3b17de4cce91674d6ea37f00fbb266c791ac13f6c7a0f61d04f2a952e6a04 +87f98982444bf661f539bec73a10256f079a4baa88a1cea0351ae3de929e1c500485b2d1b5d933063cd7d9123d5050e4 +8f217ba4dd404c5ee384f0c9a126686db001ff0344c01c82174c5e5ef89d1a241b146008c534b13a0da6c8afe7450fbb +afc85476dddaf1cbb4ba8b22186789f3818c7964f9f613e55010278800cd95422702248bdf9c73760702ef24854795ec +a59e0f6ac2ccdfbd01f002008034390c0ea78716f5e0de4e474e3558755705c9c7afb6e3c5c4370e7bbc85958a9c7a63 +97c0695c58d792ec31d9b86d3b2fc1382f0855057b24d5f6a54c41f76f9e2f52882cadc89a8b2f121530e7f1393faa95 +8e49112de0b2649c08a96cf737af68fa8055f1af594846a2d0534c94df6f926f200405edaa6e6ac9db7e380707a2571d +99a1bd83a7ac5f8d77ddf044c80ebfc5745b998714696d67b94d185c97e9d6db989bacac646d9def463127a8b2febc00 +aba80725f9f9f7abe10760eca73ba427ca8df864a157122eb9af828a05b0199de3add02019a297750bdab5380e505c58 +ae18f62573275c1eb268f74c5e54e8958547f9e7d1d36a05b084eb53e5704fafe2200b8aff95cc7e9af5be2391c42b7c +908b8031d09d22b2aefeaa876a998e0a97c7a1070aad9e9c97836cc5aa6d2d5ef94230e1222074837b5e21b4e6490f01 +b3132282e8b41ca6789ec5c43c1fecf3a65b8eefbc2f3d10f746a843b9ba4ce6db664678e75e424f7b11a00c1440de15 +a1eb49440cc106ebc09cf198c93e8070271eb5a936d31c04858a2b311a037350100c7957d5545c9653f396aa968b91f4 +81df6ad1bdd5eee4cc2f94318467b8602d15cc1be2b48b09ade12cc46ee05cbaaf77a20397e5015030b1f1db5dd9dac0 +87236c68a2a93c8442d15d7f1d1dc01d1fd123439c183e1d843f4ddd2bcf638c128f66f1ef9b710e5d1f64a52726007a +84f2e7f85563bb2f61b10a712c7605d63f79af5be0dba056814fd3efebc20e9c53227c56577b72c68d185571b775eff6 +a36d4ae06688ece2927aeb2c7f058a3cd2aa1de1601282d4e688e1d76ef20728b892928deda2314eba41675eba3912f1 +b8326dcbcdcfce017b263c456c47692fb476c4225c95981666fff0b7d4522fc23b7f12273f0f47cf0442662124e6648f +84c66463ab277cda2cc7007d0509269e89cdd41c5e0d3773a92615f0fc5da63811186b05d7a11088048a5d4834a7e0df +b20d3571d970712ef4699b0e7034fd269c361f53e1572e2ea2676b4245e992d43b8b5931a801439a44d977a988cc360b +94dba6007e6d4998ca1eb84aa8e2a7e9f5c164b9d80df2825f2208ce5640a05aacac2e4f08918268990f43ae1ccab69a +a1c25f0b3ef9d1982153207570d9ce8d692e1b6963b509958dc4d9bcd80074bb221c46804a6d9a29e76149cc7787c282 +8857748fcdab1199fc96084323a81d3bd8b5a7f0b1abc5bc3b5252a19268344e2e7d2d086c90fc9b5fa4b92feedb93a4 +8b9c1d841447354b6c086549e4d1d435ab64c13933488c34bc30f0f6eb36c5c5b838b7b6bb018542247edd1ada091045 +8f5b655416da0e719a204fc567e93792c301acb4374cf7bbabc6ce51dbeaaadfd75c2db0e16ce073ab8e91fd3d7ea9d4 +90f2846b19be46a75c5cd0cafefcf9192e6fd80c479e8d6320c4b8d8d7d96703c9e77ff31a67afa9858e6b7bde1f7cce +a53e383947fd98aa1a55ac956214b46b20a52758461e8ba41341a23a835ebb713038bf048edb1202bbfd0b56a96bf292 +9542d7debbcfb9cda6fa279c699a7b655c03b9a9b456a5d3cfc41a826c94eafa43e01155a29e39ff0bcd965f4c0c512d +a43792864ec5fc549f7afc02622454afc0e425c310c4039ba615067243ebb26a4c7ebfd19bd4d57ff412a4bb2a7958a0 +b85123950e30c048465bf32365d24a5d4b21fffc6183cdbf71643a07b87463989b72dd9a6a47f134856f704909a6b38f +944ea689aec1376f855c0bc9c51378ad06ff758a2c075b95a60b535b88b36eca0be11e4edb5152e98cb2137d6e749f27 +a6bef52cda22325e4c62d323e2a0e3fa91c5552fcfce951edfd52ad6f652bfdcc2341f1cd349e6b5d447924dc569bfe2 +b56bff8ffe981bfcb30791836da10b87f2ccbe17ed969e7f7a650af07d27ae0223805b1264d985148208483be50578a6 +8b209cac898dd580c82d854a553e2517497ad1a4cd198e1360b8b50639b380aee70ee4b87625d9b2278228ff644cd25c +877cce233fec74c7158b3c5bf108365e98238418b8a71f058f1aca44a0fd3a1021e3e9025bd11fe244d9fe0f5034ce7f +b1b871aeedb03d6f6accc99816b89f5958178738d8d8cd9717527d04363c80fdb5f6848122ae19fdbc450cfa11e753c8 +858aca51b9e5b0a724e88688d5124eb24c9faf01a3d465e74d31de6da315f311143f22f60201ea09f62c92f61f09d889 +8521d409615dfc8c8289e00f6aaa6297c2c4e1439b25952afd76aac641b81c70b9cef07cd58c1c0198382bddd2bd8544 +88647c3e41666b88acca42505f1f5da226937e0522b538fe0cebb724e9a99730ca2522989e94a96cac94109aef675c0f +b417fdaf719caf38854e89ce52031b30ce61a632e6c3135adec9002280e022d82ab0ea4ac5ebdb21f1f0169e4c37bcda +9367a6feb5e23ea2eab8ddd5e7bdf32b4d2419fad1c71a1ed327b77362d8942dad971a1c2e6f7073885149cdf0a0c339 +a71c5c08d50c57d094d6a4f02e97d3799bada92f238ffc07bd223bbe8379507b7310d20b28f5bbbf331e5e153515e491 +9630a9a3bcb044b51299c4d3d3388a4ff47308dd27be3229601985478c0f6b55faa7e20815d8694f910611396a9d0d45 +b0bfaf56a5aa59b48960aa7c1617e832e65c823523fb2a5cd44ba606800501cf873e8db1d0dda64065285743dc40786e \ No newline at end of file From a6c44c5551226ce5dbc05611f2c578f85e50319f Mon Sep 17 00:00:00 2001 From: textml <37575478+textml@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:13:47 +0800 Subject: [PATCH 085/107] feat(crypto): change ckzg4844 path --- .../tron/core/vm/PrecompiledContracts.java | 2 +- .../common/crypto}/ckzg4844/CKZG4844JNI.java | 2 +- .../crypto}/ckzg4844/CKZGException.java | 2 +- .../crypto}/ckzg4844/CellsAndProofs.java | 2 +- .../common/crypto}/ckzg4844/ProofAndY.java | 2 +- .../lib/aarch64/libckzg4844jni.dylib | Bin 259496 -> 0 bytes .../resources/lib/aarch64/libckzg4844jni.so | Bin 251848 -> 0 bytes .../main/resources/lib/amd64/ckzg4844jni.dll | Bin 288032 -> 0 bytes .../resources/lib/amd64/libckzg4844jni.so | Bin 293960 -> 0 bytes .../resources/lib/x86_64/libckzg4844jni.dylib | Bin 275232 -> 279944 bytes .../zen/KZGPointEvaluationInitService.java | 2 +- 11 files changed, 6 insertions(+), 6 deletions(-) rename crypto/src/main/java/{ethereum => org/tron/common/crypto}/ckzg4844/CKZG4844JNI.java (99%) rename crypto/src/main/java/{ethereum => org/tron/common/crypto}/ckzg4844/CKZGException.java (96%) rename crypto/src/main/java/{ethereum => org/tron/common/crypto}/ckzg4844/CellsAndProofs.java (91%) rename crypto/src/main/java/{ethereum => org/tron/common/crypto}/ckzg4844/ProofAndY.java (89%) delete mode 100755 crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib delete mode 100755 crypto/src/main/resources/lib/aarch64/libckzg4844jni.so delete mode 100755 crypto/src/main/resources/lib/amd64/ckzg4844jni.dll delete mode 100755 crypto/src/main/resources/lib/amd64/libckzg4844jni.so diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 1245bc23718..d3050b911c4 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -32,7 +32,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import ethereum.ckzg4844.CKZG4844JNI; +import org.tron.common.crypto.ckzg4844.CKZG4844JNI; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZG4844JNI.java similarity index 99% rename from crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java rename to crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZG4844JNI.java index 782e8e3710f..6f819650a81 100644 --- a/crypto/src/main/java/ethereum/ckzg4844/CKZG4844JNI.java +++ b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZG4844JNI.java @@ -1,4 +1,4 @@ -package ethereum.ckzg4844; +package org.tron.common.crypto.ckzg4844; import java.io.IOException; import java.io.InputStream; diff --git a/crypto/src/main/java/ethereum/ckzg4844/CKZGException.java b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZGException.java similarity index 96% rename from crypto/src/main/java/ethereum/ckzg4844/CKZGException.java rename to crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZGException.java index cbf087364d2..8ea9edf4548 100644 --- a/crypto/src/main/java/ethereum/ckzg4844/CKZGException.java +++ b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CKZGException.java @@ -1,4 +1,4 @@ -package ethereum.ckzg4844; +package org.tron.common.crypto.ckzg4844; import java.util.Arrays; diff --git a/crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CellsAndProofs.java similarity index 91% rename from crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java rename to crypto/src/main/java/org/tron/common/crypto/ckzg4844/CellsAndProofs.java index 7f57431acab..5d47538d73a 100644 --- a/crypto/src/main/java/ethereum/ckzg4844/CellsAndProofs.java +++ b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/CellsAndProofs.java @@ -1,4 +1,4 @@ -package ethereum.ckzg4844; +package org.tron.common.crypto.ckzg4844; public class CellsAndProofs { private final byte[] cells; diff --git a/crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/ProofAndY.java similarity index 89% rename from crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java rename to crypto/src/main/java/org/tron/common/crypto/ckzg4844/ProofAndY.java index ada1034ee4e..fdb093c1232 100644 --- a/crypto/src/main/java/ethereum/ckzg4844/ProofAndY.java +++ b/crypto/src/main/java/org/tron/common/crypto/ckzg4844/ProofAndY.java @@ -1,4 +1,4 @@ -package ethereum.ckzg4844; +package org.tron.common.crypto.ckzg4844; public class ProofAndY { private final byte[] proof; diff --git a/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib b/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib deleted file mode 100755 index 733aca4f74782cff6d4e47dadc4b99d37ebfd713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259496 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 pR`B~~GbooT0jA9(Mh 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±2@DOFMH$!0ihhALUl}dIEU;{qtSZRE%7v0I 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

eb3FKa*a? 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 (obfG_sY7Z^vvK%e{PpegF7DyBD5>IZGo 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 diff --git a/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll b/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll deleted file mode 100755 index 7be02e81985a87c7970cbc5805aeea3ff67eb624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288032 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

)@ks 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 z¬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ñ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 MMKuBFySz1^9(oot~ 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 diff --git a/crypto/src/main/resources/lib/x86_64/libckzg4844jni.dylib b/crypto/src/main/resources/lib/x86_64/libckzg4844jni.dylib index 7ab7c008aa9a8eda14deb34c7503033a19a798da..9b8a05c4ed7714badc55998d0ce0c8ee0996b979 100755 GIT binary patch delta 54549 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 delta 51406 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 Date: Mon, 10 Mar 2025 21:21:50 +0800 Subject: [PATCH 086/107] feat(crypto): add ckzg jni files and tests --- .../lib/aarch64/libckzg4844jni.dylib | Bin 0 -> 259976 bytes .../resources/lib/aarch64/libckzg4844jni.so | Bin 0 -> 359168 bytes .../main/resources/lib/amd64/ckzg4844jni.dll | Bin 0 -> 299844 bytes .../runtime/vm/PrecompiledContractsTest.java | 2 +- .../core/zksnark/KZGPointEvaluationTest.java | 27 ++++++++++++++---- 5 files changed, 23 insertions(+), 6 deletions(-) create mode 100755 crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib create mode 100644 crypto/src/main/resources/lib/aarch64/libckzg4844jni.so create mode 100644 crypto/src/main/resources/lib/amd64/ckzg4844jni.dll diff --git a/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib b/crypto/src/main/resources/lib/aarch64/libckzg4844jni.dylib new file mode 100755 index 0000000000000000000000000000000000000000..ad11c215f34bf5e7706d9bb8308351a9d8315c84 GIT binary patch literal 259976 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�O71r%HE6S8RdBQXNdn`&B=!ghl1bTP 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

5>{~YQ2 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 V;?Q@=>ZkwfqNG1JkRWhr{vBp4BEA3s literal 0 HcmV?d00001 diff --git a/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll b/crypto/src/main/resources/lib/amd64/ckzg4844jni.dll new file mode 100644 index 0000000000000000000000000000000000000000..5dd62ba322aa903663b9865a28644468ef487f2b GIT binary patch literal 299844 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

`-al2-bxjL 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%0A5RIOzn6YqJ?+C(z>i>dZu(=0=Jx{Tlo7kA}C2B znagHJQWSc9q>{>-<^6=r2N)t2*BjAD`tY~~I*&wO7Cj?sj8x;fc4P<9Pc?@J*6Bbo zFY;bnxzMe*f(^u@9KA~%57u(+L(%JSTNm?%?0!7|F+?{qvh?&muVJbzd|yYoP`IKQ zXP&uu69%9JDoAy2+P&u3cy$7A-$j#Gjl?kmdFpX501pSeUuRn|8?-AT-Xhm#3KrC@ zaMzfpA>aZS9$3&?W^PdY8c!Mz<G;Y=!r=?R;;doY@o?jl5W8*e>w zKd4?+#1SsL(<_racIj|?Ji2#=K%Hd;dAe+6O2i`{qtSp;{CyF(<;bpz+*GXjVqBzm z3Ox-N!z5n5^0X~_tE<3S2P@YtyJ#1lS?@Rboj&0RKMII@`YH>E1<>m z=k26b4?|6CB#ZNM?;w-4f>3^#LPtTGrrvE0J@Ru9GlziHx5-$OABvi(Vex*{9{FU0 z-xrVW##_OjF%}Paq$&sL)El*g_gP`d`|>J^jklQP;HT=Gf=j;R?>J_ECtI;qUo)4K zH*XaLvZS5~l0BB{v6`WwZ{;(g&3Mc(8K?G2J(9|$tns~leMtlq%FbWPVEV;sSvPJ7$jJibi@ygpb3J*QtMo;I8nDKEjOh$B(|8}= zmX$yCF5hA=-tg23nFf@YFe=$U#84dA!^I4m?U46OAH~?G+#^fASAA(5Ju;ut zczR?$T<|<1!$?CtkqWj-**g?$`=0(m=2kDkJm9yAm|E`I)R{+@u?pVRMW;)o#KY9u}a#} zy-HY|itz%8;6c~KKPIL^$vYN^hANDk=N;&W#O vXKltzg@0&Q=N&Ig$aov@T?zSNpT%QjKKdF8;Nv= literal 0 HcmV?d00001 diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java index 0f1b8754fd5..4a7b63c8aba 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java @@ -1171,7 +1171,7 @@ private static byte[] encodeMultiWord(byte[]... words) { } @Test - public void ckzgPointEvaluationTest() { + public void kzgPointEvaluationTest() { VMConfig.initAllowTvmBlob(1); PrecompiledContract contract = diff --git a/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java index 24e2f9f0f1c..2aa90c602a0 100644 --- a/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java @@ -1,21 +1,38 @@ package org.tron.core.zksnark; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import org.junit.Test; -import org.tron.common.BaseTest; +import org.tron.common.crypto.ckzg4844.CKZG4844JNI; import org.tron.core.zen.KZGPointEvaluationInitService; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; + @Slf4j -public class KZGPointEvaluationTest extends BaseTest { +public class KZGPointEvaluationTest { @Test - public void testKZGPointEvaluation() { - KZGPointEvaluationInitService.freeSetup(); - + public void testVerifyBlobKzgProof() { KZGPointEvaluationInitService.initCKZG4844(); + byte[] blob = new byte[131072]; + blob[0] = 0x01; + byte[] commitment = CKZG4844JNI.blobToKzgCommitment(blob); + byte[] expectedCommitment = + Hex.decode("a70477b56251e8770969c83eaed665d3ab99b96b72270a41009f27" + + "52b5c06a06bd089ad48952c12b1dbf83dccd9d373f"); + assertArrayEquals(expectedCommitment, commitment); + byte[] proof = CKZG4844JNI.computeBlobKzgProof(blob, commitment); + byte[] expectedProof = + Hex.decode("b7f576f2442febaa035d3c6f34bbdad6acebcaec70236ff40b3373b" + + "d2ca00547d3ca7bb1d0ed3e728ca9dab610a4cfa4"); + assertArrayEquals(expectedProof, proof); + boolean isValidProof = CKZG4844JNI.verifyBlobKzgProof(blob, commitment, proof); + assertTrue(isValidProof); + KZGPointEvaluationInitService.freeSetup(); } } From ca576307c942de20bc97ede8dd1fe4b0d33e05b1 Mon Sep 17 00:00:00 2001 From: Liulei Date: Mon, 10 Mar 2025 21:42:23 +0800 Subject: [PATCH 087/107] feat(crypto): add linux jni file --- .../main/resources/lib/amd64/libckzg4844jni.so | Bin 0 -> 287584 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 crypto/src/main/resources/lib/amd64/libckzg4844jni.so diff --git a/crypto/src/main/resources/lib/amd64/libckzg4844jni.so b/crypto/src/main/resources/lib/amd64/libckzg4844jni.so new file mode 100644 index 0000000000000000000000000000000000000000..047cbd6daab82aeb2b95862575ae1fce22325dec GIT binary patch literal 287584 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 Date: Tue, 11 Mar 2025 00:00:58 +0800 Subject: [PATCH 088/107] opt(crypto): opt blob precompiled return value --- .../main/java/org/tron/core/vm/PrecompiledContracts.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index d3050b911c4..8a1e7535754 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -1,6 +1,8 @@ package org.tron.core.vm; import static java.util.Arrays.copyOfRange; +import static org.tron.common.crypto.ckzg4844.CKZG4844JNI.BLS_MODULUS; +import static org.tron.common.crypto.ckzg4844.CKZG4844JNI.FIELD_ELEMENTS_PER_BLOB; import static org.tron.common.math.Maths.max; import static org.tron.common.math.Maths.min; import static org.tron.common.runtime.vm.DataWord.WORD_SIZE; @@ -40,7 +42,6 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; -import org.bouncycastle.util.encoders.Hex; import org.tron.common.crypto.Blake2bfMessageDigest; import org.tron.common.crypto.Hash; import org.tron.common.crypto.SignUtils; @@ -2204,9 +2205,9 @@ public static class KZGPointEvaluation extends PrecompiledContract { private static final int BLOB_VERIFY_INPUT_LENGTH = 192; private static final byte BLOB_COMMITMENT_VERSION_KZG = 0x01; - private static final byte[] BLOB_PRECOMPILED_RETURN_VALUE = Hex.decode( - "0000000000000000000000000000000000000000000000000000000000001000" + - "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); + private static final byte[] BLOB_PRECOMPILED_RETURN_VALUE = + ByteUtil.merge(ByteUtil.longTo32Bytes(FIELD_ELEMENTS_PER_BLOB), + ByteUtil.bigIntegerToBytes(BLS_MODULUS, 32)); @Override public long getEnergyForData(byte[] data) { From c9b7fbc47eaacff5526c77ec369cba88856ac0b0 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Sun, 9 Mar 2025 19:15:07 +0800 Subject: [PATCH 089/107] feat(service): exit when params init failed 1. The node is witness, but no private key is configured 2. The configured rate limiter is not working as expected. 3. Configured auto-stop block time parsing error --- .../org/tron/core/exception/TronError.java | 2 + .../java/org/tron/core/config/args/Args.java | 5 +- .../services/http/RateLimiterServlet.java | 21 +++++--- .../vm/BandWidthRuntimeOutOfTimeTest.java | 1 - ...andWidthRuntimeOutOfTimeWithCheckTest.java | 1 - .../runtime/vm/BandWidthRuntimeTest.java | 1 - .../vm/BandWidthRuntimeWithCheckTest.java | 1 - .../leveldb/LevelDbDataSourceImplTest.java | 11 ++-- .../leveldb/RocksDbDataSourceImplTest.java | 11 ++-- .../org/tron/core/ForkControllerTest.java | 2 +- .../tron/core/capsule/AccountCapsuleTest.java | 2 +- .../core/capsule/utils/AssetUtilTest.java | 2 +- .../org/tron/core/config/args/ArgsTest.java | 6 +-- .../tron/core/consensus/DposServiceTest.java | 10 +++- .../java/org/tron/core/db/ManagerTest.java | 16 +++--- .../tron/core/db/TransactionStoreTest.java | 2 +- .../tron/core/db/TransactionTraceTest.java | 1 - .../java/org/tron/core/db/TxCacheDBTest.java | 2 +- .../core/db/api/AssetUpdateHelperTest.java | 2 +- .../tron/core/db2/SnapshotManagerTest.java | 12 ++--- .../tron/core/event/BlockEventGetTest.java | 2 +- .../tron/core/exception/TronErrorTest.java | 50 +++++++++++++++++++ .../prometheus/PrometheusApiServiceTest.java | 2 +- .../tron/core/net/TronNetDelegateTest.java | 2 +- .../InventoryMsgHandlerTest.java | 2 +- .../java/org/tron/core/pbft/PbftApiTest.java | 2 +- .../tron/core/services/ComputeRewardTest.java | 10 ++-- .../http/TriggerSmartContractServletTest.java | 2 +- .../services/stop/ConditionallyStopTest.java | 2 +- .../tron/core/zksnark/LibrustzcashTest.java | 1 - .../org/tron/core/zksnark/MerkleTreeTest.java | 1 - 31 files changed, 112 insertions(+), 75 deletions(-) diff --git a/common/src/main/java/org/tron/core/exception/TronError.java b/common/src/main/java/org/tron/core/exception/TronError.java index 8946a6528b3..9d11d249476 100644 --- a/common/src/main/java/org/tron/core/exception/TronError.java +++ b/common/src/main/java/org/tron/core/exception/TronError.java @@ -45,6 +45,8 @@ public enum ErrCode { TRON_NET_SERVICE_INIT(1), ZCASH_INIT(1), LOG_LOAD(1), + WITNESS_INIT(1), + RATE_LIMITER_INIT(1), SOLID_NODE_INIT(0); private final int code; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index aebff31e95d..1b19b68a23c 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -450,7 +450,8 @@ public static void setParam(final Config config) { if (PARAMETER.isWitness() && CollectionUtils.isEmpty(localWitnesses.getPrivateKeys())) { - logger.warn("This is a witness node, but localWitnesses is null"); + throw new TronError("This is a witness node, but localWitnesses is null", + TronError.ErrCode.WITNESS_INIT); } if (config.hasPath(Constant.VM_SUPPORT_CONSTANT)) { @@ -1141,7 +1142,7 @@ public static void setParam(final Config config) { PARAMETER.shutdownBlockTime = new CronExpression(config.getString( Constant.NODE_SHUTDOWN_BLOCK_TIME)); } catch (ParseException e) { - logger.error(e.getMessage(), e); + throw new TronError(e, TronError.ErrCode.AUTO_STOP_PARAMS); } } diff --git a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java index 805fa2785b1..fa59a72303d 100644 --- a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java @@ -16,6 +16,7 @@ import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.core.config.args.Args; +import org.tron.core.exception.TronError; import org.tron.core.services.ratelimiter.GlobalRateLimiter; import org.tron.core.services.ratelimiter.RateLimiterContainer; import org.tron.core.services.ratelimiter.RuntimeData; @@ -40,6 +41,7 @@ private void addRateContainer() { RateLimiterInitialization.HttpRateLimiterItem item = Args.getInstance() .getRateLimiterInitialization().getHttpMap().get(getClass().getSimpleName()); boolean success = false; + final String name = getClass().getSimpleName(); if (item != null) { String cName = ""; String params = ""; @@ -54,17 +56,15 @@ private void addRateContainer() { || c == IPQPSRateLimiterAdapter.class) { constructor = c.getConstructor(String.class); obj = constructor.newInstance(params); - container.add(KEY_PREFIX_HTTP, getClass().getSimpleName(), (IRateLimiter) obj); + container.add(KEY_PREFIX_HTTP, name, (IRateLimiter) obj); } else { constructor = c.getConstructor(); obj = constructor.newInstance(QpsStrategy.DEFAULT_QPS_PARAM); - container.add(KEY_PREFIX_HTTP, getClass().getSimpleName(), (IRateLimiter) obj); + container.add(KEY_PREFIX_HTTP, name, (IRateLimiter) obj); } success = true; } catch (Exception e) { - logger.warn("failure to add the rate limiter strategy. servlet = {}, " - + "strategy name = {}, params = \"{}\".", - getClass().getSimpleName(), cName, params); + this.throwTronError(cName, params, name, e); } } if (!success) { @@ -72,14 +72,19 @@ private void addRateContainer() { // then add a default Strategy. try { IRateLimiter rateLimiter = new DefaultBaseQqsAdapter(QpsStrategy.DEFAULT_QPS_PARAM); - container.add(KEY_PREFIX_HTTP, getClass().getSimpleName(), rateLimiter); + container.add(KEY_PREFIX_HTTP, name, rateLimiter); } catch (Exception e) { - logger.warn("failure to add the default rate limiter strategy. servlet = {}.", - getClass().getSimpleName()); + this.throwTronError("DefaultBaseQqsAdapter", QpsStrategy.DEFAULT_QPS_PARAM, name, e); } } } + private void throwTronError(String strategy, String params, String servlet, Exception e) { + throw new TronError("failure to add the rate limiter strategy. servlet = " + servlet + + ", strategy name = " + strategy + ", params = \"" + params + "\".", + e, TronError.ErrCode.RATE_LIMITER_INIT); + } + @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java index 30bba35b43c..582f5157b27 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java @@ -73,7 +73,6 @@ public class BandWidthRuntimeOutOfTimeTest extends BaseTest { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w", "--debug" }, "config-test-mainnet.conf" diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java index 0eef2266f9d..7e75f2b31d1 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java @@ -74,7 +74,6 @@ public class BandWidthRuntimeOutOfTimeWithCheckTest extends BaseTest { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w", "--debug" }, "config-test-mainnet.conf" diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index 698ba5f2923..40a4003f625 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -69,7 +69,6 @@ public static void init() { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w" }, "config-test-mainnet.conf" ); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java index 4b3331187e2..aae8cb5702d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java @@ -76,7 +76,6 @@ public class BandWidthRuntimeWithCheckTest extends BaseTest { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w" }, "config-test-mainnet.conf" ); diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java index 03bf7b21956..bf18b988f19 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -41,9 +42,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.utils.ByteArray; import org.tron.common.utils.FileUtil; @@ -74,9 +73,6 @@ public class LevelDbDataSourceImplTest { private byte[] key5 = "00000005aa".getBytes(); private byte[] key6 = "00000006aa".getBytes(); - @Rule - public final ExpectedException exception = ExpectedException.none(); - /** * Release resources. */ @@ -351,12 +347,11 @@ public void prefixQueryTest() { @Test public void initDbTest() { - exception.expect(TronError.class); makeExceptionDb("test_initDb"); LevelDbDataSourceImpl dataSource = new LevelDbDataSourceImpl( Args.getInstance().getOutputDirectory(), "test_initDb"); - dataSource.initDB(); - dataSource.closeDB(); + TronError thrown = assertThrows(TronError.class, dataSource::initDB); + assertEquals(TronError.ErrCode.LEVELDB_INIT, thrown.getErrCode()); } private void makeExceptionDb(String dbName) { diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java index b7846ac2d70..c6fce30e3af 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -23,9 +24,7 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.storage.rocksdb.RocksDbDataSourceImpl; import org.tron.common.utils.ByteArray; @@ -56,9 +55,6 @@ public class RocksDbDataSourceImplTest { private byte[] key5 = "00000005aa".getBytes(); private byte[] key6 = "00000006aa".getBytes(); - @Rule - public final ExpectedException exception = ExpectedException.none(); - /** * Release resources. */ @@ -393,12 +389,11 @@ public void prefixQueryTest() { @Test public void initDbTest() { - exception.expect(TronError.class); makeExceptionDb("test_initDb"); RocksDbDataSourceImpl dataSource = new RocksDbDataSourceImpl( Args.getInstance().getOutputDirectory(), "test_initDb"); - dataSource.initDB(); - dataSource.closeDB(); + TronError thrown = assertThrows(TronError.class, dataSource::initDB); + assertEquals(TronError.ErrCode.ROCKSDB_INIT, thrown.getErrCode()); } private void makeExceptionDb(String dbName) { diff --git a/framework/src/test/java/org/tron/core/ForkControllerTest.java b/framework/src/test/java/org/tron/core/ForkControllerTest.java index 74e651b3c1d..0b43db3e534 100644 --- a/framework/src/test/java/org/tron/core/ForkControllerTest.java +++ b/framework/src/test/java/org/tron/core/ForkControllerTest.java @@ -31,7 +31,7 @@ public class ForkControllerTest { @Before public void init() throws IOException { Args.setParam(new String[]{"-d", - temporaryFolder.newFolder().toString(), "-w"}, Constant.TEST_CONF); + temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); context = new TronApplicationContext(DefaultConfig.class); dynamicPropertiesStore = context.getBean(DynamicPropertiesStore.class); chainBaseManager = context.getBean(ChainBaseManager.class); diff --git a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java index 0ee0faa550a..7a217dfd787 100644 --- a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java @@ -36,7 +36,7 @@ public class AccountCapsuleTest extends BaseTest { static AccountCapsule accountCapsule; static { - Args.setParam(new String[]{"-d", dbPath(), "-w"}, Constant.TEST_CONF); + Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "a06a17a49648a8ad32055c06f60fa14ae46df91234"; } diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index 2b07d7d7952..b966b26a299 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -24,7 +24,7 @@ public class AssetUtilTest extends BaseTest { static { - Args.setParam(new String[] {"-d", dbPath(), "-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {"-d", dbPath()}, Constant.TEST_CONF); } public static byte[] randomBytes(int length) { diff --git a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java index 196941328b4..845f70a38a4 100644 --- a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java @@ -57,7 +57,7 @@ public void destroy() { @Test public void get() { - Args.setParam(new String[] {"-w", "-c", Constant.TEST_CONF}, Constant.TESTNET_CONF); + Args.setParam(new String[] {"-c", Constant.TEST_CONF}, Constant.TESTNET_CONF); CommonParameter parameter = Args.getInstance(); @@ -132,7 +132,7 @@ public void get() { @Test public void testIpFromLibP2p() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {}, Constant.TEST_CONF); CommonParameter parameter = Args.getInstance(); String configuredExternalIp = parameter.getNodeExternalIp(); @@ -153,7 +153,7 @@ public void testIpFromLibP2p() @Test public void testOldRewardOpt() { thrown.expect(IllegalArgumentException.class); - Args.setParam(new String[] {"-w", "-c", "args-test.conf"}, Constant.TESTNET_CONF); + Args.setParam(new String[] {"-c", "args-test.conf"}, Constant.TESTNET_CONF); } @Test diff --git a/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java index ce66db2ab96..dc6802d71d5 100644 --- a/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java +++ b/framework/src/test/java/org/tron/core/consensus/DposServiceTest.java @@ -4,6 +4,7 @@ import com.google.protobuf.ByteString; import java.lang.reflect.Field; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -21,6 +22,12 @@ public class DposServiceTest { DposService service = new DposService(); + + @AfterClass + public static void destroy() { + Args.clearParam(); + } + @Test public void testValidBlockTime() throws Exception { long headTime = 1724036757000L; @@ -53,8 +60,7 @@ public void testValidBlockTime() throws Exception { @Test public void testValidSlot() throws Exception { - Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); - CommonParameter parameter = Args.getInstance(); + Args.setParam(new String[] {}, Constant.TEST_CONF); long headTime = 1724036757000L; ByteString witness = ByteString.copyFrom(NetUtil.getNodeId()); ByteString witness2 = ByteString.copyFrom(NetUtil.getNodeId()); diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index a9cf1087c2a..db219377b74 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -32,7 +32,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.application.TronApplicationContext; import org.tron.common.crypto.ECKey; @@ -115,8 +114,6 @@ public class ManagerTest extends BlockGenerate { private static BlockCapsule blockCapsule2; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); - @Rule - public final ExpectedException exception = ExpectedException.none(); private static AtomicInteger port = new AtomicInteger(0); private static String accountAddress = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -126,7 +123,7 @@ public class ManagerTest extends BlockGenerate { @Before public void init() throws IOException { Args.setParam(new String[]{"-d", - temporaryFolder.newFolder().toString(), "-w"}, Constant.TEST_CONF); + temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); context = new TronApplicationContext(DefaultConfig.class); @@ -726,7 +723,7 @@ public void fork() BadBlockException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, ZksnarkException, EventBloomException { - Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); + Args.setParam(new String[]{}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); // System.out.print("block store size:" + size + "\n"); String key = PublicMethod.getRandomPrivateKey(); @@ -873,7 +870,7 @@ public void doNotSwitch() TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, ZksnarkException, EventBloomException { - Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); + Args.setParam(new String[]{}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); System.out.print("block store size:" + size + "\n"); String key = PublicMethod.getRandomPrivateKey(); @@ -985,7 +982,7 @@ public void switchBack() BadBlockException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, ZksnarkException, EventBloomException { - Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); + Args.setParam(new String[]{}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); System.out.print("block store size:" + size + "\n"); String key = PublicMethod.getRandomPrivateKey();; @@ -1238,10 +1235,11 @@ public void testExpiration() { @Test public void blockTrigger() { - exception.expect(TronError.class); Manager manager = spy(new Manager()); doThrow(new RuntimeException("postBlockTrigger mock")).when(manager).postBlockTrigger(any()); - manager.blockTrigger(new BlockCapsule(Block.newBuilder().build()), 1, 1); + TronError thrown = Assert.assertThrows(TronError.class, () -> + manager.blockTrigger(new BlockCapsule(Block.newBuilder().build()), 1, 1)); + Assert.assertEquals(TronError.ErrCode.EVENT_SUBSCRIBE_ERROR, thrown.getErrCode()); } public void adjustBalance(AccountStore accountStore, byte[] accountAddress, long amount) diff --git a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java index deeb135373f..21d34fb7a69 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java @@ -50,7 +50,7 @@ public class TransactionStoreTest extends BaseTest { */ @BeforeClass public static void init() { - Args.setParam(new String[]{"--output-directory", dbPath(), "-w"}, Constant.TEST_CONF); + Args.setParam(new String[]{"--output-directory", dbPath()}, Constant.TEST_CONF); } /** diff --git a/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java b/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java index 161fbea9569..08848fc9da1 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java @@ -65,7 +65,6 @@ public class TransactionTraceTest extends BaseTest { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w", "--debug" }, "config-test-mainnet.conf" diff --git a/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java b/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java index 55557cf51b5..4d223e726ca 100644 --- a/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java +++ b/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java @@ -20,7 +20,7 @@ public static void init() { String dbDirectory = "db_TransactionCache_test"; String indexDirectory = "index_TransactionCache_test"; Args.setParam(new String[]{"--output-directory", dbPath(), "--storage-db-directory", - dbDirectory, "--storage-index-directory", indexDirectory, "-w"}, Constant.TEST_CONF); + dbDirectory, "--storage-index-directory", indexDirectory}, Constant.TEST_CONF); } @Test diff --git a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java index ed18b1be97d..d1edd92c109 100644 --- a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java +++ b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java @@ -27,7 +27,7 @@ public class AssetUpdateHelperTest extends BaseTest { private static boolean init; static { - Args.setParam(new String[]{"-d", dbPath(), "-w"}, "config-test-index.conf"); + Args.setParam(new String[]{"-d", dbPath()}, "config-test-index.conf"); Args.getInstance().setSolidityNode(true); } diff --git a/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java b/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java index 87834246fba..134dc99e51c 100644 --- a/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java +++ b/framework/src/test/java/org/tron/core/db2/SnapshotManagerTest.java @@ -15,9 +15,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -43,8 +41,6 @@ public class SnapshotManagerTest { private Application appT; private TestRevokingTronStore tronDatabase; - @Rule - public ExpectedException thrown = ExpectedException.none(); @Before public void init() { @@ -122,19 +118,19 @@ public synchronized void testClose() { @Test public void testCheckError() { - thrown.expect(TronError.class); SnapshotManager manager = spy(new SnapshotManager("")); when(manager.getCheckpointList()).thenReturn(Arrays.asList("check1", "check2")); - manager.check(); + TronError thrown = Assert.assertThrows(TronError.class, manager::check); + Assert.assertEquals(TronError.ErrCode.CHECKPOINT_VERSION, thrown.getErrCode()); } @Test public void testFlushError() { - thrown.expect(TronError.class); SnapshotManager manager = spy(new SnapshotManager("")); manager.setUnChecked(false); when(manager.getCheckpointList()).thenReturn(Arrays.asList("check1", "check2")); when(manager.shouldBeRefreshed()).thenReturn(true); - manager.flush(); + TronError thrown = Assert.assertThrows(TronError.class, manager::flush); + Assert.assertEquals(TronError.ErrCode.DB_FLUSH, thrown.getErrCode()); } } diff --git a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java index 14479566815..704dc9ddc49 100644 --- a/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java +++ b/framework/src/test/java/org/tron/core/event/BlockEventGetTest.java @@ -78,7 +78,7 @@ protected void initDbPath() throws IOException { public void before() throws IOException { initDbPath(); logger.info("Full node running."); - Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {"-d", dbPath}, Constant.TEST_CONF); Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); context = new TronApplicationContext(DefaultConfig.class); diff --git a/framework/src/test/java/org/tron/core/exception/TronErrorTest.java b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java index 3176a62f56c..b4c3dc4b07f 100644 --- a/framework/src/test/java/org/tron/core/exception/TronErrorTest.java +++ b/framework/src/test/java/org/tron/core/exception/TronErrorTest.java @@ -5,8 +5,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mockStatic; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import com.typesafe.config.ConfigObject; import java.io.IOException; import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.junit.After; import org.junit.Assert; import org.junit.Rule; @@ -17,7 +23,13 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.tron.common.log.LogService; +import org.tron.common.parameter.RateLimiterInitialization; +import org.tron.common.utils.ReflectUtils; import org.tron.common.zksnark.JLibrustzcash; +import org.tron.core.Constant; +import org.tron.core.config.args.Args; +import org.tron.core.services.http.GetBlockServlet; +import org.tron.core.services.http.RateLimiterServlet; import org.tron.core.zen.ZksnarkInitService; @RunWith(MockitoJUnitRunner.class) @@ -29,6 +41,7 @@ public class TronErrorTest { @After public void clearMocks() { Mockito.clearAllCaches(); + Args.clearParam(); } @Test @@ -64,4 +77,41 @@ public void LogLoadTest() throws IOException { TronError thrown = assertThrows(TronError.class, () -> LogService.load(path.toString())); assertEquals(TronError.ErrCode.LOG_LOAD, thrown.getErrCode()); } + + @Test + public void witnessInitTest() { + TronError thrown = assertThrows(TronError.class, () -> { + Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); + }); + assertEquals(TronError.ErrCode.WITNESS_INIT, thrown.getErrCode()); + } + + @Test + public void rateLimiterServletInitTest() { + Args.setParam(new String[]{}, Constant.TEST_CONF); + RateLimiterInitialization rateLimiter = new RateLimiterInitialization(); + Args.getInstance().setRateLimiterInitialization(rateLimiter); + Map item = new HashMap<>(); + item.put("strategy", "strategy"); + item.put("paramString", "params"); + item.put("component", "GetBlockServlet"); + ConfigObject config = ConfigFactory.parseMap(item).root(); + rateLimiter.setHttpMap( + Collections.singletonList(new RateLimiterInitialization.HttpRateLimiterItem(config))); + RateLimiterServlet servlet = new GetBlockServlet(); + TronError thrown = assertThrows(TronError.class, () -> + ReflectUtils.invokeMethod(servlet, "addRateContainer")); + assertEquals(TronError.ErrCode.RATE_LIMITER_INIT, thrown.getErrCode()); + } + + @Test + public void shutdownBlockTimeInitTest() { + Map params = new HashMap<>(); + params.put(Constant.NODE_SHUTDOWN_BLOCK_TIME, "0"); + params.put("storage.db.directory", "database"); + Config config = ConfigFactory.defaultOverrides().withFallback( + ConfigFactory.parseMap(params)); + TronError thrown = assertThrows(TronError.class, () -> Args.setParam(config)); + assertEquals(TronError.ErrCode.AUTO_STOP_PARAMS, thrown.getErrCode()); + } } diff --git a/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java b/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java index 1c6e56cbbbe..195e4749209 100644 --- a/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java +++ b/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java @@ -55,7 +55,7 @@ public class PrometheusApiServiceTest extends BaseTest { private ChainBaseManager chainManager; static { - Args.setParam(new String[] {"-d", dbPath(), "-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {"-d", dbPath()}, Constant.TEST_CONF); Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); initParameter(Args.getInstance()); Metrics.init(); diff --git a/framework/src/test/java/org/tron/core/net/TronNetDelegateTest.java b/framework/src/test/java/org/tron/core/net/TronNetDelegateTest.java index 727aad9dccb..6550766d702 100644 --- a/framework/src/test/java/org/tron/core/net/TronNetDelegateTest.java +++ b/framework/src/test/java/org/tron/core/net/TronNetDelegateTest.java @@ -17,7 +17,7 @@ public class TronNetDelegateTest { @Test public void test() throws Exception { - Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {}, Constant.TEST_CONF); CommonParameter parameter = Args.getInstance(); Args.logConfig(); parameter.setUnsolidifiedBlockCheck(true); diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/InventoryMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/InventoryMsgHandlerTest.java index 7aba0251708..0864c872bc3 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/InventoryMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/InventoryMsgHandlerTest.java @@ -21,7 +21,7 @@ public class InventoryMsgHandlerTest { @Test public void testProcessMessage() throws Exception { InventoryMsgHandler handler = new InventoryMsgHandler(); - Args.setParam(new String[] {"-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {}, Constant.TEST_CONF); Args.logConfig(); InventoryMessage msg = new InventoryMessage(new ArrayList<>(), InventoryType.TRX); diff --git a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java index a7fb2644495..3d5096a5702 100755 --- a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java +++ b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java @@ -37,7 +37,7 @@ public class PbftApiTest extends BaseTest { @BeforeClass public static void init() { - Args.setParam(new String[]{"-d", dbPath(), "-w"}, Constant.TEST_CONF); + Args.setParam(new String[]{"-d", dbPath()}, Constant.TEST_CONF); CommonParameter.getInstance().setPBFTHttpEnable(true); CommonParameter.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); } diff --git a/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java b/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java index 8ff6b62d7ef..c2caafd393c 100644 --- a/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java +++ b/framework/src/test/java/org/tron/core/services/ComputeRewardTest.java @@ -17,7 +17,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.tron.common.application.TronApplicationContext; import org.tron.common.error.TronDBException; @@ -115,9 +114,6 @@ public class ComputeRewardTest { @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); - @Rule - public final ExpectedException exception = ExpectedException.none(); - @After public void destroy() { context.destroy(); @@ -264,7 +260,6 @@ private void setUp() { @Test public void query() { - exception.expect(TronError.class); Assert.assertEquals(3189, mortgageService.queryReward(OWNER_ADDRESS)); // mock root is error rewardViStore.put("test".getBytes(), "test".getBytes()); @@ -288,8 +283,9 @@ public void query() { propertiesStore.saveNewRewardAlgorithmEffectiveCycle(); propertiesStore.saveCurrentCycleNumber(5); rewardViStore.close(); - ReflectUtils.invokeMethod(rewardViCalService,"maybeRun"); - + TronError thrown = Assert.assertThrows(TronError.class, () -> + ReflectUtils.invokeMethod(rewardViCalService,"maybeRun")); + Assert.assertEquals(TronError.ErrCode.REWARD_VI_CALCULATOR, thrown.getErrCode()); } static class Vote { diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index 4cbb729a787..c6fa5da76e4 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -31,7 +31,7 @@ public class TriggerSmartContractServletTest extends BaseTest { @BeforeClass public static void init() throws Exception { Args.setParam( - new String[]{"--output-directory", dbPath(), "--debug", "--witness"}, Constant.TEST_CONF); + new String[]{"--output-directory", dbPath(), "--debug"}, Constant.TEST_CONF); Args.getInstance().needSyncCheck = false; Args.getInstance().setFullNodeHttpEnable(true); Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); diff --git a/framework/src/test/java/org/tron/core/services/stop/ConditionallyStopTest.java b/framework/src/test/java/org/tron/core/services/stop/ConditionallyStopTest.java index dc3d02e7ced..b417b27b380 100644 --- a/framework/src/test/java/org/tron/core/services/stop/ConditionallyStopTest.java +++ b/framework/src/test/java/org/tron/core/services/stop/ConditionallyStopTest.java @@ -82,7 +82,7 @@ public void init() throws Exception { initDbPath(); logger.info("Full node running."); - Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); + Args.setParam(new String[] {"-d", dbPath}, Constant.TEST_CONF); Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); initParameter(Args.getInstance()); diff --git a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java index 915742d3f0d..049fb2528b1 100644 --- a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java @@ -80,7 +80,6 @@ public static void init() { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w", "--debug" }, "config-test-mainnet.conf" diff --git a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java index cb70adb35a2..faea3780135 100644 --- a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java @@ -36,7 +36,6 @@ public class MerkleTreeTest extends BaseTest { "--output-directory", dbPath(), "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, - "-w", "--debug" }, "config-test-mainnet.conf" From a6bf35cc3a4ba22c9a866883418c2084784b83e6 Mon Sep 17 00:00:00 2001 From: Liulei Date: Tue, 11 Mar 2025 10:48:08 +0800 Subject: [PATCH 090/107] feat(test): refactor codes --- .../zen/KZGPointEvaluationInitService.java | 22 +- .../runtime/vm/PrecompiledContractsTest.java | 17 +- .../core/actuator/utils/ProposalUtilTest.java | 108 + .../core/zksnark/KZGPointEvaluationTest.java | 57 +- .../resources/kzg-trusted-setups/test.txt | 8259 +++++++++++++++++ 5 files changed, 8440 insertions(+), 23 deletions(-) create mode 100644 framework/src/test/resources/kzg-trusted-setups/test.txt diff --git a/framework/src/main/java/org/tron/core/zen/KZGPointEvaluationInitService.java b/framework/src/main/java/org/tron/core/zen/KZGPointEvaluationInitService.java index bb3710f9673..cc37b79757c 100644 --- a/framework/src/main/java/org/tron/core/zen/KZGPointEvaluationInitService.java +++ b/framework/src/main/java/org/tron/core/zen/KZGPointEvaluationInitService.java @@ -3,36 +3,42 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.PostConstruct; - -import org.tron.common.crypto.ckzg4844.CKZG4844JNI; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Component; +import org.tron.common.crypto.ckzg4844.CKZG4844JNI; @Slf4j @Component public class KZGPointEvaluationInitService { + private static final AtomicBoolean loaded = new AtomicBoolean(false); + @PostConstruct private void init() { initCKZG4844(); } public static void freeSetup() { - CKZG4844JNI.freeTrustedSetup(); + if (loaded.compareAndSet(true, false)) { + CKZG4844JNI.freeTrustedSetup(); + } } public static void initCKZG4844() { - logger.info("init ckzg 4844 begin"); + if (loaded.compareAndSet(false, true)) { + logger.info("init ckzg 4844 begin"); - CKZG4844JNI.loadNativeLibrary(); + CKZG4844JNI.loadNativeLibrary(); - String setupFile = getSetupFile("trusted_setup.txt"); + String setupFile = getSetupFile("trusted_setup.txt"); - CKZG4844JNI.loadTrustedSetup(setupFile, 0); + CKZG4844JNI.loadTrustedSetup(setupFile, 0); - logger.info("init ckzg 4844 done"); + logger.info("init ckzg 4844 done"); + } } private static String getSetupFile(String fileName) { diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java index 4a7b63c8aba..b419809795c 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java @@ -40,8 +40,6 @@ import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.repository.Repository; import org.tron.core.vm.repository.RepositoryImpl; -import org.tron.core.zen.KZGPointEvaluationInitService; -import org.tron.core.zen.ZksnarkInitService; import org.tron.protos.Protocol; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Proposal.State; @@ -1179,13 +1177,14 @@ public void kzgPointEvaluationTest() { Repository tempRepository = RepositoryImpl.createRoot(StoreFactory.getInstance()); contract.setRepository(tempRepository); - byte[] versionedHash = Hex.decode("015a4cab4911426699ed34483de6640cf55a568afc5c5edffdcbd8bcd4452f68"); + byte[] versionedHash = + Hex.decode("015a4cab4911426699ed34483de6640cf55a568afc5c5edffdcbd8bcd4452f68"); byte[] z = Hex.decode("0000000000000000000000000000000000000000000000000000000000000065"); byte[] y = Hex.decode("60f557194475973322b33dc989896381844508234bfa6fbeefe5fa165ae15a0a"); - byte[] commitment = Hex.decode("a70477b56251e8770969c83eaed665d3ab99b96b72270a4" + - "1009f2752b5c06a06bd089ad48952c12b1dbf83dccd9d373f"); - byte[] proof = Hex.decode("879f9a41956deae578bc65e7133f164394b8677bc2e7b1356be61" + - "d47720ed2a3326bfddebc67cd37ee9e7537d7814afe"); + byte[] commitment = Hex.decode("a70477b56251e8770969c83eaed665d3ab99b96b72270a4" + + "1009f2752b5c06a06bd089ad48952c12b1dbf83dccd9d373f"); + byte[] proof = Hex.decode("879f9a41956deae578bc65e7133f164394b8677bc2e7b1356be61" + + "d47720ed2a3326bfddebc67cd37ee9e7537d7814afe"); byte[] data = new byte[192]; System.arraycopy(versionedHash, 0, data, 0, 32); @@ -1213,8 +1212,8 @@ public void kzgPointEvaluationTest() { res = contract.execute(data); byte[] expected = Hex.decode( - "0000000000000000000000000000000000000000000000000000000000001000" + - "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); + "0000000000000000000000000000000000000000000000000000000000001000" + + "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); Assert.assertTrue(res.getLeft()); Assert.assertArrayEquals(expected, res.getRight()); VMConfig.initAllowTvmBlob(0); diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index 1cfc4d1887f..e8a1e862f54 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -435,6 +435,10 @@ public void validateCheck() { testConsensusLogicOptimizationProposal(); + testAllowTvmCancunProposal(); + + testAllowTvmBlobProposal(); + forkUtils.getManager().getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionEnum.ENERGY_LIMIT.getValue(), stats); forkUtils.reset(); @@ -551,6 +555,110 @@ private void testConsensusLogicOptimizationProposal() { } + private void testAllowTvmCancunProposal() { + byte[] stats = new byte[27]; + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0.getValue(), stats); + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_CANCUN.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "Bad chain parameter id [ALLOW_TVM_CANCUN]", + e.getMessage()); + } + + long maintenanceTimeInterval = forkUtils.getManager().getDynamicPropertiesStore() + .getMaintenanceTimeInterval(); + + long hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_8_0.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + + stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0.getValue(), stats); + + // Should fail because the proposal value is invalid + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_CANCUN.getCode(), 2); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "This value[ALLOW_TVM_CANCUN] is only allowed to be 1", + e.getMessage()); + } + + dynamicPropertiesStore.saveAllowTvmCancun(1); + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_CANCUN.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "[ALLOW_TVM_CANCUN] has been valid, no need to propose again", + e.getMessage()); + } + + } + + private void testAllowTvmBlobProposal() { + byte[] stats = new byte[27]; + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0.getValue(), stats); + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_BLOB.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "Bad chain parameter id [ALLOW_TVM_BLOB]", + e.getMessage()); + } + + long maintenanceTimeInterval = forkUtils.getManager().getDynamicPropertiesStore() + .getMaintenanceTimeInterval(); + + long hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_8_0.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + + stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0.getValue(), stats); + + // Should fail because the proposal value is invalid + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_BLOB.getCode(), 2); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "This value[ALLOW_TVM_BLOB] is only allowed to be 1", + e.getMessage()); + } + + dynamicPropertiesStore.saveAllowTvmBlob(1); + try { + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_TVM_BLOB.getCode(), 1); + Assert.fail(); + } catch (ContractValidateException e) { + Assert.assertEquals( + "[ALLOW_TVM_BLOB] has been valid, no need to propose again", + e.getMessage()); + } + + } + @Test public void blockVersionCheck() { for (ForkBlockVersionEnum forkVersion : ForkBlockVersionEnum.values()) { diff --git a/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java index 2aa90c602a0..5f732520d48 100644 --- a/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/KZGPointEvaluationTest.java @@ -1,14 +1,16 @@ package org.tron.core.zksnark; +import java.util.Arrays; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; import org.junit.Test; import org.tron.common.crypto.ckzg4844.CKZG4844JNI; +import org.tron.common.crypto.ckzg4844.CKZGException; +import org.tron.common.crypto.ckzg4844.CellsAndProofs; +import org.tron.common.crypto.ckzg4844.ProofAndY; import org.tron.core.zen.KZGPointEvaluationInitService; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertTrue; - @Slf4j public class KZGPointEvaluationTest { @@ -22,16 +24,59 @@ public void testVerifyBlobKzgProof() { byte[] expectedCommitment = Hex.decode("a70477b56251e8770969c83eaed665d3ab99b96b72270a41009f27" + "52b5c06a06bd089ad48952c12b1dbf83dccd9d373f"); - assertArrayEquals(expectedCommitment, commitment); + Assert.assertArrayEquals(expectedCommitment, commitment); byte[] proof = CKZG4844JNI.computeBlobKzgProof(blob, commitment); byte[] expectedProof = Hex.decode("b7f576f2442febaa035d3c6f34bbdad6acebcaec70236ff40b3373b" + "d2ca00547d3ca7bb1d0ed3e728ca9dab610a4cfa4"); - assertArrayEquals(expectedProof, proof); + Assert.assertArrayEquals(expectedProof, proof); boolean isValidProof = CKZG4844JNI.verifyBlobKzgProof(blob, commitment, proof); - assertTrue(isValidProof); + Assert.assertTrue(isValidProof); + + byte[] z = + Hex.decode("0000000000000000000000000000000000000000000000000000000000000065"); + byte[] y = + Hex.decode("60f557194475973322b33dc989896381844508234bfa6fbeefe5fa165ae15a0a"); + ProofAndY proofAndY = CKZG4844JNI.computeKzgProof(blob, z); + byte[] expectedZProof = + Hex.decode("879f9a41956deae578bc65e7133f164394b8677bc2e7b1356be61" + + "d47720ed2a3326bfddebc67cd37ee9e7537d7814afe"); + Assert.assertArrayEquals(y, proofAndY.getY()); + Assert.assertArrayEquals(expectedZProof, proofAndY.getProof()); + + CellsAndProofs cellsAndProofs = CKZG4844JNI.computeCellsAndKzgProofs(blob); + byte[] blockCells = Arrays.copyOfRange(cellsAndProofs.getCells(), 0, 2048); + byte[] blockProof = Arrays.copyOfRange(cellsAndProofs.getProofs(), 0, 48); + long[] cellIndices = new long[1]; + boolean isValid = + CKZG4844JNI.verifyCellKzgProofBatch(commitment, cellIndices, blockCells, blockProof); + Assert.assertTrue(isValid); + + long[] errorCellIndices = new long[2]; + errorCellIndices[1] = 1; + CKZGException expectedE = new CKZGException(1, + "Invalid cellIndices size. Expected 1 bytes but got 2."); + try { + CKZG4844JNI.verifyCellKzgProofBatch(commitment, errorCellIndices, blockCells, blockProof); + } catch (Exception e) { + Assert.assertEquals(CKZGException.class, e.getClass()); + CKZGException exception = (CKZGException) e; + Assert.assertEquals(expectedE.getError(), exception.getError()); + Assert.assertEquals(expectedE.getErrorMessage(), exception.getErrorMessage()); + } + + try { + String testSetupResource = "/kzg-trusted-setups/test.txt"; + CKZG4844JNI.loadTrustedSetupFromResource( + testSetupResource, KZGPointEvaluationTest.class, 0); + } catch (Exception e) { + Assert.assertEquals(RuntimeException.class, e.getClass()); + Assert.assertEquals( + "Trusted Setup is already loaded. Free it before loading a new one.", + e.getMessage()); + } KZGPointEvaluationInitService.freeSetup(); } diff --git a/framework/src/test/resources/kzg-trusted-setups/test.txt b/framework/src/test/resources/kzg-trusted-setups/test.txt new file mode 100644 index 00000000000..5ecccf5e5e5 --- /dev/null +++ b/framework/src/test/resources/kzg-trusted-setups/test.txt @@ -0,0 +1,8259 @@ +4096 +65 +a0413c0dcafec6dbc9f47d66785cf1e8c981044f7d13cfe3e4fcbb71b5408dfde6312493cb3c1d30516cb3ca88c03654 +8b997fb25730d661918371bb41f2a6e899cac23f04fc5365800b75433c0a953250e15e7a98fb5ca5cc56a8cd34c20c57 +83302852db89424d5699f3f157e79e91dc1380f8d5895c5a772bb4ea3a5928e7c26c07db6775203ce33e62a114adaa99 +a759c48b7e4a685e735c01e5aa6ef9c248705001f470f9ad856cd87806983e917a8742a3bd5ee27db8d76080269b7c83 +967f8dc45ebc3be14c8705f43249a30ff48e96205fb02ae28daeab47b72eb3f45df0625928582aa1eb4368381c33e127 +a418eb1e9fb84cb32b370610f56f3cb470706a40ac5a47c411c464299c45c91f25b63ae3fcd623172aa0f273c0526c13 +8f44e3f0387293bc7931e978165abbaed08f53acd72a0a23ac85f6da0091196b886233bcee5b4a194db02f3d5a9b3f78 +97173434b336be73c89412a6d70d416e170ea355bf1956c32d464090b107c090ef2d4e1a467a5632fbc332eeb679bf2d +a24052ad8d55ad04bc5d951f78e14213435681594110fd18173482609d5019105b8045182d53ffce4fc29fc8810516c1 +b950768136b260277590b5bec3f56bbc2f7a8bc383d44ce8600e85bf8cf19f479898bcc999d96dfbd2001ede01d94949 +92ab8077871037bd3b57b95cbb9fb10eb11efde9191690dcac655356986fd02841d8fdb25396faa0feadfe3f50baf56d +a79b096dff98038ac30f91112dd14b78f8ad428268af36d20c292e2b3b6d9ed4fb28480bb04e465071cc67d05786b6d1 +b9ff71461328f370ce68bf591aa7fb13027044f42a575517f3319e2be4aa4843fa281e756d0aa5645428d6dfa857cef2 +8d765808c00b3543ff182e2d159c38ae174b12d1314da88ea08e13bd9d1c37184cb515e6bf6420531b5d41767987d7ce +b8c9a837d20c3b53e6f578e4a257bb7ef8fc43178614ec2a154915b267ad2be135981d01ed2ee1b5fbd9d9bb27f0800a +a9773d92cf23f65f98ef68f6cf95c72b53d0683af2f9bf886bb9036e4a38184b1131b26fd24397910b494fbef856f3aa +b41ebe38962d112da4a01bf101cb248d808fbd50aaf749fc7c151cf332032eb3e3bdbd716db899724b734d392f26c412 +90fbb030167fb47dcc13d604a726c0339418567c1d287d1d87423fa0cb92eec3455fbb46bcbe2e697144a2d3972142e4 +b11d298bd167464b35fb923520d14832bd9ed50ed841bf6d7618424fd6f3699190af21759e351b89142d355952149da1 +8bc36066f69dc89f7c4d1e58d67497675050c6aa002244cebd9fc957ec5e364c46bab4735ea3db02b73b3ca43c96e019 +ab7ab92c5d4d773068e485aa5831941ebd63db7118674ca38089635f3b4186833af2455a6fb9ed2b745df53b3ce96727 +af191ca3089892cb943cd97cf11a51f38e38bd9be50844a4e8da99f27e305e876f9ed4ab0628e8ae3939066b7d34a15f +a3204c1747feabc2c11339a542195e7cb6628fd3964f846e71e2e3f2d6bb379a5e51700682ea1844eba12756adb13216 +903a29883846b7c50c15968b20e30c471aeac07b872c40a4d19eb1a42da18b649d5bbfde4b4cf6225d215a461b0deb6d +8e6e9c15ffbf1e16e5865a5fef7ed751dc81957a9757b535cb38b649e1098cda25d42381dc4f776778573cdf90c3e6e0 +a8f6dd26100b512a8c96c52e00715c4b2cb9ac457f17aed8ffe1cf1ea524068fe5a1ddf218149845fc1417b789ecfc98 +a5b0ffc819451ea639cfd1c18cbc9365cc79368d3b2e736c0ae54eba2f0801e6eb0ee14a5f373f4a70ca463bdb696c09 +879f91ccd56a1b9736fbfd20d8747354da743fb121f0e308a0d298ff0d9344431890e41da66b5009af3f442c636b4f43 +81bf3a2d9755e206b515a508ac4d1109bf933c282a46a4ae4a1b4cb4a94e1d23642fad6bd452428845afa155742ade7e +8de778d4742f945df40004964e165592f9c6b1946263adcdd5a88b00244bda46c7bb49098c8eb6b3d97a0dd46148a8ca +b7a57b21d13121907ee28c5c1f80ee2e3e83a3135a8101e933cf57171209a96173ff5037f5af606e9fd6d066de6ed693 +b0877d1963fd9200414a38753dffd9f23a10eb3198912790d7eddbc9f6b477019d52ddd4ebdcb9f60818db076938a5a9 +88da2d7a6611bc16adc55fc1c377480c828aba4496c645e3efe0e1a67f333c05a0307f7f1d2df8ac013602c655c6e209 +95719eb02e8a9dede1a888c656a778b1c69b7716fbe3d1538fe8afd4a1bc972183c7d32aa7d6073376f7701df80116d8 +8e8a1ca971f2444b35af3376e85dccda3abb8e8e11d095d0a4c37628dfe5d3e043a377c3de68289ef142e4308e9941a0 +b720caaff02f6d798ac84c4f527203e823ff685869e3943c979e388e1c34c3f77f5c242c6daa7e3b30e511aab917b866 +86040d55809afeec10e315d1ad950d269d37cfee8c144cd8dd4126459e3b15a53b3e68df5981df3c2346d23c7b4baaf4 +82d8cabf13ab853db0377504f0aec00dba3a5cd3119787e8ad378ddf2c40b022ecfc67c642b7acc8c1e3dd03ab50993e +b8d873927936719d2484cd03a6687d65697e17dcf4f0d5aed6f5e4750f52ef2133d4645894e7ebfc4ef6ce6788d404c8 +b1235594dbb15b674a419ff2b2deb644ad2a93791ca05af402823f87114483d6aa1689b7a9bea0f547ad12fe270e4344 +a53fda86571b0651f5affb74312551a082fffc0385cfd24c1d779985b72a5b1cf7c78b42b4f7e51e77055f8e5e915b00 +b579adcfd9c6ef916a5a999e77a0cb21d378c4ea67e13b7c58709d5da23a56c2e54218691fc4ac39a4a3d74f88cc31f7 +ab79e584011713e8a2f583e483a91a0c2a40771b77d91475825b5acbea82db4262132901cb3e4a108c46d7c9ee217a4e +a0fe58ea9eb982d7654c8aaf9366230578fc1362f6faae0594f8b9e659bcb405dff4aac0c7888bbe07f614ecf0d800a6 +867e50e74281f28ecd4925560e2e7a6f8911b135557b688254623acce0dbc41e23ac3e706a184a45d54c586edc416eb0 +89f81b61adda20ea9d0b387a36d0ab073dc7c7cbff518501962038be19867042f11fcc7ff78096e5d3b68c6d8dc04d9b +a58ee91bb556d43cf01f1398c5811f76dc0f11efdd569eed9ef178b3b0715e122060ec8f945b4dbf6eebfa2b90af6fa6 +ac460be540f4c840def2eef19fc754a9af34608d107cbadb53334cf194cc91138d53b9538fcd0ec970b5d4aa455b224a +b09b91f929de52c09d48ca0893be6eb44e2f5210a6c394689dc1f7729d4be4e11d0474b178e80cea8c2ac0d081f0e811 +8d37a442a76b06a02a4e64c2504aea72c8b9b020ab7bcc94580fe2b9603c7c50d7b1e9d70d2a7daea19c68667e8f8c31 +a9838d4c4e3f3a0075a952cf7dd623307ec633fcc81a7cf9e52e66c31780de33dbb3d74c320dc7f0a4b72f7a49949515 +a44766b6251af458fe4f5f9ed1e02950f35703520b8656f09fc42d9a2d38a700c11a7c8a0436ac2e5e9f053d0bb8ff91 +ad78d9481c840f5202546bea0d13c776826feb8b1b7c72e83d99a947622f0bf38a4208551c4c41beb1270d7792075457 +b619ffa8733b470039451e224b777845021e8dc1125f247a4ff2476cc774657d0ff9c5279da841fc1236047de9d81c60 +af760b0a30a1d6af3bc5cd6686f396bd41779aeeb6e0d70a09349bd5da17ca2e7965afc5c8ec22744198fbe3f02fb331 +a0cc209abdb768b589fcb7b376b6e1cac07743288c95a1cf1a0354b47f0cf91fca78a75c1fcafa6f5926d6c379116608 +864add673c89c41c754eeb3cd8dcff5cdde1d739fce65c30e474a082bb5d813cba6412e61154ce88fdb6c12c5d9be35b +b091443b0ce279327dc37cb484e9a5b69b257a714ce21895d67539172f95ffa326903747b64a3649e99aea7bb10d03f7 +a8c452b8c4ca8e0a61942a8e08e28f17fb0ef4c5b018b4e6d1a64038280afa2bf1169202f05f14af24a06ca72f448ccd +a23c24721d18bc48d5dcf70effcbef89a7ae24e67158d70ae1d8169ee75d9a051d34b14e9cf06488bac324fe58549f26 +92a730e30eb5f3231feb85f6720489dbb1afd42c43f05a1610c6b3c67bb949ec8fde507e924498f4ffc646f7b07d9123 +8dbe5abf4031ec9ba6bb06d1a47dd1121fb9e03b652804069250967fd5e9577d0039e233441b7f837a7c9d67ba18c28e +aa456bcfef6a21bb88181482b279df260297b3778e84594ebddbdf337e85d9e3d46ca1d0b516622fb0b103df8ec519b7 +a3b31ae621bd210a2b767e0e6f22eb28fe3c4943498a7e91753225426168b9a26da0e02f1dc5264da53a5ad240d9f51b +aa8d66857127e6e71874ce2202923385a7d2818b84cb73a6c42d71afe70972a70c6bdd2aad1a6e8c5e4ca728382a8ea8 +ac7e8e7a82f439127a5e40558d90d17990f8229852d21c13d753c2e97facf077cf59582b603984c3dd3faebd80aff4f5 +93a8bcf4159f455d1baa73d2ef2450dcd4100420de84169bbe28b8b7a5d1746273f870091a87a057e834f754f34204b1 +89d0ebb287c3613cdcae7f5acc43f17f09c0213fc40c074660120b755d664109ffb9902ed981ede79e018ddb0c845698 +a87ccbfad431406aadbee878d9cf7d91b13649d5f7e19938b7dfd32645a43b114eef64ff3a13201398bd9b0337832e5a +833c51d0d0048f70c3eefb4e70e4ff66d0809c41838e8d2c21c288dd3ae9d9dfaf26d1742bf4976dab83a2b381677011 +8bcd6b1c3b02fffead432e8b1680bad0a1ac5a712d4225e220690ee18df3e7406e2769e1f309e2e803b850bc96f0e768 +b61e3dbd88aaf4ff1401521781e2eea9ef8b66d1fac5387c83b1da9e65c2aa2a56c262dea9eceeb4ad86c90211672db0 +866d3090db944ecf190dd0651abf67659caafd31ae861bab9992c1e3915cb0952da7c561cc7e203560a610f48fae633b +a5e8971543c14274a8dc892b0be188c1b4fbc75c692ed29f166e0ea80874bc5520c2791342b7c1d2fb5dd454b03b8a5b +8f2f9fc50471bae9ea87487ebd1bc8576ef844cc42d606af5c4c0969670fdf2189afd643e4de3145864e7773d215f37f +b1bb0f2527db6d51f42b9224383c0f96048bbc03d469bf01fe1383173ef8b1cc9455d9dd8ba04d46057f46949bfc92b5 +aa7c99d906b4d7922296cfe2520473fc50137c03d68b7865c5bfb8adbc316b1034310ec4b5670c47295f4a80fb8d61e9 +a5d1da4d6aba555919df44cbaa8ff79378a1c9e2cfdfbf9d39c63a4a00f284c5a5724e28ecbc2d9dba27fe4ee5018bd5 +a8db53224f70af4d991b9aae4ffe92d2aa5b618ad9137784b55843e9f16cefbfd25ada355d308e9bbf55f6d2f7976fb3 +b6536c4232bb20e22af1a8bb12de76d5fec2ad9a3b48af1f38fa67e0f8504ef60f305a73d19385095bb6a9603fe29889 +87f7e371a1817a63d6838a8cf4ab3a8473d19ce0d4f40fd013c03d5ddd5f4985df2956531cc9f187928ef54c68f4f9a9 +ae13530b1dbc5e4dced9d909ea61286ec09e25c12f37a1ed2f309b0eb99863d236c3b25ed3484acc8c076ad2fa8cd430 +98928d850247c6f7606190e687d5c94a627550198dbdbea0161ef9515eacdb1a0f195cae3bb293112179082daccf8b35 +918528bb8e6a055ad4db6230d3a405e9e55866da15c4721f5ddd1f1f37962d4904aad7a419218fe6d906fe191a991806 +b71e31a06afe065773dd3f4a6e9ef81c3292e27a3b7fdfdd452d03e05af3b6dd654c355f7516b2a93553360c6681a73a +8870b83ab78a98820866f91ac643af9f3ff792a2b7fda34185a9456a63abdce42bfe8ad4dc67f08a6392f250d4062df4 +91eea1b668e52f7a7a5087fabf1cab803b0316f78d9fff469fbfde2162f660c250e4336a9eea4cb0450bd30ac067bc8b +8b74990946de7b72a92147ceac1bd9d55999a8b576e8df68639e40ed5dc2062cfcd727903133de482b6dca19d0aaed82 +8ebad537fece090ebbab662bdf2618e21ca30cf6329c50935e8346d1217dcbe3c1fe1ea28efca369c6003ce0a94703c1 +a8640479556fb59ebd1c40c5f368fbd960932fdbb782665e4a0e24e2bdb598fc0164ce8c0726d7759cfc59e60a62e182 +a9a52a6bf98ee4d749f6d38be2c60a6d54b64d5cbe4e67266633dc096cf28c97fe998596707d31968cbe2064b72256bf +847953c48a4ce6032780e9b39d0ed4384e0be202c2bbe2dfda3910f5d87aa5cd3c2ffbfcfae4dddce16d6ab657599b95 +b6f6e1485d3ec2a06abaecd23028b200b2e4a0096c16144d07403e1720ff8f9ba9d919016b5eb8dc5103880a7a77a1d3 +98dfc2065b1622f596dbe27131ea60bef7a193b12922cecb27f8c571404f483014f8014572e86ae2e341ab738e4887ef +acb0d205566bacc87bbe2e25d10793f63f7a1f27fd9e58f4f653ceae3ffeba511eaf658e068fad289eeb28f9edbeb35b +ae4411ed5b263673cee894c11fe4abc72a4bf642d94022a5c0f3369380fcdfc1c21e277f2902972252503f91ada3029a +ac4a7a27ba390a75d0a247d93d4a8ef1f0485f8d373a4af4e1139369ec274b91b3464d9738eeaceb19cd6f509e2f8262 +87379c3bf231fdafcf6472a79e9e55a938d851d4dd662ab6e0d95fd47a478ed99e2ad1e6e39be3c0fc4f6d996a7dd833 +81316904b035a8bcc2041199a789a2e6879486ba9fddcba0a82c745cc8dd8374a39e523b91792170cd30be7aa3005b85 +b8206809c6cd027ed019f472581b45f7e12288f89047928ba32b4856b6560ad30395830d71e5e30c556f6f182b1fe690 +88d76c028f534a62e019b4a52967bb8642ede6becfa3807be68fdd36d366fc84a4ac8dc176e80a68bc59eb62caf5dff9 +8c3b8be685b0f8aad131ee7544d0e12f223f08a6f8edaf464b385ac644e0ddc9eff7cc7cb5c1b50ab5d71ea0f41d2213 +8d91410e004f76c50fdc05784157b4d839cb5090022c629c7c97a5e0c3536eeafee17a527b54b1165c3cd81774bb54ce +b25c2863bc28ec5281ce800ddf91a7e1a53f4c6d5da1e6c86ef4616e93bcf55ed49e297216d01379f5c6e7b3c1e46728 +865f7b09ac3ca03f20be90c48f6975dd2588838c2536c7a3532a6aa5187ed0b709cd03d91ff4048061c10d0aa72b69ce +b3f7477c90c11596eb4f8bbf34adbcb832638c4ff3cdd090d4d477ee50472ac9ddaf5be9ad7eca3f148960d362bbd098 +8db35fd53fca04faecd1c76a8227160b3ab46ac1af070f2492445a19d8ff7c25bbaef6c9fa0c8c088444561e9f7e4eb2 +a478b6e9d058a2e01d2fc053b739092e113c23a6a2770a16afbef044a3709a9e32f425ace9ba7981325f02667c3f9609 +98caa6bd38916c08cf221722a675a4f7577f33452623de801d2b3429595f988090907a7e99960fff7c076d6d8e877b31 +b79aaaacefc49c3038a14d2ac468cfec8c2161e88bdae91798d63552cdbe39e0e02f9225717436b9b8a40a022c633c6e +845a31006c680ee6a0cc41d3dc6c0c95d833fcf426f2e7c573fa15b2c4c641fbd6fe5ebb0e23720cc3467d6ee1d80dc4 +a1bc287e272cf8b74dbf6405b3a5190883195806aa351f1dc8e525aa342283f0a35ff687e3b434324dedee74946dd185 +a4fd2dc8db75d3783a020856e2b3aa266dc6926e84f5c491ef739a3bddd46dc8e9e0fc1177937839ef1b18d062ffbb9e +acbf0d3c697f57c202bb8c5dc4f3fc341b8fc509a455d44bd86acc67cad2a04495d5537bcd3e98680185e8aa286f2587 +a5caf423a917352e1b8e844f5968a6da4fdeae467d10c6f4bbd82b5eea46a660b82d2f5440d3641c717b2c3c9ed0be52 +8a39d763c08b926599ab1233219c49c825368fad14d9afc7c0c039224d37c00d8743293fd21645bf0b91eaf579a99867 +b2b53a496def0ba06e80b28f36530fbe0fb5d70a601a2f10722e59abee529369c1ae8fd0f2db9184dd4a2519bb832d94 +a73980fcef053f1b60ebbb5d78ba6332a475e0b96a0c724741a3abf3b59dd344772527f07203cf4c9cb5155ebed81fa0 +a070d20acce42518ece322c9db096f16aed620303a39d8d5735a0df6e70fbeceb940e8d9f5cc38f3314b2240394ec47b +a50cf591f522f19ca337b73089557f75929d9f645f3e57d4f241e14cdd1ea3fb48d84bcf05e4f0377afbb789fbdb5d20 +82a5ffce451096aca8eeb0cd2ae9d83db3ed76da3f531a80d9a70a346359bf05d74863ce6a7c848522b526156a5e20cd +88e0e84d358cbb93755a906f329db1537c3894845f32b9b0b691c29cbb455373d9452fadd1e77e20a623f6eaf624de6f +aa07ac7b84a6d6838826e0b9e350d8ec75e398a52e9824e6b0da6ae4010e5943fec4f00239e96433f291fef9d1d1e609 +ac8887bf39366034bc63f6cc5db0c26fd27307cbc3d6cce47894a8a019c22dd51322fb5096edc018227edfafc053a8f6 +b7d26c26c5b33f77422191dca94977588ab1d4b9ce7d0e19c4a3b4cd1c25211b78c328dbf81e755e78cd7d1d622ad23e +99a676d5af49f0ba44047009298d8474cabf2d5bca1a76ba21eff7ee3c4691a102fdefea27bc948ccad8894a658abd02 +b0d09a91909ab3620c183bdf1d53d43d39eb750dc7a722c661c3de3a1a5d383ad221f71bae374f8a71867505958a3f76 +84681a883de8e4b93d68ac10e91899c2bbb815ce2de74bb48a11a6113b2a3f4df8aceabda1f5f67bc5aacac8c9da7221 +9470259957780fa9b43521fab3644f555f5343281c72582b56d2efd11991d897b3b481cafa48681c5aeb80c9663b68f7 +ab1b29f7ece686e6fa968a4815da1d64f3579fed3bc92e1f3e51cd13a3c076b6cf695ed269d373300a62463dc98a4234 +8ab415bfcd5f1061f7687597024c96dd9c7cb4942b5989379a7a3b5742f7d394337886317659cbeacaf030234a24f972 +b9b524aad924f9acc63d002d617488f31b0016e0f0548f050cada285ce7491b74a125621638f19e9c96eabb091d945be +8c4c373e79415061837dd0def4f28a2d5d74d21cb13a76c9049ad678ca40228405ab0c3941df49249847ecdefc1a5b78 +a8edf4710b5ab2929d3db6c1c0e3e242261bbaa8bcec56908ddadd7d2dad2dca9d6eb9de630b960b122ebeea41040421 +8d66bb3b50b9df8f373163629f9221b3d4b6980a05ea81dc3741bfe9519cf3ebba7ab98e98390bae475e8ede5821bd5c +8d3c21bae7f0cfb97c56952bb22084b58e7bb718890935b73103f33adf5e4d99cd262f929c6eeab96209814f0dbae50a +a5c66cfab3d9ebf733c4af24bebc97070e7989fe3c73e79ac85fb0e4d40ae44fb571e0fad4ad72560e13ed453900d14f +9362e6b50b43dbefbc3254471372297b5dcce809cd3b60bf74a1268ab68bdb50e46e462cbd78f0d6c056330e982846af +854630d08e3f0243d570cc2e856234cb4c1a158d9c1883bf028a76525aaa34be897fe918d5f6da9764a3735fa9ebd24a +8c7d246985469ff252c3f4df6c7c9196fc79f05c1c66a609d84725c78001d0837c7a7049394ba5cf7e863e2d58af8417 +ae050271e01b528925302e71903f785b782f7bf4e4e7a7f537140219bc352dc7540c657ed03d3a297ad36798ecdb98cd +8d2ae9179fcf2b0c69850554580b52c1f4a5bd865af5f3028f222f4acad9c1ad69a8ef6c7dc7b03715ee5c506b74325e +b8ef8de6ce6369a8851cd36db0ccf00a85077e816c14c4e601f533330af9e3acf0743a95d28962ed8bfcfc2520ef3cfe +a6ecad6fdfb851b40356a8b1060f38235407a0f2706e7b8bb4a13465ca3f81d4f5b99466ac2565c60af15f022d26732e +819ff14cdea3ab89d98e133cd2d0379361e2e2c67ad94eeddcdb9232efd509f51d12f4f03ebd4dd953bd262a886281f7 +8561cd0f7a6dbcddd83fcd7f472d7dbcba95b2d4fb98276f48fccf69f76d284e626d7e41314b633352df8e6333fd52a1 +b42557ccce32d9a894d538c48712cb3e212d06ac05cd5e0527ccd2db1078ee6ae399bf6a601ffdab1f5913d35fc0b20c +89b4008d767aad3c6f93c349d3b956e28307311a5b1cec237e8d74bb0dee7e972c24f347fd56afd915a2342bd7bc32f0 +877487384b207e53f5492f4e36c832c2227f92d1bb60542cfeb35e025a4a7afc2b885fae2528b33b40ab09510398f83e +8c411050b63c9053dd0cd81dacb48753c3d7f162028098e024d17cd6348482703a69df31ad6256e3d25a8bbf7783de39 +a8506b54a88d17ac10fb1b0d1fe4aa40eae7553a064863d7f6b52ccc4236dd4b82d01dca6ba87da9a239e3069ba879fb +b1a24caef9df64750c1350789bb8d8a0db0f39474a1c74ea9ba064b1516db6923f00af8d57c632d58844fb8786c3d47a +959d6e255f212b0708c58a2f75cb1fe932248c9d93424612c1b8d1e640149656059737e4db2139afd5556bcdacf3eda2 +84525af21a8d78748680b6535bbc9dc2f0cf9a1d1740d12f382f6ecb2e73811d6c1da2ad9956070b1a617c61fcff9fe5 +b74417d84597a485d0a8e1be07bf78f17ebb2e7b3521b748f73935b9afbbd82f34b710fb7749e7d4ab55b0c7f9de127d +a4a9aecb19a6bab167af96d8b9d9aa5308eab19e6bfb78f5a580f9bf89bdf250a7b52a09b75f715d651cb73febd08e84 +9777b30be2c5ffe7d29cc2803a562a32fb43b59d8c3f05a707ab60ec05b28293716230a7d264d7cd9dd358fc031cc13e +95dce7a3d4f23ac0050c510999f5fbf8042f771e8f8f94192e17bcbfa213470802ebdbe33a876cb621cf42e275cbfc8b +b0b963ebcbbee847ab8ae740478544350b3ac7e86887e4dfb2299ee5096247cd2b03c1de74c774d9bde94ae2ee2dcd59 +a4ab20bafa316030264e13f7ef5891a2c3b29ab62e1668fcb5881f50a9acac6adbe3d706c07e62f2539715db768f6c43 +901478a297669d608e406fe4989be75264b6c8be12169aa9e0ad5234f459ca377f78484ffd2099a2fe2db5e457826427 +88c76e5c250810c057004a03408b85cd918e0c8903dc55a0dd8bb9b4fc2b25c87f9b8cf5943eb19fbbe99d36490050c5 +91607322bbad4a4f03fc0012d0821eff5f8c516fda45d1ec1133bface6f858bf04b25547be24159cab931a7aa08344d4 +843203e07fce3c6c81f84bc6dc5fb5e9d1c50c8811ace522dc66e8658433a0ef9784c947e6a62c11bf705307ef05212e +91dd8813a5d6dddcda7b0f87f672b83198cd0959d8311b2b26fb1fae745185c01f796fbd03aad9db9b58482483fdadd8 +8d15911aacf76c8bcd7136e958febd6963104addcd751ce5c06b6c37213f9c4fb0ffd4e0d12c8e40c36d658999724bfd +8a36c5732d3f1b497ebe9250610605ee62a78eaa9e1a45f329d09aaa1061131cf1d9df00f3a7d0fe8ad614a1ff9caaae +a407d06affae03660881ce20dab5e2d2d6cddc23cd09b95502a9181c465e57597841144cb34d22889902aff23a76d049 +b5fd856d0578620a7e25674d9503be7d97a2222900e1b4738c1d81ff6483b144e19e46802e91161e246271f90270e6cf +91b7708869cdb5a7317f88c0312d103f8ce90be14fb4f219c2e074045a2a83636fdc3e69e862049fc7c1ef000e832541 +b64719cc5480709d1dae958f1d3082b32a43376da446c8f9f64cb02a301effc9c34d9102051733315a8179aed94d53cc +94347a9542ff9d18f7d9eaa2f4d9b832d0e535fe49d52aa2de08aa8192400eddabdb6444a2a78883e27c779eed7fdf5a +840ef44a733ff1376466698cd26f82cf56bb44811e196340467f932efa3ae1ef9958a0701b3b032f50fd9c1d2aed9ab5 +90ab3f6f67688888a31ffc2a882bb37adab32d1a4b278951a21646f90d03385fc976715fc639a785d015751171016f10 +b56f35d164c24b557dbcbc8a4bfa681ec916f8741ffcb27fb389c164f4e3ed2be325210ef5bdaeae7a172ca9599ab442 +a7921a5a80d7cf6ae81ba9ee05e0579b18c20cd2852762c89d6496aa4c8ca9d1ca2434a67b2c16d333ea8e382cdab1e3 +a506bcfbd7e7e5a92f68a1bd87d07ad5fe3b97aeee40af2bf2cae4efcd77fff03f872732c5b7883aa6584bee65d6f8cb +a8c46cff58931a1ce9cbe1501e1da90b174cddd6d50f3dfdfb759d1d4ad4673c0a8feed6c1f24c7af32865a7d6c984e5 +b45686265a83bff69e312c5149db7bb70ac3ec790dc92e392b54d9c85a656e2bf58596ce269f014a906eafc97461aa5f +8d4009a75ccb2f29f54a5f16684b93202c570d7a56ec1a8b20173269c5f7115894f210c26b41e8d54d4072de2d1c75d0 +aef8810af4fc676bf84a0d57b189760ddc3375c64e982539107422e3de2580b89bd27aa6da44e827b56db1b5555e4ee8 +888f0e1e4a34f48eb9a18ef4de334c27564d72f2cf8073e3d46d881853ac1424d79e88d8ddb251914890588937c8f711 +b64b0aa7b3a8f6e0d4b3499fe54e751b8c3e946377c0d5a6dbb677be23736b86a7e8a6be022411601dd75012012c3555 +8d57776f519f0dd912ea14f79fbab53a30624e102f9575c0bad08d2dc754e6be54f39b11278c290977d9b9c7c0e1e0ad +a018fc00d532ceb2e4de908a15606db9b6e0665dd77190e2338da7c87a1713e6b9b61554e7c1462f0f6d4934b960b15c +8c932be83ace46f65c78e145b384f58e41546dc0395270c1397874d88626fdeda395c8a289d602b4c312fe98c1311856 +89174838e21639d6bdd91a0621f04dc056907b88e305dd66e46a08f6d65f731dea72ae87ca5e3042d609e8de8de9aa26 +b7b7f508bb74f7a827ac8189daa855598ff1d96fa3a02394891fd105d8f0816224cd50ac4bf2ed1cf469ace516c48184 +b31877ad682583283baadd68dc1bebd83f5748b165aadd7fe9ef61a343773b88bcd3a022f36d6c92f339b7bfd72820a9 +b79d77260b25daf9126dab7a193df2d7d30542786fa1733ffaf6261734770275d3ca8bae1d9915d1181a78510b3439db +91894fb94cd4c1dd2ceaf9c53a7020c5799ba1217cf2d251ea5bc91ed26e1159dd758e98282ebe35a0395ef9f1ed15a0 +ab59895cdafd33934ceedfc3f0d5d89880482cba6c99a6db93245f9e41987efd76e0640e80aef31782c9a8c7a83fccec +aa22ea63654315e033e09d4d4432331904a6fc5fb1732557987846e3c564668ca67c60a324b4af01663a23af11a9ce4b +b53ba3ef342601467e1f71aa280e100fbabbd38518fa0193e0099505036ee517c1ac78e96e9baeb549bb6879bb698fb0 +943fd69fd656f37487cca3605dc7e5a215fddd811caf228595ec428751fc1de484a0cb84c667fe4d7c35599bfa0e5e34 +9353128b5ebe0dddc555093cf3e5942754f938173541033e8788d7331fafc56f68d9f97b4131e37963ab7f1c8946f5f1 +a76cd3c566691f65cfb86453b5b31dbaf3cab8f84fe1f795dd1e570784b9b01bdd5f0b3c1e233942b1b5838290e00598 +983d84b2e53ffa4ae7f3ba29ef2345247ea2377686b74a10479a0ef105ecf90427bf53b74c96dfa346d0f842b6ffb25b +92e0fe9063306894a2c6970c001781cff416c87e87cb5fbac927a3192655c3da4063e6fa93539f6ff58efac6adcc5514 +b00a81f03c2b8703acd4e2e4c21e06973aba696415d0ea1a648ace2b0ea19b242fede10e4f9d7dcd61c546ab878bc8f9 +b0d08d880f3b456a10bf65cff983f754f545c840c413aea90ce7101a66eb0a0b9b1549d6c4d57725315828607963f15a +90cb64d03534f913b411375cce88a9e8b1329ce67a9f89ca5df8a22b8c1c97707fec727dbcbb9737f20c4cf751359277 +8327c2d42590dfcdb78477fc18dcf71608686ad66c49bce64d7ee874668be7e1c17cc1042a754bbc77c9daf50b2dae07 +8532171ea13aa7e37178e51a6c775da469d2e26ec854eb16e60f3307db4acec110d2155832c202e9ba525fc99174e3b0 +83ca44b15393d021de2a511fa5511c5bd4e0ac7d67259dce5a5328f38a3cce9c3a269405959a2486016bc27bb140f9ff +b1d36e8ca812be545505c8214943b36cabee48112cf0de369957afa796d37f86bf7249d9f36e8e990f26f1076f292b13 +9803abf45be5271e2f3164c328d449efc4b8fc92dfc1225d38e09630909fe92e90a5c77618daa5f592d23fc3ad667094 +b268ad68c7bf432a01039cd889afae815c3e120f57930d463aece10af4fd330b5bd7d8869ef1bcf6b2e78e4229922edc +a4c91a0d6f16b1553264592b4cbbbf3ca5da32ab053ffbdd3dbb1aed1afb650fb6e0dc5274f71a51d7160856477228db +ad89d043c2f0f17806277ffdf3ecf007448e93968663f8a0b674254f36170447b7527d5906035e5e56f4146b89b5af56 +8b6964f757a72a22a642e4d69102951897e20c21449184e44717bd0681d75f7c5bfa5ee5397f6e53febf85a1810d6ed1 +b08f5cdaabec910856920cd6e836c830b863eb578423edf0b32529488f71fe8257d90aed4a127448204df498b6815d79 +af26bb3358be9d280d39b21d831bb53145c4527a642446073fee5a86215c4c89ff49a3877a7a549486262f6f57a0f476 +b4010b37ec4d7c2af20800e272539200a6b623ae4636ecbd0e619484f4ab9240d02bc5541ace3a3fb955dc0a3d774212 +82752ab52bdcc3cc2fc405cb05a2e694d3df4a3a68f2179ec0652536d067b43660b96f85f573f26fbd664a9ef899f650 +96d392dde067473a81faf2d1fea55b6429126b88b160e39b4210d31d0a82833ffd3a80e07d24d495aea2d96be7251547 +a76d8236d6671204d440c33ac5b8deb71fa389f6563d80e73be8b043ec77d4c9b06f9a586117c7f957f4af0331cbc871 +b6c90961f68b5e385d85c9830ec765d22a425f506904c4d506b87d8944c2b2c09615e740ed351df0f9321a7b93979cae +a6ec5ea80c7558403485b3b1869cdc63bde239bafdf936d9b62a37031628402a36a2cfa5cfbb8e26ac922cb0a209b3ba +8c3195bbdbf9bc0fc95fa7e3d7f739353c947f7767d1e3cb24d8c8602d8ea0a1790ac30b815be2a2ba26caa5227891e2 +a7f8a63d809f1155722c57f375ea00412b00147776ae4444f342550279ef4415450d6f400000a326bf11fea6c77bf941 +97fa404df48433a00c85793440e89bb1af44c7267588ae937a1f5d53e01e1c4d4fc8e4a6d517f3978bfdd6c2dfde012f +a984a0a3836de3d8d909c4629a2636aacb85393f6f214a2ef68860081e9db05ad608024762db0dc35e895dc00e2d4cdd +9526cf088ab90335add1db4d3a4ac631b58cbfbe88fa0845a877d33247d1cfeb85994522e1eb8f8874651bfb1df03e2a +ac83443fd0afe99ad49de9bf8230158c118e2814c9c89db5ac951c240d6c2ce45e7677221279d9e97848ec466b99aafe +aeeefdbaba612e971697798ceaf63b247949dc823a0ad771ae5b988a5e882b338a98d3d0796230f49d533ec5ba411b39 +ae3f248b5a7b0f92b7820a6c5ae21e5bd8f4265d4f6e21a22512079b8ee9be06393fd3133ce8ebac0faf23f4f8517e36 +a64a831b908eee784b8388b45447d2885ec0551b26b0c2b15e5f417d0a12c79e867fb7bd3d008d0af98b44336f8ec1ad +b242238cd8362b6e440ba21806905714dd55172db25ec7195f3fc4937b2aba146d5cbf3cf691a1384b4752dc3b54d627 +819f97f337eea1ffb2a678cc25f556f1aab751c6b048993a1d430fe1a3ddd8bb411c152e12ca60ec6e057c190cd1db9a +b9d7d187407380df54ee9fef224c54eec1bfabf17dc8abf60765b7951f538f59aa26fffd5846cfe05546c35f59b573f4 +aa6e3c14efa6a5962812e3f94f8ce673a433f4a82d07a67577285ea0eaa07f8be7115853122d12d6d4e1fdf64c504be1 +82268bee9c1662d3ddb5fb785abfae6fb8b774190f30267f1d47091d2cd4b3874db4372625aa36c32f27b0eee986269b +b236459565b7b966166c4a35b2fa71030b40321821b8e96879d95f0e83a0baf33fa25721f30af4a631df209e25b96061 +8708d752632d2435d2d5b1db4ad1fa2558d776a013655f88e9a3556d86b71976e7dfe5b8834fdec97682cd94560d0d0d +ae1424a68ae2dbfb0f01211f11773732a50510b5585c1fb005cb892b2c6a58f4a55490b5c5b4483c6fce40e9d3236a52 +b3f5f722af9dddb07293c871ce97abbccba0093ca98c8d74b1318fa21396fc1b45b69c15084f63d728f9908442024506 +9606f3ce5e63886853ca476dc0949e7f1051889d529365c0cb0296fdc02abd088f0f0318ecd2cf36740a3634132d36f6 +b11a833a49fa138db46b25ff8cdda665295226595bc212c0931b4931d0a55c99da972c12b4ef753f7e37c6332356e350 +afede34e7dab0a9e074bc19a7daddb27df65735581ca24ad70c891c98b1349fcebbcf3ba6b32c2617fe06a5818dabc2d +97993d456e459e66322d01f8eb13918979761c3e8590910453944bdff90b24091bb018ac6499792515c9923be289f99f +977e3e967eff19290a192cd11df3667d511b398fb3ac9a5114a0f3707e25a0edcb56105648b1b85a8b7519fc529fc6f6 +b873a7c88bf58731fe1bf61ff6828bf114cf5228f254083304a4570e854e83748fc98683ddba62d978fff7909f2c5c47 +ad4b2691f6f19da1d123aaa23cca3e876247ed9a4ab23c599afdbc0d3aa49776442a7ceaa996ac550d0313d9b9a36cee +b9210713c78e19685608c6475bfa974b57ac276808a443f8b280945c5d5f9c39da43effa294bfb1a6c6f7b6b9f85bf6c +a65152f376113e61a0e468759de38d742caa260291b4753391ee408dea55927af08a4d4a9918600a3bdf1df462dffe76 +8bf8c27ad5140dde7f3d2280fd4cc6b29ab76537e8d7aa7011a9d2796ee3e56e9a60c27b5c2da6c5e14fc866301dc195 +92fde8effc9f61393a2771155812b863cff2a0c5423d7d40aa04d621d396b44af94ddd376c28e7d2f53c930aea947484 +97a01d1dd9ee30553ce676011aea97fa93d55038ada95f0057d2362ae9437f3ed13de8290e2ff21e3167dd7ba10b9c3f +89affffaa63cb2df3490f76f0d1e1d6ca35c221dd34057176ba739fa18d492355e6d2a5a5ad93a136d3b1fed0bb8aa19 +928b8e255a77e1f0495c86d3c63b83677b4561a5fcbbe5d3210f1e0fc947496e426d6bf3b49394a5df796c9f25673fc4 +842a0af91799c9b533e79ee081efe2a634cac6c584c2f054fb7d1db67dde90ae36de36cbf712ec9cd1a0c7ee79e151ea +a65b946cf637e090baf2107c9a42f354b390e7316beb8913638130dbc67c918926eb87bec3b1fe92ef72bc77a170fa3b +aafc0f19bfd71ab5ae4a8510c7861458b70ad062a44107b1b1dbacbfa44ba3217028c2824bd7058e2fa32455f624040b +95269dc787653814e0be899c95dba8cfa384f575a25e671c0806fd80816ad6797dc819d30ae06e1d0ed9cb01c3950d47 +a1e760f7fa5775a1b2964b719ff961a92083c5c617f637fc46e0c9c20ab233f8686f7f38c3cb27d825c54dd95e93a59b +ac3b8a7c2317ea967f229eddc3e23e279427f665c4705c7532ed33443f1243d33453c1088f57088d2ab1e3df690a9cc9 +b787beeddfbfe36dd51ec4efd9cf83e59e84d354c3353cc9c447be53ae53d366ed1c59b686e52a92f002142c8652bfe0 +b7a64198300cb6716aa7ac6b25621f8bdec46ad5c07a27e165b3f774cdf65bcfdbf31e9bae0c16b44de4b00ada7a4244 +b8ae9f1452909e0c412c7a7fe075027691ea8df1347f65a5507bc8848f1d2c833d69748076db1129e5b4fb912f65c86c +9682e41872456b9fa67def89e71f06d362d6c8ca85c9c48536615bc401442711e1c9803f10ab7f8ab5feaec0f9df20a6 +88889ff4e271dc1c7e21989cc39f73cde2f0475acd98078281591ff6c944fadeb9954e72334319050205d745d4df73df +8f79b5b8159e7fd0d93b0645f3c416464f39aec353b57d99ecf24f96272df8a068ad67a6c90c78d82c63b40bb73989bb +838c01a009a3d8558a3f0bdd5e22de21af71ca1aefc8423c91dc577d50920e9516880e87dce3e6d086e11cd45c9052d9 +b97f1c6eee8a78f137c840667cc288256e39294268a3009419298a04a1d0087c9c9077b33c917c65caf76637702dda8a +972284ce72f96a61c899260203dfa06fc3268981732bef74060641c1a5068ead723e3399431c247ca034b0dae861e8df +945a8d52d6d3db6663dbd3110c6587f9e9c44132045eeffba15621576d178315cb52870fa5861669f84f0bee646183fe +a0a547b5f0967b1c3e5ec6c6a9a99f0578521489180dfdfbb5561f4d166baac43a2f06f950f645ce991664e167537eed +a0592cda5cdddf1340033a745fd13a6eff2021f2e26587116c61c60edead067e0f217bc2bef4172a3c9839b0b978ab35 +b9c223b65a3281587fa44ec829e609154b32f801fd1de6950e01eafb07a8324243b960d5735288d0f89f0078b2c42b5b +99ebfc3b8f9f98249f4d37a0023149ed85edd7a5abe062c8fb30c8c84555258b998bdcdd1d400bc0fa2a4aaa8b224466 +955b68526e6cb3937b26843270f4e60f9c6c8ece2fa9308fe3e23afa433309c068c66a4bc16ee2cf04220f095e9afce4 +b766caeafcc00378135ae53397f8a67ed586f5e30795462c4a35853de6681b1f17401a1c40958de32b197c083b7279c1 +921bf87cad947c2c33fa596d819423c10337a76fe5a63813c0a9dc78a728207ae7b339407a402fc4d0f7cba3af6da6fc +a74ba1f3bc3e6c025db411308f49b347ec91da1c916bda9da61e510ec8d71d25e0ac0f124811b7860e5204f93099af27 +a29b4d144e0bf17a7e8353f2824cef0ce85621396babe8a0b873ca1e8a5f8d508b87866cf86da348470649fceefd735c +a8040e12ffc3480dd83a349d06741d1572ef91932c46f5cf03aee8454254156ee95786fd013d5654725e674c920cec32 +8c4cf34ca60afd33923f219ffed054f90cd3f253ffeb2204a3b61b0183417e366c16c07fae860e362b0f2bfe3e1a1d35 +8195eede4ddb1c950459df6c396b2e99d83059f282b420acc34220cadeed16ab65c856f2c52568d86d3c682818ed7b37 +91fff19e54c15932260aa990c7fcb3c3c3da94845cc5aa8740ef56cf9f58d19b4c3c55596f8d6c877f9f4d22921d93aa +a3e0bf7e5d02a80b75cf75f2db7e66cb625250c45436e3c136d86297d652590ec97c2311bafe407ad357c79ab29d107b +81917ff87e5ed2ae4656b481a63ced9e6e5ff653b8aa6b7986911b8bc1ee5b8ef4f4d7882c3f250f2238e141b227e510 +915fdbe5e7de09c66c0416ae14a8750db9412e11dc576cf6158755fdcaf67abdbf0fa79b554cac4fe91c4ec245be073f +8df27eafb5c3996ba4dc5773c1a45ca77e626b52e454dc1c4058aa94c2067c18332280630cc3d364821ee53bf2b8c130 +934f8a17c5cbb827d7868f5c8ca00cb027728a841000a16a3428ab16aa28733f16b52f58c9c4fbf75ccc45df72d9c4df +b83f4da811f9183c25de8958bc73b504cf790e0f357cbe74ef696efa7aca97ad3b7ead1faf76e9f982c65b6a4d888fc2 +87188213c8b5c268dc2b6da413f0501c95749e953791b727450af3e43714149c115b596b33b63a2f006a1a271b87efd0 +83e9e888ab9c3e30761de635d9aabd31248cdd92f7675fc43e4b21fd96a03ec1dc4ad2ec94fec857ffb52683ac98e360 +b4b9a1823fe2d983dc4ec4e3aaea297e581c3fc5ab4b4af5fa1370caa37af2d1cc7fc6bfc5e7da60ad8fdce27dfe4b24 +856388bc78aef465dbcdd1f559252e028c9e9a2225c37d645c138e78f008f764124522705822a61326a6d1c79781e189 +a6431b36db93c3b47353ba22e7c9592c9cdfb9cbdd052ecf2cc3793f5b60c1e89bc96e6bae117bfd047f2308da00dd2f +b619972d48e7e4291542dcde08f7a9cdc883c892986ded2f23ccb216e245cd8d9ad1d285347b0f9d7611d63bf4cee2bc +8845cca6ff8595955f37440232f8e61d5351500bd016dfadd182b9d39544db77a62f4e0102ff74dd4173ae2c181d24ef +b2f5f7fa26dcd3b6550879520172db2d64ee6aaa213cbef1a12befbce03f0973a22eb4e5d7b977f466ac2bf8323dcedd +858b7f7e2d44bdf5235841164aa8b4f3d33934e8cb122794d90e0c1cac726417b220529e4f896d7b77902ab0ccd35b3a +80b0408a092dae2b287a5e32ea1ad52b78b10e9c12f49282976cd738f5d834e03d1ad59b09c5ccaccc39818b87d06092 +b996b0a9c6a2d14d984edcd6ab56bc941674102980d65b3ad9733455f49473d3f587c8cbf661228a7e125ddbe07e3198 +90224fcebb36865293bd63af786e0c5ade6b67c4938d77eb0cbae730d514fdd0fe2d6632788e858afd29d46310cf86df +b71351fdfff7168b0a5ec48397ecc27ac36657a8033d9981e97002dcca0303e3715ce6dd3f39423bc8ef286fa2e9e669 +ae2a3f078b89fb753ce4ed87e0c1a58bb19b4f0cfb6586dedb9fcab99d097d659a489fb40e14651741e1375cfc4b6c5f +8ef476b118e0b868caed297c161f4231bbeb863cdfa5e2eaa0fc6b6669425ce7af50dc374abceac154c287de50c22307 +92e46ab472c56cfc6458955270d3c72b7bde563bb32f7d4ab4d959db6f885764a3d864e1aa19802fefaa5e16b0cb0b54 +96a3f68323d1c94e73d5938a18a377af31b782f56212de3f489d22bc289cf24793a95b37f1d6776edf88114b5c1fa695 +962cc068cfce6faaa27213c4e43e44eeff0dfbb6d25b814e82c7da981fb81d7d91868fa2344f05fb552362f98cfd4a72 +895d4e4c4ad670abf66d43d59675b1add7afad7438ada8f42a0360c704cee2060f9ac15b4d27e9b9d0996bb801276fe3 +b3ad18d7ece71f89f2ef749b853c45dc56bf1c796250024b39a1e91ed11ca32713864049c9aaaea60cde309b47486bbf +8f05404e0c0258fdbae50e97ccb9b72ee17e0bd2400d9102c0dad981dac8c4c71585f03e9b5d50086d0a2d3334cb55d1 +8bd877e9d4591d02c63c6f9fc9976c109de2d0d2df2bfa5f6a3232bab5b0b8b46e255679520480c2d7a318545efa1245 +8d4c16b5d98957c9da13d3f36c46f176e64e5be879f22be3179a2c0e624fe4758a82bf8c8027410002f973a3b84cd55a +86e2a8dea86427b424fa8eada881bdff896907084a495546e66556cbdf070b78ba312bf441eb1be6a80006d25d5097a3 +8608b0c117fd8652fdab0495b08fadbeba95d9c37068e570de6fddfef1ba4a1773b42ac2be212836141d1bdcdef11a17 +a13d6febf5fb993ae76cae08423ca28da8b818d6ef0fde32976a4db57839cd45b085026b28ee5795f10a9a8e3098c683 +8e261967fa6de96f00bc94a199d7f72896a6ad8a7bbb1d6187cca8fad824e522880e20f766620f4f7e191c53321d70f9 +8b8e8972ac0218d7e3d922c734302803878ad508ca19f5f012bc047babd8a5c5a53deb5fe7c15a4c00fd6d1cb9b1dbd0 +b5616b233fb3574a2717d125a434a2682ff68546dccf116dd8a3b750a096982f185614b9fb6c7678107ff40a451f56fa +aa6adf9b0c3334b0d0663f583a4914523b2ac2e7adffdb026ab9109295ff6af003ef8357026dbcf789896d2afded8d73 +acb72df56a0b65496cd534448ed4f62950bb1e11e50873b6ed349c088ee364441821294ce0f7c61bd7d38105bea3b442 +abae12df83e01ec947249fedd0115dc501d2b03ff7232092979eda531dbbca29ace1d46923427c7dde4c17bdf3fd7708 +820b4fc2b63a9fda7964acf5caf19a2fc4965007cb6d6b511fcafcb1f71c3f673a1c0791d3f86e3a9a1eb6955b191cc0 +af277259d78c6b0f4f030a10c53577555df5e83319ddbad91afbd7c30bc58e7671c56d00d66ec3ab5ef56470cd910cee +ad4a861c59f1f5ca1beedd488fb3d131dea924fffd8e038741a1a7371fad7370ca5cf80dc01f177fbb9576713bb9a5b3 +b67a5162982ce6a55ccfb2f177b1ec26b110043cf18abd6a6c451cf140b5af2d634591eb4f28ad92177d8c7e5cd0a5e8 +96176d0a83816330187798072d449cbfccff682561e668faf6b1220c9a6535b32a6e4f852e8abb00f79abb87493df16b +b0afe6e7cb672e18f0206e4423f51f8bd0017bf464c4b186d46332c5a5847647f89ff7fa4801a41c1b0b42f6135bcc92 +8fc5e7a95ef20c1278c645892811f6fe3f15c431ebc998a32ec0da44e7213ea934ed2be65239f3f49b8ec471e9914160 +b7793e41adda6c82ba1f2a31f656f6205f65bf8a3d50d836ee631bc7ce77c153345a2d0fc5c60edf8b37457c3729c4ec +a504dd7e4d6b2f4379f22cc867c65535079c75ccc575955f961677fa63ecb9f74026fa2f60c9fb6323c1699259e5e9c8 +ab899d00ae693649cc1afdf30fb80d728973d2177c006e428bf61c7be01e183866614e05410041bc82cb14a33330e69c +8a3bd8b0b1be570b65c4432a0f6dc42f48a2000e30ab089cf781d38f4090467b54f79c0d472fcbf18ef6a00df69cc6f3 +b4d7028f7f76a96a3d7803fca7f507ae11a77c5346e9cdfccb120a833a59bda1f4264e425aa588e7a16f8e7638061d84 +b9c7511a76ea5fb105de905d44b02edb17008335766ee357ed386b7b3cf19640a98b38785cb14603c1192bee5886c9b6 +8563afb12e53aed71ac7103ab8602bfa8371ae095207cb0d59e8fd389b6ad1aff0641147e53cb6a7ca16c7f37c9c5e6b +8e108be614604e09974a9ed90960c28c4ea330a3d9a0cb4af6dd6f193f84ab282b243ecdf549b3131036bebc8905690c +b794d127fbedb9c5b58e31822361706ffac55ce023fbfe55716c3c48c2fd2f2c7660a67346864dfe588812d369cb50b6 +b797a3442fc3b44f41baefd30346f9ac7f96e770d010d53c146ce74ce424c10fb62758b7e108b8abfdc5fafd89d745cb +993bb71e031e8096442e6205625e1bfddfe6dd6a83a81f3e2f84fafa9e5082ab4cad80a099f21eff2e81c83457c725c3 +8711ab833fc03e37acf2e1e74cfd9133b101ff4144fe30260654398ae48912ab46549d552eb9d15d2ea57760d35ac62e +b21321fd2a12083863a1576c5930e1aecb330391ef83326d9d92e1f6f0d066d1394519284ddab55b2cb77417d4b0292f +877d98f731ffe3ee94b0b5b72d127630fa8a96f6ca4f913d2aa581f67732df6709493693053b3e22b0181632ac6c1e3b +ae391c12e0eb8c145103c62ea64f41345973311c3bf7281fa6bf9b7faafac87bcf0998e5649b9ef81e288c369c827e07 +b83a2842f36998890492ab1cd5a088d9423d192681b9a3a90ec518d4c541bce63e6c5f4df0f734f31fbfdd87785a2463 +a21b6a790011396e1569ec5b2a423857b9bec16f543e63af28024e116c1ea24a3b96e8e4c75c6537c3e4611fd265e896 +b4251a9c4aab3a495da7a42e684ba4860dbcf940ad1da4b6d5ec46050cbe8dab0ab9ae6b63b5879de97b905723a41576 +8222f70aebfe6ac037f8543a08498f4cadb3edaac00336fc00437eb09f2cba758f6c38e887cc634b4d5b7112b6334836 +86f05038e060594c46b5d94621a1d9620aa8ba59a6995baf448734e21f58e23c1ea2993d3002ad5250d6edd5ba59b34f +a7c0c749baef811ab31b973c39ceb1d94750e2bc559c90dc5eeb20d8bb6b78586a2b363c599ba2107d6be65cd435f24e +861d46a5d70b38d6c1cd72817a2813803d9f34c00320c8b62f8b9deb67f5b5687bc0b37c16d28fd017367b92e05da9ca +b3365d3dab639bffbe38e35383686a435c8c88b397b717cd4aeced2772ea1053ceb670f811f883f4e02975e5f1c4ac58 +a5750285f61ab8f64cd771f6466e2c0395e01b692fd878f2ef2d5c78bdd8212a73a3b1dfa5e4c8d9e1afda7c84857d3b +835a10809ccf939bc46cf950a33b36d71be418774f51861f1cd98a016ade30f289114a88225a2c11e771b8b346cbe6ef +a4f59473a037077181a0a62f1856ec271028546ca9452b45cedfcb229d0f4d1aabfc13062b07e536cc8a0d4b113156a2 +95cd14802180b224d44a73cc1ed599d6c4ca62ddcaa503513ccdc80aaa8be050cc98bd4b4f3b639549beb4587ac6caf9 +973b731992a3e69996253d7f36dd7a0af1982b5ed21624b77a7965d69e9a377b010d6dabf88a8a97eec2a476259859cc +af8a1655d6f9c78c8eb9a95051aa3baaf9c811adf0ae8c944a8d3fcba87b15f61021f3baf6996fa0aa51c81b3cb69de1 +835aad5c56872d2a2d6c252507b85dd742bf9b8c211ccb6b25b52d15c07245b6d89b2a40f722aeb5083a47cca159c947 +abf4e970b02bef8a102df983e22e97e2541dd3650b46e26be9ee394a3ea8b577019331857241d3d12b41d4eacd29a3ac +a13c32449dbedf158721c13db9539ae076a6ce5aeaf68491e90e6ad4e20e20d1cdcc4a89ed9fd49cb8c0dd50c17633c1 +8c8f78f88b7e22dd7e9150ab1c000f10c28e696e21d85d6469a6fe315254740f32e73d81ab1f3c1cf8f544c86df506e8 +b4b77f2acfe945abf81f2605f906c10b88fb4d28628487fb4feb3a09f17f28e9780445dfcee4878349d4c6387a9d17d4 +8d255c235f3812c6ecc646f855fa3832be5cb4dbb9c9e544989fafdf3f69f05bfd370732eaf954012f0044aa013fc9c6 +b982efd3f34b47df37c910148ac56a84e8116647bea24145a49e34e0a6c0176e3284d838dae6230cb40d0be91c078b85 +983f365aa09bd85df2a6a2ad8e4318996b1e27d02090755391d4486144e40d80b1fbfe1c798d626db92f52e33aa634da +95fd1981271f3ea3a41d654cf497e6696730d9ff7369f26bc4d7d15c7adb4823dd0c42e4a005a810af12d234065e5390 +a9f5219bd4b913c186ef30c02f995a08f0f6f1462614ea5f236964e02bdaa33db9d9b816c4aee5829947840a9a07ba60 +9210e6ceb05c09b46fd09d036287ca33c45124ab86315e5d6911ff89054f1101faaa3e83d123b7805056d388bcec6664 +8ed9cbf69c6ff3a5c62dd9fe0d7264578c0f826a29e614bc2fb4d621d90c8c9992438accdd7a614b1dca5d1bb73dc315 +85cf2a8cca93e00da459e3cecd22c342d697eee13c74d5851634844fc215f60053cf84b0e03c327cb395f48d1c71a8a4 +8818a18e9a2ec90a271b784400c1903089ffb0e0b40bc5abbbe12fbebe0f731f91959d98c5519ef1694543e31e2016d4 +8dabc130f296fa7a82870bf9a8405aaf542b222ed9276bba9bd3c3555a0f473acb97d655ee7280baff766a827a8993f0 +ac7952b84b0dc60c4d858f034093b4d322c35959605a3dad2b806af9813a4680cb038c6d7f4485b4d6b2ff502aaeca25 +ad65cb6d57b48a2602568d2ec8010baed0eb440eec7638c5ec8f02687d764e9de5b5d42ad5582934e592b48471c22d26 +a02ab8bd4c3d114ea23aebdd880952f9495912817da8c0c08eabc4e6755439899d635034413d51134c72a6320f807f1c +8319567764b8295402ec1ebef4c2930a138480b37e6d7d01c8b4c9cd1f2fc3f6e9a44ae6e380a0c469b25b06db23305f +afec53b2301dc0caa8034cd9daef78c48905e6068d692ca23d589b84a6fa9ddc2ed24a39480597e19cb3e83eec213b3f +ac0b4ffdb5ae08e586a9cdb98f9fe56f4712af3a97065e89e274feacfb52b53c839565aee93c4cfaaccfe51432c4fab0 +8972cbf07a738549205b1094c5987818124144bf187bc0a85287c94fdb22ce038c0f11df1aa16ec5992e91b44d1af793 +b7267aa6f9e3de864179b7da30319f1d4cb2a3560f2ea980254775963f1523b44c680f917095879bebfa3dc2b603efcf +80f68f4bfc337952e29504ee5149f15093824ea7ab02507efd1317a670f6cbc3611201848560312e3e52e9d9af72eccf +8897fee93ce8fc1e1122e46b6d640bba309384dbd92e46e185e6364aa8210ebf5f9ee7e5e604b6ffba99aa80a10dd7d0 +b58ea6c02f2360be60595223d692e82ee64874fda41a9f75930f7d28586f89be34b1083e03bbc1575bbfdda2d30db1ea +85a523a33d903280d70ac5938770453a58293480170c84926457ac2df45c10d5ff34322ab130ef4a38c916e70d81af53 +a2cbf045e1bed38937492c1f2f93a5ba41875f1f262291914bc1fc40c60bd0740fb3fea428faf6da38b7c180fe8ac109 +8c09328770ed8eb17afc6ac7ddd87bb476de18ed63cab80027234a605806895959990c47bd10d259d7f3e2ecb50074c9 +b4b9e19edb4a33bde8b7289956568a5b6b6557404e0a34584b5721fe6f564821091013fbb158e2858c6d398293bb4b59 +8a47377df61733a2aa5a0e945fce00267f8e950f37e109d4487d92d878fb8b573317bb382d902de515b544e9e233458d +b5804c9d97efeff5ca94f3689b8088c62422d92a1506fd1d8d3b1b30e8a866ad0d6dad4abfa051dfc4471250cac4c5d9 +9084a6ee8ec22d4881e9dcc8a9eb3c2513523d8bc141942370fd191ad2601bf9537a0b1e84316f3209b3d8a54368051e +85447eea2fa26656a649f8519fa67279183044791d61cf8563d0783d46d747d96af31d0a93507bbb2242666aa87d3720 +97566a84481027b60116c751aec552adfff2d9038e68d48c4db9811fb0cbfdb3f1d91fc176a0b0d988a765f8a020bce1 +ae87e5c1b9e86c49a23dceda4ecfd1dcf08567f1db8e5b6ec752ebd45433c11e7da4988573cdaebbb6f4135814fc059e +abee05cf9abdbc52897ac1ce9ed157f5466ed6c383d6497de28616238d60409e5e92619e528af8b62cc552bf09970dc2 +ae6d31cd7bf9599e5ee0828bab00ceb4856d829bba967278a73706b5f388465367aa8a6c7da24b5e5f1fdd3256ef8e63 +ac33e7b1ee47e1ee4af472e37ab9e9175260e506a4e5ce449788075da1b53c44cb035f3792d1eea2aa24b1f688cc6ed3 +80f65b205666b0e089bb62152251c48c380a831e5f277f11f3ef4f0d52533f0851c1b612267042802f019ec900dc0e8f +858520ad7aa1c9fed738e3b583c84168f2927837ad0e1d326afe9935c26e9b473d7f8c382e82ef1fe37d2b39bb40a1ee +b842dd4af8befe00a97c2d0f0c33c93974761e2cb9e5ab8331b25170318ddd5e4bdbc02d8f90cbfdd5f348f4f371c1f7 +8bf2cb79bc783cb57088aae7363320cbeaabd078ffdec9d41bc74ff49e0043d0dad0086a30e5112b689fd2f5a606365d +982eb03bbe563e8850847cd37e6a3306d298ab08c4d63ab6334e6b8c1fa13fce80cf2693b09714c7621d74261a0ff306 +b143edb113dec9f1e5105d4a93fbe502b859e587640d3db2f628c09a17060e6aec9e900e2c8c411cda99bc301ff96625 +af472d9befa750dcebc5428fe1a024f18ec1c07bca0f95643ce6b5f4189892a910285afb03fd7ed7068fbe614e80d33c +a97e3bc57ede73ecd1bbf02de8f51b4e7c1a067da68a3cd719f4ba26a0156cbf1cef2169fd35a18c5a4cced50d475998 +a862253c937cf3d75d7183e5f5be6a4385d526aeda5171c1c60a8381fea79f88f5f52a4fab244ecc70765d5765e6dfd5 +90cb776f8e5a108f1719df4a355bebb04bf023349356382cae55991b31720f0fd03206b895fa10c56c98f52453be8778 +a7614e8d0769dccd520ea4b46f7646e12489951efaef5176bc889e9eb65f6e31758df136b5bf1e9107e68472fa9b46ec +ac3a9b80a3254c42e5ed3a090a0dd7aee2352f480de96ad187027a3bb6c791eddfc3074b6ffd74eea825188f107cda4d +82a01d0168238ef04180d4b6e0a0e39024c02c2d75b065017c2928039e154d093e1af4503f4d1f3d8a948917abb5d09f +8fab000a2b0eef851a483aec8d2dd85fe60504794411a2f73ed82e116960547ac58766cb73df71aea71079302630258d +872451a35c6db61c63e9b8bb9f16b217f985c20be4451c14282c814adb29d7fb13f201367c664435c7f1d4d9375d7a58 +887d9ff54cc96b35d562df4a537ff972d7c4b3fd91ab06354969a4cfede0b9fc68bbffb61d0dbf1a58948dc701e54f5a +8cb5c2a6bd956875d88f41ae24574434f1308514d44057b55c9c70f13a3366ed054150eed0955a38fda3f757be73d55f +89ad0163cad93e24129d63f8e38422b7674632a8d0a9016ee8636184cab177659a676c4ee7efba3abe1a68807c656d60 +b9ec01c7cab6d00359b5a0b4a1573467d09476e05ca51a9227cd16b589a9943d161eef62dcc73f0de2ec504d81f4d252 +8031d17635d39dfe9705c485d2c94830b6fc9bc67b91300d9d2591b51e36a782e77ab5904662effa9382d9cca201f525 +8be5a5f6bc8d680e5092d6f9a6585acbaaaa2ddc671da560dcf5cfa4472f4f184b9597b5b539438accd40dda885687cc +b1fc0f052fae038a2e3de3b3a96b0a1024b009de8457b8b3adb2d315ae68a89af905720108a30038e5ab8d0d97087785 +8b8bdc77bd3a6bc7ca5492b6f8c614852c39a70d6c8a74916eaca0aeb4533b11898b8820a4c2620a97bf35e275480029 +af35f4dc538d4ad5cdf710caa38fd1eb496c3fa890a047b6a659619c5ad3054158371d1e88e0894428282eed9f47f76b +8166454a7089cc07758ad78724654f4e7a1a13e305bbf88ddb86f1a4b2904c4fc8ab872d7da364cdd6a6c0365239e2ad +ab287c7d3addce74ce40491871c768abe01daaa0833481276ff2e56926b38a7c6d2681ffe837d2cc323045ad1a4414f9 +b90317f4505793094d89365beb35537f55a6b5618904236258dd04ca61f21476837624a2f45fef8168acf732cab65579 +98ae5ea27448e236b6657ab5ef7b1cccb5372f92ab25f5fa651fbac97d08353a1dae1b280b1cd42b17d2c6a70a63ab9d +adcf54e752d32cbaa6cb98fbca48d8cd087b1db1d131d465705a0d8042c8393c8f4d26b59006eb50129b21e6240f0c06 +b591a3e4db18a7345fa935a8dd7994bbac5cc270b8ebd84c8304c44484c7a74afb45471fdbe4ab22156a30fae1149b40 +806b53ac049a42f1dcc1d6335505371da0bf27c614f441b03bbf2e356be7b2fb4eed7117eabcce9e427a542eaa2bf7d8 +800482e7a772d49210b81c4a907f5ce97f270b959e745621ee293cf8c71e8989363d61f66a98f2d16914439544ca84c7 +99de9eafdad3617445312341644f2bb888680ff01ce95ca9276b1d2e5ef83fa02dab5e948ebf66c17df0752f1bd37b70 +961ee30810aa4c93ae157fbe9009b8e443c082192bd36a73a6764ff9b2ad8b0948fe9a73344556e01399dd77badb4257 +ae0a361067c52efbe56c8adf982c00432cd478929459fc7f74052c8ee9531cd031fe1335418fde53f7c2ef34254eb7ac +a3503d16b6b27eb20c1b177bcf90d13706169220523a6271b85b2ce35a9a2b9c5bed088540031c0a4ebfdae3a4c6ab04 +909420122c3e723289ca4e7b81c2df5aff312972a2203f4c45821b176e7c862bf9cac7f7df3adf1d59278f02694d06e7 +989f42380ae904b982f85d0c6186c1aef5d6bcba29bcfbb658e811b587eb2749c65c6e4a8cc6409c229a107499a4f5d7 +8037a6337195c8e26a27ea4ef218c6e7d79a9720aaab43932d343192abc2320fe72955f5e431c109093bda074103330a +b312e168663842099b88445e940249cc508f080ab0c94331f672e7760258dbd86be5267e4cf25ea25facb80bff82a7e9 +aaa3ff8639496864fcdbfdda1ac97edc4f08e3c9288b768f6c8073038c9fbbf7e1c4bea169b4d45c31935cdf0680d45e +97dbd3df37f0b481a311dfc5f40e59227720f367912200d71908ef6650f32cc985cb05b981e3eea38958f7e48d10a15d +a89d49d1e267bb452d6cb621b9a90826fe55e9b489c0427b94442d02a16f390eed758e209991687f73f6b5a032321f42 +9530dea4e0e19d6496f536f2e75cf7d814d65fde567055eb20db48fd8d20d501cd2a22fb506db566b94c9ee10f413d43 +81a7009b9e67f1965fa7da6a57591c307de91bf0cd35ab4348dc4a98a4961e096d004d7e7ad318000011dc4342c1b809 +83440a9402b766045d7aca61a58bba2aa29cac1cf718199e472ba086f5d48093d9dda4d135292ba51d049a23964eceae +a06c9ce5e802df14f6b064a3d1a0735d429b452f0e2e276042800b0a4f16df988fd94cf3945921d5dd3802ab2636f867 +b1359e358b89936dee9e678a187aad3e9ab14ac40e96a0a68f70ee2583cdcf467ae03bef4215e92893f4e12f902adec8 +835304f8619188b4d14674d803103d5a3fa594d48e96d9699e653115dd05fdc2dda6ba3641cf7ad53994d448da155f02 +8327cba5a9ff0d3f5cd0ae55e77167448926d5fcf76550c0ad978092a14122723090c51c415e88e42a2b62eb07cc3981 +b373dcdaea85f85ce9978b1426a7ef4945f65f2d3467a9f1cc551a99766aac95df4a09e2251d3f89ca8c9d1a7cfd7b0e +ab1422dc41af2a227b973a6fd124dfcb2367e2a11a21faa1d381d404f51b7257e5bc82e9cf20cd7fe37d7ae761a2ab37 +a93774a03519d2f20fdf2ef46547b0a5b77c137d6a3434b48d56a2cbef9e77120d1b85d0092cf8842909213826699477 +8eb967a495a38130ea28711580b7e61bcd1d051cd9e4f2dbf62f1380bd86e0d60e978d72f6f31e909eb97b3b9a2b867c +ae8213378da1287ba1fe4242e1acaec19b877b6fe872400013c6eac1084b8d03156792fa3020201725b08228a1e80f49 +b143daf6893d674d607772b3b02d8ac48f294237e2f2c87963c0d4e26d9227d94a2a13512457c3d5883544bbc259f0ef +b343bd2aca8973888e42542218924e2dda2e938fd1150d06878af76f777546213912b7c7a34a0f94186817d80ffa185c +b188ebc6a8c3007001aa347ae72cc0b15d09bc6c19a80e386ee4b334734ec0cc2fe8b493c2422f38d1e6d133cc3db6fe +b795f6a8b9b826aaeee18ccd6baf6c5adeeec85f95eb5b6d19450085ec7217e95a2d9e221d77f583b297d0872073ba0e +b1c7dbd998ad32ae57bfa95deafa147024afd57389e98992c36b6e52df915d3d5a39db585141ec2423173e85d212fed8 +812bcdeb9fe5f12d0e1df9964798056e1f1c3de3b17b6bd2919b6356c4b86d8e763c01933efbe0224c86a96d5198a4be +b19ebeda61c23d255cbf472ef0b8a441f4c55b70f0d8ed47078c248b1d3c7c62e076b43b95c00a958ec8b16d5a7cb0d7 +b02adc9aaa20e0368a989c2af14ff48b67233d28ebee44ff3418bb0473592e6b681af1cc45450bd4b175df9051df63d9 +8d87f0714acee522eb58cec00360e762adc411901dba46adc9227124fa70ee679f9a47e91a6306d6030dd4eb8de2f3c1 +8be54cec21e74bcc71de29dc621444263737db15f16d0bb13670f64e42f818154e04b484593d19ef95f2ee17e4b3fe21 +ab8e20546c1db38d31493b5d5f535758afb17e459645c1b70813b1cf7d242fd5d1f4354a7c929e8f7259f6a25302e351 +89f035a1ed8a1e302ac893349ba8ddf967580fcb6e73d44af09e3929cde445e97ff60c87dafe489e2c0ab9c9986cfa00 +8b2b0851a795c19191a692af55f7e72ad2474efdc5401bc3733cfdd910e34c918aaebe69d5ea951bdddf3c01cabbfc67 +a4edb52c2b51495ccd1ee6450fc14b7b3ede8b3d106808929d02fb31475bacb403e112ba9c818d2857651e508b3a7dd1 +9569341fded45d19f00bcf3cbf3f20eb2b4d82ef92aba3c8abd95866398438a2387437e580d8b646f17cf6fde8c5af23 +aa4b671c6d20f72f2f18a939a6ff21cc37e0084b44b4a717f1be859a80b39fb1be026b3205adec2a66a608ec2bcd578f +94902e980de23c4de394ad8aec91b46f888d18f045753541492bfbb92c59d3daa8de37ae755a6853744af8472ba7b72b +af651ef1b2a0d30a7884557edfad95b6b5d445a7561caebdc46a485aedd25932c62c0798465c340a76f6feaa196dd712 +b7b669b8e5a763452128846dd46b530dca4893ace5cc5881c7ddcd3d45969d7e73fbebdb0e78aa81686e5f7b22ec5759 +82507fd4ebe9fa656a7f2e084d64a1fa6777a2b0bc106d686e2d9d2edafc58997e58cb6bfd0453b2bf415704aa82ae62 +b40bce2b42b88678400ecd52955bbdadd15f8b9e1b3751a1a3375dc0efb5ca3ee258cf201e1140b3c09ad41217d1d49e +b0210d0cbb3fbf3b8cdb39e862f036b0ff941cd838e7aaf3a8354e24246e64778d22f3de34572e6b2a580614fb6425be +876693cba4301b251523c7d034108831df3ce133d8be5a514e7a2ca494c268ca0556fa2ad8310a1d92a16b55bcd99ea9 +8660281406d22a4950f5ef050bf71dd3090edb16eff27fa29ef600cdea628315e2054211ed2cc6eaf8f2a1771ef689fd +a610e7e41e41ab66955b809ba4ade0330b8e9057d8efc9144753caed81995edeb1a42a53f93ce93540feca1fae708dac +a49e2c176a350251daef1218efaccc07a1e06203386ede59c136699d25ca5cb2ac1b800c25b28dd05678f14e78e51891 +83e0915aa2b09359604566080d411874af8c993beba97d4547782fdbe1a68e59324b800ff1f07b8db30c71adcbd102a8 +a19e84e3541fb6498e9bb8a099c495cbfcad113330e0262a7e4c6544495bb8a754b2208d0c2d895c93463558013a5a32 +87f2bd49859a364912023aca7b19a592c60214b8d6239e2be887ae80b69ebdeb59742bdebcfa73a586ab23b2c945586c +b8e8fdddae934a14b57bc274b8dcd0d45ebb95ddbaabef4454e0f6ce7d3a5a61c86181929546b3d60c447a15134d08e1 +87e0c31dcb736ea4604727e92dc1d9a3cf00adcff79df3546e02108355260f3dd171531c3c0f57be78d8b28058fcc8c0 +9617d74e8f808a4165a8ac2e30878c349e1c3d40972006f0787b31ea62d248c2d9f3fc3da83181c6e57e95feedfd0e8c +8949e2cee582a2f8db86e89785a6e46bc1565c2d8627d5b6bf43ba71ffadfab7e3c5710f88dcb5fb2fc6edf6f4fae216 +ad3fa7b0edceb83118972a2935a09f409d09a8db3869f30be3a76f67aa9fb379cabb3a3aff805ba023a331cad7d7eb64 +8c95718a4112512c4efbd496be38bf3ca6cdcaad8a0d128f32a3f9aae57f3a57bdf295a3b372a8c549fda8f4707cffed +88f3261d1e28a58b2dee3fcc799777ad1c0eb68b3560f9b4410d134672d9533532a91ea7be28a041784872632d3c9d80 +b47472a41d72dd2e8b72f5c4f8ad626737dde3717f63d6bc776639ab299e564cbad0a2ad5452a07f02ff49a359c437e5 +9896d21dc2e8aad87b76d6df1654f10cd7bceed4884159d50a818bea391f8e473e01e14684814c7780235f28e69dca6e +82d47c332bbd31bbe83b5eb44a23da76d4a7a06c45d7f80f395035822bc27f62f59281d5174e6f8e77cc9b5c3193d6f0 +95c74cd46206e7f70c9766117c34c0ec45c2b0f927a15ea167901a160e1530d8522943c29b61e03568aa0f9c55926c53 +a89d7757825ae73a6e81829ff788ea7b3d7409857b378ebccd7df73fdbe62c8d9073741cf038314971b39af6c29c9030 +8c1cd212d0b010905d560688cfc036ae6535bc334fa8b812519d810b7e7dcf1bb7c5f43deaa40f097158358987324a7f +b86993c383c015ed8d847c6b795164114dd3e9efd25143f509da318bfba89389ea72a420699e339423afd68b6512fafb +8d06bd379c6d87c6ed841d8c6e9d2d0de21653a073725ff74be1934301cc3a79b81ef6dd0aad4e7a9dc6eac9b73019bc +81af4d2d87219985b9b1202d724fe39ef988f14fef07dfe3c3b11714e90ffba2a97250838e8535eb63f107abfe645e96 +8c5e0af6330a8becb787e4b502f34f528ef5756e298a77dc0c7467433454347f3a2e0bd2641fbc2a45b95e231c6e1c02 +8e2a8f0f04562820dc8e7da681d5cad9fe2e85dd11c785fb6fba6786c57a857e0b3bd838fb849b0376c34ce1665e4837 +a39be8269449bfdfc61b1f62077033649f18dae9bef7c6163b9314ca8923691fb832f42776f0160b9e8abd4d143aa4e1 +8c154e665706355e1cc98e0a4cabf294ab019545ba9c4c399d666e6ec5c869ca9e1faf8fb06cd9c0a5c2f51a7d51b70a +a046a7d4de879d3ebd4284f08f24398e9e3bf006cd4e25b5c67273ade248689c69affff92ae810c07941e4904296a563 +afd94c1cb48758e5917804df03fb38a6da0e48cd9b6262413ea13b26973f9e266690a1b7d9d24bbaf7e82718e0e594b0 +859e21080310c8d6a38e12e2ac9f90a156578cdeb4bb2e324700e97d9a5511cd6045dc39d1d0de3f94aeed043a24119d +a219fb0303c379d0ab50893264919f598e753aac9065e1f23ef2949abc992577ab43c636a1d2c089203ec9ddb941e27d +b0fdb639d449588a2ca730afcba59334e7c387342d56defdfb7ef79c493f7fd0e5277eff18e7203e756c7bdda5803047 +87f9c3b7ed01f54368aca6dbcf2f6e06bff96e183c4b2c65f8baa23b377988863a0a125d5cdd41a072da8462ced4c070 +99ef7a5d5ac2f1c567160e1f8c95f2f38d41881850f30c461a205f7b1b9fb181277311333839b13fb3ae203447e17727 +aeaca9b1c2afd24e443326cc68de67b4d9cedb22ad7b501a799d30d39c85bb2ea910d4672673e39e154d699e12d9b3dc +a11675a1721a4ba24dd3d0e4c3c33a6edf4cd1b9f6b471070b4386c61f77452266eae6e3f566a40cfc885eada9a29f23 +b228334445e37b9b49cb4f2cc56b454575e92173ddb01370a553bba665adadd52df353ad74470d512561c2c3473c7bb9 +a18177087c996572d76f81178d18ed1ceebc8362a396348ce289f1d8bd708b9e99539be6fccd4acb1112381cfc5749b4 +8e7b8bf460f0d3c99abb19803b9e43422e91507a1c0c22b29ee8b2c52d1a384da4b87c292e28eff040db5be7b1f8641f +b03d038d813e29688b6e6f444eb56fec3abba64c3d6f890a6bcf2e916507091cdb2b9d2c7484617be6b26552ed1c56cb +a1c88ccd30e934adfc5494b72655f8afe1865a84196abfb376968f22ddc07761210b6a9fb7638f1413d1b4073d430290 +961b714faebf172ad2dbc11902461e286e4f24a99a939152a53406117767682a571057044decbeb3d3feef81f4488497 +a03dc4059b46effdd786a0a03cc17cfee8585683faa35bb07936ded3fa3f3a097f518c0b8e2db92fd700149db1937789 +adf60180c99ca574191cbcc23e8d025b2f931f98ca7dfcebfc380226239b6329347100fcb8b0fcb12db108c6ad101c07 +805d4f5ef24d46911cbf942f62cb84b0346e5e712284f82b0db223db26d51aabf43204755eb19519b00e665c7719fcaa +8dea7243e9c139662a7fe3526c6c601eee72fd8847c54c8e1f2ad93ef7f9e1826b170afe58817dac212427164a88e87f +a2ba42356606d651b077983de1ad643650997bb2babb188c9a3b27245bb65d2036e46667c37d4ce02cb1be5ae8547abe +af2ae50b392bdc013db2d12ce2544883472d72424fc767d3f5cb0ca2d973fc7d1f425880101e61970e1a988d0670c81b +98e6bec0568d3939b31d00eb1040e9b8b2a35db46ddf4369bdaee41bbb63cc84423d29ee510a170fb5b0e2df434ba589 +822ff3cd12fbef4f508f3ca813c04a2e0b9b799c99848e5ad3563265979e753ee61a48f6adc2984a850f1b46c1a43d35 +891e8b8b92a394f36653d55725ef514bd2e2a46840a0a2975c76c2a935577f85289026aaa74384da0afe26775cbddfb9 +b2a3131a5d2fe7c8967047aa66e4524babae941d90552171cc109527f345f42aa0df06dcbb2fa01b33d0043917bbed69 +80c869469900431f3eeefafdbe07b8afd8cee7739e659e6d0109b397cacff85a88247698f87dc4e2fe39a592f250ac64 +9091594f488b38f9d2bb5df49fd8b4f8829d9c2f11a197dd1431ed5abbc5c954bbde3387088f9ee3a5a834beb7619bce +b472e241e6956146cca57b97a8a204668d050423b4e76f857bad5b47f43b203a04c8391ba9d9c3e95093c071f9d376a1 +b7dd2de0284844392f7dfb56fe7ca3ede41e27519753ffc579a0a8d2d65ceb8108d06b6b0d4c3c1a2588951297bd1a1e +902116ce70d0a079ac190321c1f48701318c05f8e69ee09694754885d33a835a849cafe56f499a2f49f6cda413ddf9a7 +b18105cc736787fafaf7c3c11c448bce9466e683159dff52723b7951dff429565e466e4841d982e3aaa9ee2066838666 +97ab9911f3f659691762d568ae0b7faa1047b0aed1009c319fa79d15d0db8db9f808fc385dc9a68fa388c10224985379 +b2a2cba65f5b927e64d2904ba412e2bac1cf18c9c3eda9c72fb70262497ecf505b640827e2afebecf10eebbcf48ccd3e +b36a3fd677baa0d3ef0dac4f1548ff50a1730286b8c99d276a0a45d576e17b39b3cbadd2fe55e003796d370d4be43ce3 +a5dfec96ca3c272566e89dc453a458909247e3895d3e44831528130bc47cc9d0a0dac78dd3cad680a4351d399d241967 +8029382113909af6340959c3e61db27392531d62d90f92370a432aec3eb1e4c36ae1d4ef2ba8ec6edb4d7320c7a453f6 +971d85121ea108e6769d54f9c51299b0381ece8b51d46d49c89f65bedc123bab4d5a8bc14d6f67f4f680077529cbae4c +98ff6afc01d0bec80a278f25912e1b1ebff80117adae72e31d5b9fa4d9624db4ba2065b444df49b489b0607c45e26c4c +8fa29be10fb3ab30ce25920fec0187e6e91e458947009dabb869aade7136c8ba23602682b71e390c251f3743164cbdaa +b3345c89eb1653418fe3940cf3e56a9a9c66526389b98f45ca02dd62bfb37baa69a4baaa7132d7320695f8ea6ad1fd94 +b72c7f5541c9ac6b60a7ec9f5415e7fb14da03f7164ea529952a29399f3a071576608dbbcc0d45994f21f92ddbeb1e19 +aa3450bb155a5f9043d0ef95f546a2e6ade167280bfb75c9f09c6f9cdb1fffb7ce8181436161a538433afa3681c7a141 +92a18fecaded7854b349f441e7102b638ababa75b1b0281dd0bded6541abe7aa37d96693595be0b01fe0a2e2133d50f9 +980756ddf9d2253cfe6c94960b516c94889d09e612810935150892627d2ecee9a2517e04968eea295d0106850c04ca44 +ae68c6ccc454318cdd92f32b11d89116a3b8350207a36d22a0f626718cad671d960090e054c0c77ac3162ae180ecfd4b +99f31f66eaaa551749ad91d48a0d4e3ff4d82ef0e8b28f3184c54e852422ba1bdafd53b1e753f3a070f3b55f3c23b6a2 +a44eaeaa6589206069e9c0a45ff9fc51c68da38d4edff1d15529b7932e6f403d12b9387019c44a1488a5d5f27782a51f +b80b5d54d4b344840e45b79e621bd77a3f83fb4ce6d8796b7d6915107b3f3c34d2e7d95bdafd120f285669e5acf2437a +b36c069ec085a612b5908314d6b84c00a83031780261d1c77a0384c406867c9847d5b0845deddfa512cc04a8df2046fb +b09dbe501583220f640d201acea7ee3e39bf9eda8b91aa07b5c50b7641d86d71acb619b38d27835ce97c3759787f08e9 +87403d46a2bf63170fff0b857acacf42ee801afe9ccba8e5b4aea967b68eac73a499a65ca46906c2eb4c8f27bc739faa +82b93669f42a0a2aa5e250ffe6097269da06a9c02fcd1801abbad415a7729a64f830754bafc702e64600ba47671c2208 +8e3a3029be7edb8dd3ab1f8216664c8dc50d395f603736061d802cef77627db7b859ef287ed850382c13b4d22d6a2d80 +968e9ec7194ff424409d182ce0259acd950c384c163c04463bc8700a40b79beba6146d22b7fa7016875a249b7b31c602 +8b42c984bbe4996e0c20862059167c6bdc5164b1ffcd928f29512664459212d263e89f0f0e30eed4e672ffa5ed0b01b5 +96bac54062110dada905363211133f1f15dc7e4fd80a4c6e4a83bc9a0bcbbaba11cd2c7a13debcf0985e1a954c1da66b +a16dc8a653d67a7cd7ae90b2fffac0bf1ca587005430fe5ba9403edd70ca33e38ba5661d2ed6e9d2864400d997626a62 +a68ab11a570a27853c8d67e491591dcba746bfbee08a2e75ae0790399130d027ed387f41ef1d7de8df38b472df309161 +92532b74886874447c0300d07eda9bbe4b41ed25349a3da2e072a93fe32c89d280f740d8ff70d5816793d7f2b97373cc +88e35711b471e89218fd5f4d0eadea8a29405af1cd81974427bc4a5fb26ed60798daaf94f726c96e779b403a2cd82820 +b5c72aa4147c19f8c4f3a0a62d32315b0f4606e0a7025edc5445571eaf4daff64f4b7a585464821574dd50dbe1b49d08 +9305d9b4095258e79744338683fd93f9e657367b3ab32d78080e51d54eec331edbc224fad5093ebf8ee4bd4286757eb8 +b2a17abb3f6a05bcb14dc7b98321fa8b46d299626c73d7c6eb12140bf4c3f8e1795250870947af817834f033c88a59d6 +b3477004837dbd8ba594e4296f960fc91ab3f13551458445e6c232eb04b326da803c4d93e2e8dcd268b4413305ff84da +924b4b2ebaafdcfdfedb2829a8bf46cd32e1407d8d725a5bd28bdc821f1bafb3614f030ea4352c671076a63494275a3f +8b81b9ef6125c82a9bece6fdcb9888a767ac16e70527753428cc87c56a1236e437da8be4f7ecfe57b9296dc3ae7ba807 +906e19ec8b8edd58bdf9ae05610a86e4ea2282b1bbc1e8b00b7021d093194e0837d74cf27ac9916bdb8ec308b00da3da +b41c5185869071760ac786078a57a2ab4e2af60a890037ac0c0c28d6826f15c2cf028fddd42a9b6de632c3d550bfbc14 +a646e5dec1b713ae9dfdf7bdc6cd474d5731a320403c7dfcfd666ffc9ae0cff4b5a79530e8df3f4aa9cb80568cb138e9 +b0efad22827e562bd3c3e925acbd0d9425d19057868608d78c2209a531cccd0f2c43dc5673acf9822247428ffa2bb821 +a94c19468d14b6f99002fc52ac06bbe59e5c472e4a0cdb225144a62f8870b3f10593749df7a2de0bd3c9476ce682e148 +803864a91162f0273d49271dafaab632d93d494d1af935aefa522768af058fce52165018512e8d6774976d52bd797e22 +a08711c2f7d45c68fb340ac23597332e1bcaec9198f72967b9921204b9d48a7843561ff318f87908c05a44fc35e3cc9d +91c3cad94a11a3197ae4f9461faab91a669e0dddb0371d3cab3ed9aeb1267badc797d8375181130e461eadd05099b2a2 +81bdaaf48aae4f7b480fc13f1e7f4dd3023a41439ba231760409ce9292c11128ab2b0bdbbf28b98af4f97b3551f363af +8d60f9df9fd303f625af90e8272c4ecb95bb94e6efc5da17b8ab663ee3b3f673e9f6420d890ccc94acf4d2cae7a860d8 +a7b75901520c06e9495ab983f70b61483504c7ff2a0980c51115d11e0744683ce022d76e3e09f4e99e698cbd21432a0d +82956072df0586562fda7e7738226f694e1c73518dd86e0799d2e820d7f79233667192c9236dcb27637e4c65ef19d493 +a586beb9b6ffd06ad200957490803a7cd8c9bf76e782734e0f55e04a3dc38949de75dc607822ec405736c576cf83bca3 +a179a30d00def9b34a7e85607a447eea0401e32ab5abeee1a281f2acd1cf6ec81a178020666f641d9492b1bdf66f05a3 +83e129705c538787ed8e0fdc1275e6466a3f4ee21a1e6abedd239393b1df72244723b92f9d9d9339a0cab6ebf28f5a16 +811bd8d1e3722b64cd2f5b431167e7f91456e8bba2cc669d3fbbce7d553e29c3c19f629fcedd2498bc26d33a24891d17 +a243c030c858f1f60cccd26b45b024698cc6d9d9e6198c1ed4964a235d9f8d0baf9cde10c8e63dfaa47f8e74e51a6e85 +ab839eb82e23ca52663281f863b55b0a3d6d4425c33ffb4eeb1d7979488ab068bf99e2a60e82cea4dc42c56c26cbfebe +8b896f9bb21d49343e67aec6ad175b58c0c81a3ca73d44d113ae4354a0065d98eb1a5cafedaf232a2bb9cdc62152f309 +af6230340cc0b66f5bf845540ed4fc3e7d6077f361d60762e488d57834c3e7eb7eacc1b0ed73a7d134f174a01410e50c +88975e1b1af678d1b5179f72300a30900736af580dd748fd9461ef7afccc91ccd9bed33f9da55c8711a7635b800e831f +a97486bb9047391661718a54b8dd5a5e363964e495eae6c692730264478c927cf3e66dd3602413189a3699fbeae26e15 +a5973c161ab38732885d1d2785fd74bf156ba34881980cba27fe239caef06b24a533ffe6dbbbeca5e6566682cc00300a +a24776e9a840afda0003fa73b415d5bd6ecd9b5c2cc842b643ee51b8c6087f4eead4d0bfbd987eb174c489a7b952ff2a +a8a6ee06e3af053b705a12b59777267c546f33ba8a0f49493af8e6df4e15cf8dd2d4fb4daf7e84c6b5d3a7363118ff03 +a28e59ce6ad02c2ce725067c0123117e12ac5a52c8f5af13eec75f4a9efc4f696777db18a374fa33bcae82e0734ebd16 +86dfc3b78e841c708aff677baa8ee654c808e5d257158715097c1025d46ece94993efe12c9d188252ad98a1e0e331fec +a88d0275510f242eab11fdb0410ff6e1b9d7a3cbd3658333539815f1b450a84816e6613d15aa8a8eb15d87cdad4b27a2 +8440acea2931118a5b481268ff9f180ee4ede85d14a52c026adc882410825b8275caa44aff0b50c2b88d39f21b1a0696 +a7c3182eab25bd6785bacf12079d0afb0a9b165d6ed327814e2177148539f249eb9b5b2554538f54f3c882d37c0a8abe +85291fbe10538d7da38efdd55a7acebf03b1848428a2f664c3ce55367aece60039f4f320b1771c9c89a35941797f717c +a2c6414eeb1234728ab0de94aa98fc06433a58efa646ca3fcbd97dbfb8d98ae59f7ce6d528f669c8149e1e13266f69c9 +840c8462785591ee93aee2538d9f1ec44ba2ca61a569ab51d335ac873f5d48099ae8d7a7efa0725d9ff8f9475bfa4f56 +a7065a9d02fb3673acf7702a488fbc01aa69580964932f6f40b6c2d1c386b19e50b0e104fcac24ea26c4e723611d0238 +b72db6d141267438279e032c95e6106c2ccb3164b842ba857a2018f3a35f4b040da92680881eb17cd61d0920d5b8f006 +a8005d6c5960e090374747307ef0be2871a7a43fa4e76a16c35d2baab808e9777b496e9f57a4218b23390887c33a0b55 +8e152cea1e00a451ca47c20a1e8875873419700af15a5f38ee2268d3fbc974d4bd5f4be38008fa6f404dbdedd6e6e710 +a3391aed1fcd68761f06a7d1008ec62a09b1cb3d0203cd04e300a0c91adfed1812d8bc1e4a3fd7976dc0aae0e99f52f1 +967eb57bf2aa503ee0c6e67438098149eac305089c155f1762cf5e84e31f0fbf27c34a9af05621e34645c1ec96afaec8 +88af97ddc4937a95ec0dcd25e4173127260f91c8db2f6eac84afb789b363705fb3196235af631c70cafd09411d233589 +a32df75b3f2c921b8767638fd289bcfc61e08597170186637a7128ffedd52c798c434485ac2c7de07014f9e895c2c3d8 +b0a783832153650aa0d766a3a73ec208b6ce5caeb40b87177ffc035ab03c7705ecdd1090b6456a29f5fb7e90e2fa8930 +b59c8e803b4c3486777d15fc2311b97f9ded1602fa570c7b0200bada36a49ee9ef4d4c1474265af8e1c38a93eb66b18b +982f2c85f83e852022998ff91bafbb6ff093ef22cf9d5063e083a48b29175ccbd51b9c6557151409e439096300981a6c +939e3b5989fefebb9d272a954659a4eb125b98c9da6953f5e628d26266bd0525ec38304b8d56f08d65abc4d6da4a8dbb +8898212fe05bc8de7d18503cb84a1c1337cc2c09d1eeef2b475aa79185b7322bf1f8e065f1bf871c0c927dd19faf1f6d +94b0393a41cd00f724aee2d4bc72103d626a5aecb4b5486dd1ef8ac27528398edf56df9db5c3d238d8579af368afeb09 +96ac564450d998e7445dd2ea8e3fc7974d575508fa19e1c60c308d83b645864c029f2f6b7396d4ff4c1b24e92e3bac37 +8adf6638e18aff3eb3b47617da696eb6c4bdfbecbbc3c45d3d0ab0b12cbad00e462fdfbe0c35780d21aa973fc150285e +b53f94612f818571b5565bbb295e74bada9b5f9794b3b91125915e44d6ddcc4da25510eab718e251a09c99534d6042d9 +8b96462508d77ee083c376cd90807aebad8de96bca43983c84a4a6f196d5faf6619a2351f43bfeec101864c3bf255519 +aeadf34657083fc71df33bd44af73bf5281c9ca6d906b9c745536e1819ea90b56107c55e2178ebad08f3ba75b3f81c86 +9784ba29b2f0057b5af1d3ab2796d439b8753f1f749c73e791037461bdfc3f7097394283105b8ab01788ea5255a96710 +8756241bda159d4a33bf74faba0d4594d963c370fb6a18431f279b4a865b070b0547a6d1613cf45b8cfb5f9236bbf831 +b03ebfd6b71421dfd49a30460f9f57063eebfe31b9ceaa2a05c37c61522b35bdc09d7db3ad75c76c253c00ba282d3cd2 +b34e7e6341fa9d854b2d3153bdda0c4ae2b2f442ab7af6f99a0975d45725aa48e36ae5f7011edd249862e91f499687d4 +b462ee09dc3963a14354244313e3444de5cc37ea5ccfbf14cd9aca8027b59c4cb2a949bc30474497cab8123e768460e6 +aea753290e51e2f6a21a9a0ee67d3a2713f95c2a5c17fe41116c87d3aa77b1683761264d704df1ac34f8b873bc88ef7b +98430592afd414394f98ddfff9f280fcb1c322dbe3510f45e1e9c4bb8ee306b3e0cf0282c0ee73ebb8ba087d4d9e0858 +b95d3b5aaf54ffca11f4be8d57f76e14afdb20afc859dc7c7471e0b42031e8f3d461b726ecb979bdb2f353498dfe95ea +984d17f9b11a683132e0b5a9ee5945e3ff7054c2d5c716be73b29078db1d36f54c6e652fd2f52a19da313112e97ade07 +ab232f756b3fff3262be418a1af61a7e0c95ceebbc775389622a8e10610508cd6784ab7960441917a83cc191c58829ea +a28f41678d6e60de76b0e36ab10e4516e53e02e9c77d2b5af3cfeee3ce94cfa30c5797bd1daab20c98e1cad83ad0f633 +b55395fca84dd3ccc05dd480cb9b430bf8631ff06e24cb51d54519703d667268c2f8afcde4ba4ed16bece8cc7bc8c6e0 +8a8a5392a0e2ea3c7a8c51328fab11156004e84a9c63483b64e8f8ebf18a58b6ffa8fe8b9d95af0a2f655f601d096396 +ab480000fe194d23f08a7a9ec1c392334e9c687e06851f083845121ce502c06b54dda8c43092bcc1035df45cc752fe9b +b265644c29f628d1c7e8e25a5e845cabb21799371814730a41a363e1bda8a7be50fee7c3996a365b7fcba4642add10db +b8a915a3c685c2d4728f6931c4d29487cad764c5ce23c25e64b1a3259ac27235e41b23bfe7ae982921b4cb84463097df +8efa7338442a4b6318145a5440fc213b97869647eeae41b9aa3c0a27ee51285b73e3ae3b4a9423df255e6add58864aa9 +9106d65444f74d217f4187dfc8fcf3810b916d1e4275f94f6a86d1c4f3565b131fd6cde1fa708bc05fe183c49f14941a +948252dac8026bbbdb0a06b3c9d66ec4cf9532163bab68076fda1bd2357b69e4b514729c15aaa83b5618b1977bbc60c4 +ae6596ccfdf5cbbc5782efe3bb0b101bb132dbe1d568854ca24cacc0b2e0e9fabcb2ca7ab42aecec412efd15cf8cb7a2 +84a0b6c198ff64fd7958dfd1b40eac9638e8e0b2c4cd8cf5d8cdf80419baee76a05184bce6c5b635f6bf2d30055476a7 +8893118be4a055c2b3da593dbca51b1ae2ea2469911acfb27ee42faf3e6c3ad0693d3914c508c0b05b36a88c8b312b76 +b097479e967504deb6734785db7e60d1d8034d6ca5ba9552887e937f5e17bb413fccac2c1d1082154ed76609127860ad +a0294e6b9958f244d29943debf24b00b538b3da1116269b6e452bb12dc742226712fd1a15b9c88195afeb5d2415f505c +b3cc15f635080bc038f61b615f62b5b5c6f2870586191f59476e8368a73641d6ac2f7d0c1f54621982defdb318020230 +99856f49b9fe1604d917c94d09cc0ed753d13d015d30587a94e6631ffd964b214e607deb8a69a8b5e349a7edf4309206 +a8571e113ea22b4b4fce41a094da8c70de37830ae32e62c65c2fa5ad06a9bc29e884b945e73d448c72b176d6ecebfb58 +a9e9c6e52beb0013273c29844956b3ce291023678107cdc785f7b44eff5003462841ad8780761b86aefc6b734adde7cf +80a784b0b27edb51ef2bad3aee80e51778dcaa0f3f5d3dcb5dc5d4f4b2cf7ae35b08de6680ea9dac53f8438b92eb09ef +827b543e609ea328e97e373f70ad72d4915a2d1daae0c60d44ac637231070e164c43a2a58db80a64df1c624a042b38f9 +b449c65e8195202efdcb9bdb4e869a437313b118fef8b510cbbf8b79a4e99376adb749b37e9c20b51b31ed3310169e27 +8ea3028f4548a79a94c717e1ed28ad4d8725b8d6ab18b021063ce46f665c79da3c49440c6577319dab2d036b7e08f387 +897798431cfb17fe39f08f5f854005dc37b1c1ec1edba6c24bc8acb3b88838d0534a75475325a5ea98b326ad47dbad75 +89cf232e6303b0751561960fd4dea5754a28c594daf930326b4541274ffb03c7dd75938e411eb9a375006a70ce38097f +9727c6ae7f0840f0b6c8bfb3a1a5582ceee705e0b5c59b97def7a7a2283edd4d3f47b7971e902a3a2079e40b53ff69b8 +b76ed72b122c48679d221072efc0eeea063cb205cbf5f9ef0101fd10cb1075b8628166c83577cced654e1c001c7882f7 +ae908c42d208759da5ee9b405df85a6532ea35c6f0f6a1288d22870f59d98edc896841b8ac890a538e6c8d1e8b02d359 +809d12fe4039a0ec80dc9be6a89acaab7797e5f7f9b163378f52f9a75a1d73b2e9ae6e3dd49e32ced439783c1cabbef5 +a4149530b7f85d1098ba534d69548c6c612c416e8d35992fc1f64f4deeb41e09e49c6cf7aadbed7e846b91299358fe2d +a49342eacd1ec1148b8df1e253b1c015f603c39de11fa0a364ccb86ea32d69c34fd7aa6980a1fadcd8e785a57fa46f60 +87d43eff5a006dc4dddcf76cc96c656a1f3a68f19f124181feab86c6cc9a52cb9189cdbb423414defdd9bb0ca8ff1ddc +861367e87a9aa2f0f68296ba50aa5dbc5713008d260cc2c7e62d407c2063064749324c4e8156dc21b749656cfebce26b +b5303c2f72e84e170e66ae1b0fbd51b8c7a6f27476eaf5694b64e8737d5c84b51fe90100b256465a4c4156dd873cddb0 +b62849a4f891415d74f434cdc1d23c4a69074487659ca96e1762466b2b7a5d8525b056b891d0feea6fe6845cba8bc7fb +923dd9e0d6590a9307e8c4c23f13bae3306b580e297a937711a8b13e8de85e41a61462f25b7d352b682e8437bf2b4ab3 +9147379860cd713cd46c94b8cdf75125d36c37517fbecf81ace9680b98ce6291cd1c3e472f84249cc3b2b445e314b1b6 +a808a4f17ac21e3fb5cfef404e61fae3693ca3e688d375f99b6116779696059a146c27b06de3ac36da349b0649befd56 +87787e9322e1b75e66c1f0d9ea0915722a232770930c2d2a95e9478c4b950d15ab767e30cea128f9ed65893bfc2d0743 +9036a6ee2577223be105defe1081c48ea7319e112fff9110eb9f61110c319da25a6cea0464ce65e858635b079691ef1f +af5548c7c24e1088c23b57ee14d26c12a83484c9fd9296edf1012d8dcf88243f20039b43c8c548c265ef9a1ffe9c1c88 +a0fff520045e14065965fb8accd17e878d3fcaf9e0af2962c8954e50be6683d31fa0bf4816ab68f08630dbac6bfce52a +b4c1b249e079f6ae1781af1d97a60b15855f49864c50496c09c91fe1946266915b799f0406084d7783f5b1039116dd8b +8b0ffa5e7c498cb3879dddca34743b41eee8e2dea3d4317a6e961b58adb699ef0c92400c068d5228881a2b08121226bf +852ae8b19a1d80aa8ae5382e7ee5c8e7670ceb16640871c56b20b96b66b3b60e00015a3dde039446972e57b49a999ddd +a49942f04234a7d8492169da232cfff8051df86e8e1ba3db46aede02422c689c87dc1d99699c25f96cb763f5ca0983e5 +b04b597b7760cf5dcf411ef896d1661e6d5b0db3257ac2cf64b20b60c6cc18fa10523bb958a48d010b55bac7b02ab3b1 +a494591b51ea8285daecc194b5e5bd45ae35767d0246ac94fae204d674ee180c8e97ff15f71f28b7aeb175b8aea59710 +97d2624919e78406e7460730680dea8e71c8571cf988e11441aeea54512b95bd820e78562c99372d535d96f7e200d20d +ac693ddb00e48f76e667243b9b6a7008424043fb779e4f2252330285232c3fccac4da25cbd6d95fe9ad959ff305a91f6 +8d20ca0a71a64a3f702a0825bb46bd810d03bebfb227683680d474a52f965716ff99e19a165ebaf6567987f4f9ee3c94 +a5c516a438f916d1d68ca76996404792e0a66e97b7f18fc54c917bf10cf3211b62387932756e39e67e47b0bd6e88385a +b089614d830abc0afa435034cec7f851f2f095d479cacf1a3fb57272da826c499a52e7dcbc0eb85f4166fb94778e18e9 +a8dacc943765d930848288192f4c69e2461c4b9bc6e79e30eeef9a543318cf9ae9569d6986c65c5668a89d49993f8e07 +ab5a9361fa339eec8c621bdad0a58078983abd8942d4282b22835d7a3a47e132d42414b7c359694986f7db39386c2e19 +94230517fb57bd8eb26c6f64129b8b2abd0282323bf7b94b8bac7fab27b4ecc2c4290c294275e1a759de19f2216134f3 +b8f158ea5006bc3b90b285246625faaa6ac9b5f5030dc69701b12f3b79a53ec7e92eeb5a63bbd1f9509a0a3469ff3ffc +8b6944fd8cb8540957a91a142fdcda827762aa777a31e8810ca6d026e50370ee1636fc351724767e817ca38804ebe005 +82d1ee40fe1569c29644f79fa6c4033b7ed45cd2c3b343881f6eb0de2e79548fded4787fae19bed6ee76ed76ff9f2f11 +a8924c7035e99eaed244ca165607e7e568b6c8085510dcdbaf6ebdbed405af2e6c14ee27d94ffef10d30aa52a60bf66d +956f82a6c2ae044635e85812581e4866c5fa2f427b01942047d81f6d79a14192f66fbbe77c9ffeaef4e6147097fdd2b5 +b1100255a1bcf5e05b6aff1dfeb6e1d55b5d68d43a7457ba10cc76b61885f67f4d0d5179abda786e037ae95deb8eea45 +99510799025e3e5e8fbf06dedb14c060c6548ba2bda824f687d3999dc395e794b1fb6514b9013f3892b6cf65cb0d65aa +8f9091cebf5e9c809aab415942172258f894e66e625d7388a05289183f01b8d994d52e05a8e69f784fba41db9ea357f0 +a13d2eeb0776bdee9820ecb6693536720232848c51936bb4ef4fe65588d3f920d08a21907e1fdb881c1ad70b3725e726 +a68b8f18922d550284c5e5dc2dda771f24c21965a6a4d5e7a71678178f46df4d8a421497aad8fcb4c7e241aba26378a0 +8b7601f0a3c6ad27f03f2d23e785c81c1460d60100f91ea9d1cab978aa03b523150206c6d52ce7c7769c71d2c8228e9e +a8e02926430813caa851bb2b46de7f0420f0a64eb5f6b805401c11c9091d3b6d67d841b5674fa2b1dce0867714124cd8 +b7968ecba568b8193b3058400af02c183f0a6df995a744450b3f7e0af7a772454677c3857f99c140bbdb2a09e832e8e0 +8f20b1e9ba87d0a3f35309b985f3c18d2e8800f1ca7f0c52cadef773f1496b6070c936eea48c4a1cae83fd2524e9d233 +88aef260042db0d641a51f40639dbeeefa9e9811df30bee695f3791f88a2f84d318f04e8926b7f47bf25956cb9e3754f +9725345893b647e9ba4e6a29e12f96751f1ae25fcaec2173e9a259921a1a7edb7a47159b3c8767e44d9e2689f5aa0f72 +8c281e6f72752cb11e239e4df9341c45106eb7993c160e54423c2bffe10bc39d42624b45a1f673936ef2e1a02fc92f1a +90aba2f68bddb2fcce6c51430dacdfeec43ea8dc379660c99095df11017691ccf5faa27665cf4b9f0eea7728ae53c327 +b7022695c16521c5704f49b7ddbdbec9b5f57ce0ceebe537bc0ebb0906d8196cc855a9afeb8950a1710f6a654464d93f +8fe1b9dd3c6a258116415d36e08374e094b22f0afb104385a5da48be17123e86fb8327baacc4f0d9ebae923d55d99bb5 +817e85d8e3d19a4cbc1dec31597142c2daa4871bda89c2177fa719c00eda3344eb08b82eb92d4aa91a9eaacb3fc09783 +b59053e1081d2603f1ca0ba553804d6fa696e1fd996631db8f62087b26a40dfef02098b0326bb75f99ec83b9267ca738 +990a173d857d3ba81ff3789b931bfc9f5609cde0169b7f055fa3cb56451748d593d62d46ba33f80f9cafffe02b68dd14 +b0c538dbba4954b809ab26f9f94a3cf1dcb77ce289eaec1d19f556c0ae4be1fa03af4a9b7057837541c3cc0a80538736 +ac3ba42f5f44f9e1fc453ce49c4ab79d0e1d5c42d3b30b1e098f3ab3f414c4c262fa12fb2be249f52d4aaf3c5224beb9 +af47467eb152e59870e21f0d4da2f43e093daf40180ab01438030684b114d025326928eaab12c41b81a066d94fce8436 +98d1b58ba22e7289b1c45c79a24624f19b1d89e00f778eef327ec4856a9a897278e6f1a9a7e673844b31dde949153000 +97ccb15dfadc7c59dca08cfe0d22df2e52c684cf97de1d94bc00d7ba24e020025130b0a39c0f4d46e4fc872771ee7875 +b699e4ed9a000ff96ca296b2f09dce278832bc8ac96851ff3cff99ed3f6f752cfc0fea8571be28cd9b5a7ec36f1a08ee +b9f49f0edb7941cc296435ff0a912e3ad16848ee8765ab5f60a050b280d6ea585e5b34051b15f6b8934ef01ceb85f648 +ac3893df7b4ceab23c6b9054e48e8ba40d6e5beda8fbe90b814f992f52494186969b35d8c4cdc3c99890a222c9c09008 +a41293ad22fae81dea94467bc1488c3707f3d4765059173980be93995fa4fcc3c9340796e3eed0beeb0ba0d9bb4fa3aa +a0543e77acd2aeecde13d18d258aeb2c7397b77f17c35a1992e8666ea7abcd8a38ec6c2741bd929abba2f766138618cc +92e79b22bc40e69f6527c969500ca543899105837b6b1075fa1796755c723462059b3d1b028e0b3df2559fa440e09175 +a1fa1eac8f41a5197a6fb4aa1eae1a031c89f9c13ff9448338b222780cf9022e0b0925d930c37501a0ef7b2b00fdaf83 +b3cb29ff73229f0637335f28a08ad8c5f166066f27c6c175164d0f26766a927f843b987ee9b309ed71cbf0a65d483831 +84d4ab787f0ac00f104f4a734dc693d62d48c2aeb03913153da62c2ae2c27d11b1110dcef8980368dd84682ea2c1a308 +ab6a8e4bbc78d4a7b291ad3e9a8fe2d65f640524ba3181123b09d2d18a9e300e2509ccf7000fe47e75b65f3e992a2e7e +b7805ebe4f1a4df414003dc10bca805f2ab86ca75820012653e8f9b79c405196b0e2cab099f2ab953d67f0d60d31a0f9 +b12c582454148338ea605d22bd00a754109063e22617f1f8ac8ddf5502c22a181c50c216c3617b9852aa5f26af56b323 +86333ad9f898947e31ce747728dc8c887479e18d36ff3013f69ebef807d82c6981543b5c3788af93c4d912ba084d3cba +b514efa310dc4ad1258add138891e540d8c87142a881b5f46563cc58ecd1488e6d3a2fca54c0b72a929f3364ca8c333e +aa0a30f92843cf2f484066a783a1d75a7aa6f41f00b421d4baf20a6ac7886c468d0eea7ca8b17dd22f4f74631b62b640 +b3b7dc63baec9a752e8433c0cdee4d0f9bc41f66f2b8d132faf925eef9cf89aae756fc132c45910f057122462605dc10 +b9b8190dac5bfdeb59fd44f4da41a57e7f1e7d2c21faba9da91fa45cbeca06dcf299c9ae22f0c89ece11ac46352d619f +89f8cf36501ad8bdfeab863752a9090e3bfda57cf8fdeca2944864dc05925f501e252c048221bcc57136ab09a64b64b2 +b0cbfaf317f05f97be47fc9d69eda2dd82500e00d42612f271a1fe24626408c28881f171e855bd5bd67409f9847502b4 +a7c21a8fcede581bfd9847b6835eda62ba250bea81f1bb17372c800a19c732abe03064e64a2f865d974fb636cab4b859 +95f9df524ba7a4667351696c4176b505d8ea3659f5ff2701173064acc624af69a0fad4970963736383b979830cb32260 +856a74fe8b37a2e3afeac858c8632200485d438422a16ae3b29f359e470e8244995c63ad79c7e007ed063f178d0306fd +b37faa4d78fdc0bb9d403674dbea0176c2014a171c7be8527b54f7d1a32a76883d3422a3e7a5f5fcc5e9b31b57822eeb +8d37234d8594ec3fe75670b5c9cc1ec3537564d4739b2682a75b18b08401869a4264c0f264354219d8d896cded715db4 +b5289ee5737f0e0bde485d32096d23387d68dab8f01f47821ab4f06cc79a967afe7355e72dc0c751d96b2747b26f6255 +9085e1fdf9f813e9c3b8232d3c8863cd84ab30d45e8e0d3d6a0abd9ebc6fd70cdf749ff4d04390000e14c7d8c6655fc7 +93a388c83630331eca4da37ea4a97b3b453238af474817cc0a0727fd3138dcb4a22de38c04783ec829c22cb459cb4e8e +a5377116027c5d061dbe24c240b891c08cdd8cd3f0899e848d682c873aff5b8132c1e7cfe76d2e5ed97ee0eb1d42cb68 +a274c84b04338ed28d74683e2a7519c2591a3ce37c294d6f6e678f7d628be2db8eff253ede21823e2df7183e6552f622 +8bc201147a842453a50bec3ac97671397bc086d6dfc9377fa38c2124cdc286abda69b7324f47d64da094ae011d98d9d9 +9842d0c066c524592b76fbec5132bc628e5e1d21c424bec4555efca8619cc1fd8ea3161febcb8b9e8ab54702f4e815e2 +a19191b713a07efe85c266f839d14e25660ee74452e6c691cd9997d85ae4f732052d802d3deb018bdd847caa298a894b +a24f71fc0db504da4e287dd118a4a74301cbcd16033937ba2abc8417956fcb4ae19b8e63b931795544a978137eff51cb +a90eec4a6a3a4b8f9a5b93d978b5026fcf812fe65585b008d7e08c4aaf21195a1d0699f12fc16f79b6a18a369af45771 +8b551cf89737d7d06d9b3b9c4c1c73b41f2ea0af4540999c70b82dabff8580797cf0a3caf34c86c59a7069eb2e38f087 +b8d312e6c635e7a216a1cda075ae77ba3e1d2fd501dc31e83496e6e81ed5d9c7799f8e578869c2e0e256fb29f5de10a7 +8d144bdb8cae0b2cdb5b33d44bbc96984a5925202506a8cc65eb67ac904b466f5a7fe3e1cbf04aa785bbb7348c4bb73c +a101b3d58b7a98659244b88de0b478b3fb87dc5fc6031f6e689b99edf498abd43e151fd32bd4bbd240e0b3e59c440359 +907453abca7d8e7151a05cc3d506c988007692fe7401395dc93177d0d07d114ab6cca0cc658eb94c0223fe8658295cad +825329ffbe2147ddb68f63a0a67f32d7f309657b8e5d9ab5bb34b3730bfa2c77a23eaaadb05def7d9f94a9e08fdc1e96 +88ee923c95c1dac99ae7ed6067906d734d793c5dc5d26339c1bb3314abe201c5dccb33b9007351885eb2754e9a8ea06c +98bc9798543f5f1adc9f2cfcfa72331989420e9c3f6598c45269f0dc9b7c8607bbeaf03faa0aea2ddde2b8f17fdceff5 +8ee87877702a79aef923ab970db6fa81561b3c07d5bf1a072af0a7bad765b4cbaec910afe1a91703feacc7822fa38a94 +8060b9584aa294fe8adc2b22f67e988bc6da768eae91e429dcc43ddc53cfcc5d6753fdc1b420b268c7eb2fb50736a970 +b344a5524d80a2f051870c7001f74fcf348a70fcf78dbd20c6ff9ca85d81567d2318c8b8089f2c4f195d6aec9fc15fa6 +8f5a5d893e1936ed062149d20eb73d98b62b7f50ab5d93a6429c03656b36688d1c80cb5010e4977491e51fa0d7dd35d5 +86fa32ebbf97328c5f5f15564e1238297e289ec3219b9a741724e9f3ae8d5c15277008f555863a478b247ba5dc601d44 +9557e55377e279f4b6b5e0ffe01eca037cc13aac242d67dfcd0374a1e775c5ed5cb30c25fe21143fee54e3302d34a3ea +8cb6bcbc39372d23464a416ea7039f57ba8413cf3f00d9a7a5b356ab20dcb8ed11b3561f7bce372b8534d2870c7ee270 +b5d59075cb5abde5391f64b6c3b8b50adc6e1f654e2a580b6d6d6eff3f4fbdd8fffc92e06809c393f5c8eab37f774c4b +afcfb6903ef13e493a1f7308675582f15af0403b6553e8c37afb8b2808ad21b88b347dc139464367dc260df075fea1ad +810fbbe808375735dd22d5bc7fc3828dc49fdd22cc2d7661604e7ac9c4535c1df578780affb3b895a0831640a945bcad +8056b0c678803b416f924e09a6299a33cf9ad7da6fe1ad7accefe95c179e0077da36815fde3716711c394e2c5ea7127f +8b67403702d06979be19f1d6dc3ec73cc2e81254d6b7d0cc49cd4fdda8cd51ab0835c1d2d26fc0ecab5df90585c2f351 +87f97f9e6d4be07e8db250e5dd2bffdf1390665bc5709f2b631a6fa69a7fca958f19bd7cc617183da1f50ee63e9352b5 +ae151310985940471e6803fcf37600d7fa98830613e381e00dab943aec32c14162d51c4598e8847148148000d6e5af5c +81eb537b35b7602c45441cfc61b27fa9a30d3998fad35a064e05bc9479e9f10b62eba2b234b348219eea3cadcaac64bb +8a441434934180ab6f5bc541f86ebd06eadbee01f438836d797e930fa803a51510e005c9248cecc231a775b74d12b5e9 +81f3c250a27ba14d8496a5092b145629eb2c2e6a5298438670375363f57e2798207832c8027c3e9238ad94ecdadfc4df +a6217c311f2f3db02ceaa5b6096849fe92b6f4b6f1491535ef8525f6ccee6130bed2809e625073ecbaddd4a3eb3df186 +82d1c396f0388b942cf22b119d7ef1ad03d3dad49a74d9d01649ee284f377c8daddd095d596871669e16160299a210db +a40ddf7043c5d72a7246bd727b07f7fff1549f0e443d611de6f9976c37448b21664c5089c57f20105102d935ab82f27b +b6c03c1c97adf0c4bf4447ec71366c6c1bff401ba46236cd4a33d39291e7a1f0bb34bd078ba3a18d15c98993b153a279 +8a94f5f632068399c359c4b3a3653cb6df2b207379b3d0cdace51afdf70d6d5cce6b89a2b0fee66744eba86c98fb21c2 +b2f19e78ee85073f680c3bba1f07fd31b057c00b97040357d97855b54a0b5accb0d3b05b2a294568fcd6a4be6f266950 +a74632d13bbe2d64b51d7a9c3ae0a5a971c19f51cf7596a807cea053e6a0f3719700976d4e394b356c0329a2dced9aa2 +afef616d341a9bc94393b8dfba68ff0581436aa3a3adb7c26a1bbf2cf19fa877066191681f71f17f3cd6f9cf6bf70b5a +8ce96d93ae217408acf7eb0f9cbb9563363e5c7002e19bbe1e80760bc9d449daee2118f3878b955163ed664516b97294 +8414f79b496176bc8b8e25f8e4cfee28f4f1c2ddab099d63d2aca1b6403d26a571152fc3edb97794767a7c4686ad557c +b6c61d01fd8ce087ef9f079bf25bf10090db483dd4f88c4a786d31c1bdf52065651c1f5523f20c21e75cea17df69ab73 +a5790fd629be70545093631efadddc136661f63b65ec682609c38ef7d3d7fa4e56bdf94f06e263bc055b90cb1c6bcefe +b515a767e95704fb7597bca9e46f1753abacdc0e56e867ee3c6f4cd382643c2a28e65312c05ad040eaa3a8cbe7217a65 +8135806a02ead6aa92e9adb6fefb91349837ab73105aaa7be488ef966aa8dfaafdfa64bbae30fcbfa55dd135a036a863 +8f22435702716d76b1369750694540742d909d5e72b54d0878245fab7c269953b1c6f2b29c66f08d5e0263ca3a731771 +8e0f8a8e8753e077dac95848212aeffd51c23d9b6d611df8b102f654089401954413ecbedc6367561ca599512ae5dda7 +815a9084e3e2345f24c5fa559deec21ee1352fb60f4025c0779be65057f2d528a3d91593bd30d3a185f5ec53a9950676 +967e6555ccba395b2cc1605f8484c5112c7b263f41ce8439a99fd1c71c5ed14ad02684d6f636364199ca48afbbde13be +8cd0ccf17682950b34c796a41e2ea7dd5367aba5e80a907e01f4cdc611e4a411918215e5aebf4292f8b24765d73314a6 +a58bf1bbb377e4b3915df6f058a0f53b8fb8130fdec8c391f6bc82065694d0be59bb67ffb540e6c42cc8b380c6e36359 +92af3151d9e6bfb3383d85433e953c0160859f759b0988431ec5893542ba40288f65db43c78a904325ef8d324988f09d +8011bbb05705167afb47d4425065630f54cb86cd462095e83b81dfebf348f846e4d8fbcf1c13208f5de1931f81da40b9 +81c743c104fc3cb047885c9fa0fb9705c3a83ee24f690f539f4985509c3dafd507af3f6a2128276f45d5939ef70c167f +a2c9679b151c041aaf5efeac5a737a8f70d1631d931609fca16be1905682f35e291292874cb3b03f14994f98573c6f44 +a4949b86c4e5b1d5c82a337e5ce6b2718b1f7c215148c8bfb7e7c44ec86c5c9476048fc5c01f57cb0920876478c41ad6 +86c2495088bd1772152e527a1da0ef473f924ea9ab0e5b8077df859c28078f73c4e22e3a906b507fdf217c3c80808b5c +892e0a910dcf162bcea379763c3e2349349e4cda9402949255ac4a78dd5a47e0bf42f5bd0913951576b1d206dc1e536a +a7009b2c6b396138afe4754b7cc10dee557c51c7f1a357a11486b3253818531f781ea8107360c8d4c3b1cd96282353c0 +911763ef439c086065cc7b4e57484ed6d693ea44acee4b18c9fd998116da55fbe7dcb8d2a0f0f9b32132fca82d73dff6 +a722000b95a4a2d40bed81870793f15ba2af633f9892df507f2842e52452e02b5ea8dea6a043c2b2611d82376e33742a +9387ac49477bd719c2f92240d0bdfcf9767aad247ca93dc51e56106463206bc343a8ec855eb803471629a66fffb565d6 +92819a1fa48ab4902939bb72a0a4e6143c058ea42b42f9bc6cea5df45f49724e2530daf3fc4f097cceefa2a8b9db0076 +98eac7b04537653bc0f4941aae732e4b1f84bd276c992c64a219b8715eb1fb829b5cbd997d57feb15c7694c468f95f70 +b275e7ba848ce21bf7996e12dbeb8dadb5d0e4f1cb5a0248a4f8f9c9fe6c74e3c93f4b61edbcb0a51af5a141e1c14bc7 +97243189285aba4d49c53770c242f2faf5fd3914451da4931472e3290164f7663c726cf86020f8f181e568c72fd172d1 +839b0b3c25dd412bee3dc24653b873cc65454f8f16186bb707bcd58259c0b6765fa4c195403209179192a4455c95f3b8 +8689d1a870514568a074a38232e2ceb4d7df30fabeb76cff0aed5b42bf7f02baea12c5fadf69f4713464dbd52aafa55f +8958ae7b290f0b00d17c3e9fdb4dbf168432b457c7676829299dd428984aba892de1966fc106cfc58a772862ecce3976 +a422bc6bd68b8870cfa5bc4ce71781fd7f4368b564d7f1e0917f6013c8bbb5b240a257f89ecfdbecb40fe0f3aa31d310 +aa61f78130cebe09bc9a2c0a37f0dd57ed2d702962e37d38b1df7f17dc554b1d4b7a39a44182a452ce4c5eb31fa4cfcc +b7918bd114f37869bf1a459023386825821bfadce545201929d13ac3256d92a431e34f690a55d944f77d0b652cefeffc +819bba35fb6ace1510920d4dcff30aa682a3c9af9022e287751a6a6649b00c5402f14b6309f0aeef8fce312a0402915e +8b7c9ad446c6f63c11e1c24e24014bd570862b65d53684e107ba9ad381e81a2eaa96731b4b33536efd55e0f055071274 +8fe79b53f06d33386c0ec7d6d521183c13199498594a46d44a8a716932c3ec480c60be398650bbfa044fa791c4e99b65 +9558e10fb81250b9844c99648cf38fa05ec1e65d0ccbb18aa17f2d1f503144baf59d802c25be8cc0879fff82ed5034ad +b538a7b97fbd702ba84645ca0a63725be1e2891c784b1d599e54e3480e4670d0025526674ef5cf2f87dddf2290ba09f0 +92eafe2e869a3dd8519bbbceb630585c6eb21712b2f31e1b63067c0acb5f9bdbbcbdb612db4ea7f9cc4e7be83d31973f +b40d21390bb813ab7b70a010dff64c57178418c62685761784e37d327ba3cb9ef62df87ecb84277c325a637fe3709732 +b349e6fbf778c4af35fbed33130bd8a7216ed3ba0a79163ebb556e8eb8e1a7dad3456ddd700dad9d08d202491c51b939 +a8fdaedecb251f892b66c669e34137f2650509ade5d38fbe8a05d9b9184bb3b2d416186a3640429bd1f3e4b903c159dd +ac6167ebfee1dbab338eff7642f5e785fc21ef0b4ddd6660333fe398068cbd6c42585f62e81e4edbb72161ce852a1a4f +874b1fbf2ebe140c683bd7e4e0ab017afa5d4ad38055aaa83ee6bbef77dbc88a6ce8eb0dcc48f0155244af6f86f34c2d +903c58e57ddd9c446afab8256a6bb6c911121e6ccfb4f9b4ed3e2ed922a0e500a5cb7fa379d5285bc16e11dac90d1fda +8dae7a0cffa2fd166859cd1bf10ff82dd1932e488af377366b7efc0d5dec85f85fe5e8150ff86a79a39cefc29631733a +aa047857a47cc4dfc08585f28640420fcf105b881fd59a6cf7890a36516af0644d143b73f3515ab48faaa621168f8c31 +864508f7077c266cc0cb3f7f001cb6e27125ebfe79ab57a123a8195f2e27d3799ff98413e8483c533b46a816a3557f1f +8bcd45ab1f9cbab36937a27e724af819838f66dfeb15923f8113654ff877bd8667c54f6307aaf0c35027ca11b6229bfd +b21aa34da9ab0a48fcfdd291df224697ce0c1ebc0e9b022fdee8750a1a4b5ba421c419541ed5c98b461eecf363047471 +a9a18a2ab2fae14542dc336269fe612e9c1af6cf0c9ac933679a2f2cb77d3c304114f4d219ca66fe288adde30716775b +b5205989b92c58bdda71817f9a897e84100b5c4e708de1fced5c286f7a6f01ae96b1c8d845f3a320d77c8e2703c0e8b1 +a364059412bbcc17b8907d43ac8e5df90bc87fd1724b5f99832d0d24559fae6fa76a74cff1d1eac8cbac6ec80b44af20 +ae709f2c339886b31450834cf29a38b26eb3b0779bd77c9ac269a8a925d1d78ea3837876c654b61a8fe834b3b6940808 +8802581bba66e1952ac4dab36af371f66778958f4612901d95e5cac17f59165e6064371d02de8fb6fccf89c6dc8bd118 +a313252df653e29c672cbcfd2d4f775089cb77be1077381cf4dc9533790e88af6cedc8a119158e7da5bf6806ad9b91a1 +992a065b4152c7ef11515cd54ba9d191fda44032a01aed954acff3443377ee16680c7248d530b746b8c6dee2d634e68c +b627b683ee2b32c1ab4ccd27b9f6cce2fe097d96386fa0e5c182ad997c4c422ab8dfc03870cd830b8c774feb66537282 +b823cf8a9aee03dadd013eb9efe40a201b4b57ef67efaae9f99683005f5d1bf55e950bf4af0774f50859d743642d3fea +b8a7449ffac0a3f206677097baf7ce00ca07a4d2bd9b5356fbcb83f3649b0fda07cfebad220c1066afba89e5a52abf4b +b2dd1a2f986395bb4e3e960fbbe823dbb154f823284ebc9068502c19a7609790ec0073d08bfa63f71e30c7161b6ef966 +98e5236de4281245234f5d40a25b503505af140b503a035fc25a26159a9074ec81512b28f324c56ea2c9a5aa7ce90805 +89070847dc8bbf5bc4ed073aa2e2a1f699cf0c2ca226f185a0671cecc54e7d3e14cd475c7752314a7a8e7476829da4bc +a9402dc9117fdb39c4734c0688254f23aed3dce94f5f53f5b7ef2b4bf1b71a67f85ab1a38ec224a59691f3bee050aeb3 +957288f9866a4bf56a4204218ccc583f717d7ce45c01ea27142a7e245ad04a07f289cc044f8cf1f21d35e67e39299e9c +b2fb31ccb4e69113763d7247d0fc8edaae69b550c5c56aecacfd780c7217dc672f9fb7496edf4aba65dacf3361268e5b +b44a4526b2f1d6eb2aa8dba23bfa385ff7634572ab2afddd0546c3beb630fbfe85a32f42dd287a7fec069041411537f7 +8db5a6660c3ac7fd7a093573940f068ee79a82bc17312af900b51c8c439336bc86ca646c6b7ab13aaaa008a24ca508ab +8f9899a6d7e8eb4367beb5c060a1f8e94d8a21099033ae582118477265155ba9e72176a67f7f25d7bad75a152b56e21a +a67de0e91ade8d69a0e00c9ff33ee2909b8a609357095fa12319e6158570c232e5b6f4647522efb7345ce0052aa9d489 +82eb2414898e9c3023d57907a2b17de8e7eea5269029d05a94bfd7bf5685ac4a799110fbb375eb5e0e2bd16acf6458ae +94451fc7fea3c5a89ba701004a9693bab555cb622caf0896b678faba040409fdfd14a978979038b2a81e8f0abc4994d2 +ac879a5bb433998e289809a4a966bd02b4bf6a9c1cc276454e39c886efcf4fc68baebed575826bde577ab5aa71d735a9 +880c0f8f49c875dfd62b4ddedde0f5c8b19f5687e693717f7e5c031bc580e58e13ab497d48b4874130a18743c59fdce3 +b582af8d8ff0bf76f0a3934775e0b54c0e8fed893245d7d89cae65b03c8125b7237edc29dc45b4fe1a3fe6db45d280ee +89f337882ed3ae060aaee98efa20d79b6822bde9708c1c5fcee365d0ec9297f694cae37d38fd8e3d49717c1e86f078e7 +826d2c1faea54061848b484e288a5f4de0d221258178cf87f72e14baaa4acc21322f8c9eab5dde612ef497f2d2e1d60b +a5333d4f227543e9cd741ccf3b81db79f2f03ca9e649e40d6a6e8ff9073e06da83683566d3b3c8d7b258c62970fb24d1 +a28f08c473db06aaf4c043a2fae82b3c8cfaa160bce793a4c208e4e168fb1c65115ff8139dea06453c5963d95e922b94 +8162546135cc5e124e9683bdfaa45833c18553ff06a0861c887dc84a5b12ae8cd4697f6794c7ef6230492c32faba7014 +b23f0d05b74c08d6a7df1760792be83a761b36e3f8ae360f3c363fb196e2a9dd2de2e492e49d36561366e14daa77155c +b6f70d6c546722d3907c708d630dbe289771d2c8bf059c2e32b77f224696d750b4dda9b3a014debda38e7d02c9a77585 +83bf4c4a9f3ca022c631017e7a30ea205ba97f7f5927cba8fc8489a4646eac6712cb821c5668c9ffe94d69d524374a27 +b0371475425a8076d0dd5f733f55aabbe42d20a7c8ea7da352e736d4d35a327b2beb370dfcb05284e22cfd69c5f6c4cc +a0031ba7522c79211416c2cca3aa5450f96f8fee711552a30889910970ba13608646538781a2c08b834b140aadd7166f +99d273c80c7f2dc6045d4ed355d9fc6f74e93549d961f4a3b73cd38683f905934d359058cd1fc4da8083c7d75070487f +b0e4b0efa3237793e9dcce86d75aafe9879c5fa23f0d628649aef2130454dcf72578f9bf227b9d2b9e05617468e82588 +a5ab076fa2e1c5c51f3ae101afdd596ad9d106bba7882b359c43d8548b64f528af19afa76cd6f40da1e6c5fca4def3fa +8ce2299e570331d60f6a6eff1b271097cd5f1c0e1113fc69b89c6a0f685dabea3e5bc2ac6bd789aa492ab189f89be494 +91b829068874d911a310a5f9dee001021f97471307b5a3de9ec336870ec597413e1d92010ce320b619f38bed7c4f7910 +b14fe91f4b07bf33b046e9285b66cb07927f3a8da0af548ac2569b4c4fb1309d3ced76d733051a20814e90dd5b75ffd1 +abaab92ea6152d40f82940277c725aa768a631ee0b37f5961667f82fb990fc11e6d3a6a2752b0c6f94563ed9bb28265c +b7fe28543eca2a716859a76ab9092f135337e28109544f6bd2727728d0a7650428af5713171ea60bfc273d1c821d992c +8a4917b2ab749fc7343fc64bdf51b6c0698ff15d740cc7baf248c030475c097097d5a473bcc00d8c25817563fe0447b4 +aa96156d1379553256350a0a3250166add75948fb9cde62aa555a0a9dc0a9cb7f2f7b8428aff66097bf6bfedaf14bbe2 +ae4ffeb9bdc76830d3eca2b705f30c1bdede6412fa064260a21562c8850c7fb611ec62bc68479fe48f692833e6f66d8d +b96543caaba9d051600a14997765d49e4ab10b07c7a92cccf0c90b309e6da334fdd6d18c96806cbb67a7801024fbd3c7 +97b2b9ad76f19f500fcc94ca8e434176249f542ac66e5881a3dccd07354bdab6a2157018b19f8459437a68d8b86ba8e0 +a8d206f6c5a14c80005849474fde44b1e7bcf0b2d52068f5f97504c3c035b09e65e56d1cf4b5322791ae2c2fdbd61859 +936bad397ad577a70cf99bf9056584a61bd7f02d2d5a6cf219c05d770ae30a5cd902ba38366ce636067fc1dd10108d31 +a77e30195ee402b84f3882e2286bf5380c0ed374a112dbd11e16cef6b6b61ab209d4635e6f35cdaaa72c1a1981d5dabe +a46ba4d3947188590a43c180757886a453a0503f79cc435322d92490446f37419c7b999fdf868a023601078070e03346 +80d8d4c5542f223d48240b445d4d8cf6a75d120b060bc08c45e99a13028b809d910b534d2ac47fb7068930c54efd8da9 +803be9c68c91b42b68e1f55e58917a477a9a6265e679ca44ee30d3eb92453f8c89c64eafc04c970d6831edd33d066902 +b14b2b3d0dfe2bb57cee4cd72765b60ac33c1056580950be005790176543826c1d4fbd737f6cfeada6c735543244ab57 +a9e480188bba1b8fb7105ff12215706665fd35bf1117bacfb6ab6985f4dbc181229873b82e5e18323c2b8f5de03258e0 +a66a0f0779436a9a3999996d1e6d3000f22c2cac8e0b29cddef9636393c7f1457fb188a293b6c875b05d68d138a7cc4a +848397366300ab40c52d0dbbdafbafef6cd3dadf1503bb14b430f52bb9724188928ac26f6292a2412bc7d7aa620763c8 +95466cc1a78c9f33a9aaa3829a4c8a690af074916b56f43ae46a67a12bb537a5ac6dbe61590344a25b44e8512355a4a7 +8b5f7a959f818e3baf0887f140f4575cac093d0aece27e23b823cf421f34d6e4ff4bb8384426e33e8ec7b5eed51f6b5c +8d5e1368ec7e3c65640d216bcc5d076f3d9845924c734a34f3558ac0f16e40597c1a775a25bf38b187213fbdba17c93b +b4647c1b823516880f60d20c5cc38c7f80b363c19d191e8992226799718ee26b522a12ecb66556ed3d483aa4824f3326 +ac3abaea9cd283eb347efda4ed9086ea3acf495043e08d0d19945876329e8675224b685612a6badf8fd72fb6274902b1 +8eae1ce292d317aaa71bcf6e77e654914edd5090e2e1ebab78b18bb41b9b1bc2e697439f54a44c0c8aa0d436ebe6e1a9 +94dc7d1aec2c28eb43d93b111fa59aaa0d77d5a09501220bd411768c3e52208806abf973c6a452fd8292ff6490e0c9e2 +8fd8967f8e506fef27d17b435d6b86b232ec71c1036351f12e6fb8a2e12daf01d0ee04451fb944d0f1bf7fd20e714d02 +824e6865be55d43032f0fec65b3480ea89b0a2bf860872237a19a54bc186a85d2f8f9989cc837fbb325b7c72d9babe2c +8bd361f5adb27fd6f4e3f5de866e2befda6a8454efeb704aacc606f528c03f0faae888f60310e49440496abd84083ce2 +b098a3c49f2aaa28b6b3e85bc40ce6a9cdd02134ee522ae73771e667ad7629c8d82c393fba9f27f5416986af4c261438 +b385f5ca285ff2cfe64dcaa32dcde869c28996ed091542600a0b46f65f3f5a38428cca46029ede72b6cf43e12279e3d3 +8196b03d011e5be5288196ef7d47137d6f9237a635ab913acdf9c595fa521d9e2df722090ec7eb0203544ee88178fc5f +8ed1270211ef928db18e502271b7edf24d0bbd11d97f2786aee772d70c2029e28095cf8f650b0328cc8a4c38d045316d +a52ab60e28d69b333d597a445884d44fd2a7e1923dd60f763951e1e45f83e27a4dac745f3b9eff75977b3280e132c15d +91e9fe78cdac578f4a4687f71b800b35da54b824b1886dafec073a3c977ce7a25038a2f3a5b1e35c2c8c9d1a7312417c +a42832173f9d9491c7bd93b21497fbfa4121687cd4d2ab572e80753d7edcbb42cfa49f460026fbde52f420786751a138 +97b947126d84dcc70c97be3c04b3de3f239b1c4914342fa643b1a4bb8c4fe45c0fcb585700d13a7ed50784790c54bef9 +860e407d353eac070e2418ef6cb80b96fc5f6661d6333e634f6f306779651588037be4c2419562c89c61f9aa2c4947f5 +b2c9d93c3ba4e511b0560b55d3501bf28a510745fd666b3cb532db051e6a8617841ea2f071dda6c9f15619c7bfd2737f +8596f4d239aeeac78311207904d1bd863ef68e769629cc379db60e019aaf05a9d5cd31dc8e630b31e106a3a93e47cbc5 +8b26e14e2e136b65c5e9e5c2022cee8c255834ea427552f780a6ca130a6446102f2a6f334c3f9a0308c53df09e3dba7e +b54724354eb515a3c8bed0d0677ff1db94ac0a07043459b4358cb90e3e1aa38ac23f2caa3072cf9647275d7cd61d0e80 +b7ce9fe0e515e7a6b2d7ddcb92bc0196416ff04199326aea57996eef8c5b1548bd8569012210da317f7c0074691d01b7 +a1a13549c82c877253ddefa36a29ea6a23695ee401fdd48e65f6f61e5ebd956d5e0edeff99484e9075cb35071fec41e2 +838ba0c1e5bd1a6da05611ff1822b8622457ebd019cb065ece36a2d176bd2d889511328120b8a357e44569e7f640c1e6 +b916eccff2a95519400bbf76b5f576cbe53cf200410370a19d77734dc04c05b585cfe382e8864e67142d548cd3c4c2f4 +a610447cb7ca6eea53a6ff1f5fe562377dcb7f4aaa7300f755a4f5e8eba61e863c51dc2aa9a29b35525b550fbc32a0fe +9620e8f0f0ee9a4719aa9685eeb1049c5c77659ba6149ec4c158f999cfd09514794b23388879931fe26fea03fa471fd3 +a9dcf8b679e276583cf5b9360702a185470d09aea463dc474ee9c8aee91ef089dacb073e334e47fbc78ec5417c90465c +8c9adee8410bdd99e5b285744cee61e2593b6300ff31a8a83b0ec28da59475a5c6fb9346fe43aadea2e6c3dad2a8e30a +97d5afe9b3897d7b8bb628b7220cf02d8ee4e9d0b78f5000d500aaf4c1df9251aaaabfd1601626519f9d66f00a821d4e +8a382418157b601ce4c3501d3b8409ca98136a4ef6abcbf62885e16e215b76b035c94d149cc41ff92e42ccd7c43b9b3d +b64b8d11fb3b01abb2646ac99fdb9c02b804ce15d98f9fe0fbf1c9df8440c71417487feb6cdf51e3e81d37104b19e012 +849d7d044f9d8f0aab346a9374f0b3a5d14a9d1faa83dbacccbdc629ad1ef903a990940255564770537f8567521d17f0 +829dbb0c76b996c2a91b4cbbe93ba455ca0d5729755e5f0c92aaee37dff7f36fcdc06f33aca41f1b609c784127b67d88 +85a7c0069047b978422d264d831ab816435f63938015d2e977222b6b5746066c0071b7f89267027f8a975206ed25c1b0 +84b9fbc1cfb302df1acdcf3dc5d66fd1edfe7839f7a3b2fb3a0d5548656249dd556104d7c32b73967bccf0f5bdcf9e3b +972220ac5b807f53eac37dccfc2ad355d8b21ea6a9c9b011c09fe440ddcdf7513e0b43d7692c09ded80d7040e26aa28f +855885ed0b21350baeca890811f344c553cf9c21024649c722453138ba29193c6b02c4b4994cd414035486f923472e28 +841874783ae6d9d0e59daea03e96a01cbbe4ecaced91ae4f2c8386e0d87b3128e6d893c98d17c59e4de1098e1ad519dd +827e50fc9ce56f97a4c3f2f4cbaf0b22f1c3ce6f844ff0ef93a9c57a09b8bf91ebfbd2ba9c7f83c442920bffdaf288cc +a441f9136c7aa4c08d5b3534921b730e41ee91ab506313e1ba5f7c6f19fd2d2e1594e88c219834e92e6fb95356385aa7 +97d75b144471bf580099dd6842b823ec0e6c1fb86dd0da0db195e65524129ea8b6fd4a7a9bbf37146269e938a6956596 +a4b6fa87f09d5a29252efb2b3aaab6b3b6ea9fab343132a651630206254a25378e3e9d6c96c3d14c150d01817d375a8e +a31a671876d5d1e95fe2b8858dc69967231190880529d57d3cab7f9f4a2b9b458ac9ee5bdaa3289158141bf18f559efb +90bee6fff4338ba825974021b3b2a84e36d617e53857321f13d2b3d4a28954e6de3b3c0e629d61823d18a9763313b3bf +96b622a63153f393bb419bfcf88272ea8b3560dbd46b0aa07ada3a6223990d0abdd6c2adb356ef4be5641688c8d83941 +84c202adeaff9293698022bc0381adba2cd959f9a35a4e8472288fd68f96f6de8be9da314c526d88e291c96b1f3d6db9 +8ca01a143b8d13809e5a8024d03e6bc9492e22226073ef6e327edf1328ef4aff82d0bcccee92cb8e212831fa35fe1204 +b2f970dbad15bfbefb38903c9bcc043d1367055c55dc1100a850f5eb816a4252c8c194b3132c929105511e14ea10a67d +a5e36556472a95ad57eb90c3b6623671b03eafd842238f01a081997ffc6e2401f76e781d049bb4aa94d899313577a9cf +8d1057071051772f7c8bedce53a862af6fd530dd56ae6321eaf2b9fc6a68beff5ed745e1c429ad09d5a118650bfd420a +8aadc4f70ace4fcb8d93a78610779748dcffc36182d45b932c226dc90e48238ea5daa91f137c65ed532352c4c4d57416 +a2ea05ae37e673b4343232ae685ee14e6b88b867aef6dfac35db3589cbcd76f99540fed5c2641d5bb5a4a9f808e9bf0d +947f1abad982d65648ae4978e094332b4ecb90f482c9be5741d5d1cf5a28acf4680f1977bf6e49dd2174c37f11e01296 +a27b144f1565e4047ba0e3f4840ef19b5095d1e281eaa463c5358f932114cbd018aa6dcf97546465cf2946d014d8e6d6 +8574e1fc3acade47cd4539df578ce9205e745e161b91e59e4d088711a7ab5aa3b410d517d7304b92109924d9e2af8895 +a48ee6b86b88015d6f0d282c1ae01d2a5b9e8c7aa3d0c18b35943dceb1af580d08a65f54dc6903cde82fd0d73ce94722 +8875650cec543a7bf02ea4f2848a61d167a66c91ffaefe31a9e38dc8511c6a25bde431007eefe27a62af3655aca208dc +999b0a6e040372e61937bf0d68374e230346b654b5a0f591a59d33a4f95bdb2f3581db7c7ccb420cd7699ed709c50713 +878c9e56c7100c5e47bbe77dc8da5c5fe706cec94d37fa729633bca63cace7c40102eee780fcdabb655f5fa47a99600e +865006fb5b475ada5e935f27b96f9425fc2d5449a3c106aa366e55ebed3b4ee42adc3c3f0ac19fd129b40bc7d6bc4f63 +b7a7da847f1202e7bc1672553e68904715e84fd897d529243e3ecda59faa4e17ba99c649a802d53f6b8dfdd51f01fb74 +8b2fb4432c05653303d8c8436473682933a5cb604da10c118ecfcd2c8a0e3132e125afef562bdbcc3df936164e5ce4f2 +808d95762d33ddfa5d0ee3d7d9f327de21a994d681a5f372e2e3632963ea974da7f1f9e5bac8ccce24293509d1f54d27 +932946532e3c397990a1df0e94c90e1e45133e347a39b6714c695be21aeb2d309504cb6b1dde7228ff6f6353f73e1ca2 +9705e7c93f0cdfaa3fa96821f830fe53402ad0806036cd1b48adc2f022d8e781c1fbdab60215ce85c653203d98426da3 +aa180819531c3ec1feb829d789cb2092964c069974ae4faad60e04a6afcce5c3a59aec9f11291e6d110a788d22532bc6 +88f755097f7e25cb7dd3c449520c89b83ae9e119778efabb54fbd5c5714b6f37c5f9e0346c58c6ab09c1aef2483f895d +99fc03ab7810e94104c494f7e40b900f475fde65bdec853e60807ffd3f531d74de43335c3b2646b5b8c26804a7448898 +af2dea9683086bed1a179110efb227c9c00e76cd00a2015b089ccbcee46d1134aa18bda5d6cab6f82ae4c5cd2461ac21 +a500f87ba9744787fdbb8e750702a3fd229de6b8817594348dec9a723b3c4240ddfa066262d002844b9e38240ce55658 +924d0e45c780f5bc1c1f35d15dfc3da28036bdb59e4c5440606750ecc991b85be18bc9a240b6c983bc5430baa4c68287 +865b11e0157b8bf4c5f336024b016a0162fc093069d44ac494723f56648bc4ded13dfb3896e924959ea11c96321afefc +93672d8607d4143a8f7894f1dcca83fb84906dc8d6dd7dd063bb0049cfc20c1efd933e06ca7bd03ea4cb5a5037990bfe +826891efbdff0360446825a61cd1fa04326dd90dae8c33dfb1ed97b045e165766dd070bd7105560994d0b2044bdea418 +93c4a4a8bcbc8b190485cc3bc04175b7c0ed002c28c98a540919effd6ed908e540e6594f6db95cd65823017258fb3b1c +aeb2a0af2d2239fda9aa6b8234b019708e8f792834ff0dd9c487fa09d29800ddceddd6d7929faa9a3edcb9e1b3aa0d6b +87f11de7236d387863ec660d2b04db9ac08143a9a2c4dfff87727c95b4b1477e3bc473a91e5797313c58754905079643 +80dc1db20067a844fe8baceca77f80db171a5ca967acb24e2d480eae9ceb91a3343c31ad1c95b721f390829084f0eae6 +9825c31f1c18da0de3fa84399c8b40f8002c3cae211fb6a0623c76b097b4d39f5c50058f57a16362f7a575909d0a44a2 +a99fc8de0c38dbf7b9e946de83943a6b46a762167bafe2a603fb9b86f094da30d6de7ed55d639aafc91936923ee414b3 +ad594678b407db5d6ea2e90528121f84f2b96a4113a252a30d359a721429857c204c1c1c4ff71d8bb5768c833f82e80e +b33d985e847b54510b9b007e31053732c8a495e43be158bd2ffcea25c6765bcbc7ca815f7c60b36ad088b955dd6e9350 +815f8dfc6f90b3342ca3fbd968c67f324dae8f74245cbf8bc3bef10e9440c65d3a2151f951e8d18959ba01c1b50b0ec1 +94c608a362dd732a1abc56e338637c900d59013db8668e49398b3c7a0cae3f7e2f1d1bf94c0299eeafe6af7f76c88618 +8ebd8446b23e5adfcc393adc5c52fe172f030a73e63cd2d515245ca0dd02782ceed5bcdd9ccd9c1b4c5953dfac9c340c +820437f3f6f9ad0f5d7502815b221b83755eb8dc56cd92c29e9535eb0b48fb8d08c9e4fcc26945f9c8cca60d89c44710 +8910e4e8a56bf4be9cc3bbf0bf6b1182a2f48837a2ed3c2aaec7099bfd7f0c83e14e608876b17893a98021ff4ab2f20d +9633918fde348573eec15ce0ad53ac7e1823aac86429710a376ad661002ae6d049ded879383faaa139435122f64047c6 +a1f5e3fa558a9e89318ca87978492f0fb4f6e54a9735c1b8d2ecfb1d1c57194ded6e0dd82d077b2d54251f3bee1279e1 +b208e22d04896abfd515a95c429ff318e87ff81a5d534c8ac2c33c052d6ffb73ef1dccd39c0bbe0734b596c384014766 +986d5d7d2b5bde6d16336f378bd13d0e671ad23a8ec8a10b3fc09036faeeb069f60662138d7a6df3dfb8e0d36180f770 +a2d4e6c5f5569e9cef1cddb569515d4b6ace38c8aed594f06da7434ba6b24477392cc67ba867c2b079545ca0c625c457 +b5ac32b1d231957d91c8b7fc43115ce3c5c0d8c13ca633374402fa8000b6d9fb19499f9181844f0c10b47357f3f757ce +96b8bf2504b4d28fa34a4ec378e0e0b684890c5f44b7a6bb6e19d7b3db2ab27b1e2686389d1de9fbd981962833a313ea +953bfd7f6c3a0469ad432072b9679a25486f5f4828092401eff494cfb46656c958641a4e6d0d97d400bc59d92dba0030 +876ab3cea7484bbfd0db621ec085b9ac885d94ab55c4bb671168d82b92e609754b86aaf472c55df3d81421d768fd108a +885ff4e67d9ece646d02dd425aa5a087e485c3f280c3471b77532b0db6145b69b0fbefb18aa2e3fa5b64928b43a94e57 +b91931d93f806d0b0e6cc62a53c718c099526140f50f45d94b8bbb57d71e78647e06ee7b42aa5714aed9a5c05ac8533f +a0313eeadd39c720c9c27b3d671215331ab8d0a794e71e7e690f06bcd87722b531d6525060c358f35f5705dbb7109ccb +874c0944b7fedc6701e53344100612ddcb495351e29305c00ec40a7276ea5455465ffb7bded898886c1853139dfb1fc7 +8dc31701a01ee8137059ca1874a015130d3024823c0576aa9243e6942ec99d377e7715ed1444cd9b750a64b85dcaa3e5 +836d2a757405e922ec9a2dfdcf489a58bd48b5f9683dd46bf6047688f778c8dee9bc456de806f70464df0b25f3f3d238 +b30b0a1e454a503ea3e2efdec7483eaf20b0a5c3cefc42069e891952b35d4b2c955cf615f3066285ed8fafd9fcfbb8f6 +8e6d4044b55ab747e83ec8762ea86845f1785cc7be0279c075dadf08aca3ccc5a096c015bb3c3f738f647a4eadea3ba5 +ad7735d16ab03cbe09c029610aa625133a6daecfc990b297205b6da98eda8c136a7c50db90f426d35069708510d5ae9c +8d62d858bbb59ec3c8cc9acda002e08addab4d3ad143b3812098f3d9087a1b4a1bb255dcb1635da2402487d8d0249161 +805beec33238b832e8530645a3254aeef957e8f7ea24bcfc1054f8b9c69421145ebb8f9d893237e8a001c857fedfc77e +b1005644be4b085e3f5775aa9bd3e09a283e87ddada3082c04e7a62d303dcef3b8cf8f92944c200c7ae6bb6bdf63f832 +b4ba0e0790dc29063e577474ffe3b61f5ea2508169f5adc1e394934ebb473e356239413a17962bc3e5d3762d72cce8c2 +a157ba9169c9e3e6748d9f1dd67fbe08b9114ade4c5d8fc475f87a764fb7e6f1d21f66d7905cd730f28a1c2d8378682a +913e52b5c93989b5d15e0d91aa0f19f78d592bc28bcfdfddc885a9980c732b1f4debb8166a7c4083c42aeda93a702898 +90fbfc1567e7cd4e096a38433704d3f96a2de2f6ed3371515ccc30bc4dd0721a704487d25a97f3c3d7e4344472702d8d +89646043028ffee4b69d346907586fd12c2c0730f024acb1481abea478e61031966e72072ff1d5e65cb8c64a69ad4eb1 +b125a45e86117ee11d2fb42f680ab4a7894edd67ff927ae2c808920c66c3e55f6a9d4588eee906f33a05d592e5ec3c04 +aad47f5b41eae9be55fb4f67674ff1e4ae2482897676f964a4d2dcb6982252ee4ff56aac49578b23f72d1fced707525e +b9ddff8986145e33851b4de54d3e81faa3352e8385895f357734085a1616ef61c692d925fe62a5ed3be8ca49f5d66306 +b3cb0963387ed28c0c0adf7fe645f02606e6e1780a24d6cecef5b7c642499109974c81a7c2a198b19862eedcea2c2d8c +ac9c53c885457aaf5cb36c717a6f4077af701e0098eebd7aa600f5e4b14e6c1067255b3a0bc40e4a552025231be7de60 +8e1a8d823c4603f6648ec21d064101094f2a762a4ed37dd2f0a2d9aa97b2d850ce1e76f4a4b8cae58819b058180f7031 +b268b73bf7a179b6d22bd37e5e8cb514e9f5f8968c78e14e4f6d5700ca0d0ca5081d0344bb73b028970eebde3cb4124e +a7f57d71940f0edbd29ed8473d0149cae71d921dd15d1ff589774003e816b54b24de2620871108cec1ab9fa956ad6ce6 +8053e6416c8b120e2b999cc2fc420a6a55094c61ac7f2a6c6f0a2c108a320890e389af96cbe378936132363c0d551277 +b3823f4511125e5aa0f4269e991b435a0d6ceb523ebd91c04d7add5534e3df5fc951c504b4fd412a309fd3726b7f940b +ae6eb04674d04e982ca9a6add30370ab90e303c71486f43ed3efbe431af1b0e43e9d06c11c3412651f304c473e7dbf39 +96ab55e641ed2e677591f7379a3cd126449614181fce403e93e89b1645d82c4af524381ff986cae7f9cebe676878646d +b52423b4a8c37d3c3e2eca8f0ddbf7abe0938855f33a0af50f117fab26415fb0a3da5405908ec5fdc22a2c1f2ca64892 +82a69ce1ee92a09cc709d0e3cd22116c9f69d28ea507fe5901f5676000b5179b9abe4c1875d052b0dd42d39925e186bb +a84c8cb84b9d5cfb69a5414f0a5283a5f2e90739e9362a1e8c784b96381b59ac6c18723a4aa45988ee8ef5c1f45cc97d +afd7efce6b36813082eb98257aae22a4c1ae97d51cac7ea9c852d4a66d05ef2732116137d8432e3f117119725a817d24 +a0f5fe25af3ce021b706fcff05f3d825384a272284d04735574ce5fb256bf27100fad0b1f1ba0e54ae9dcbb9570ecad3 +8751786cb80e2e1ff819fc7fa31c2833d25086534eb12b373d31f826382430acfd87023d2a688c65b5e983927e146336 +8cf5c4b17fa4f3d35c78ce41e1dc86988fd1135cd5e6b2bb0c108ee13538d0d09ae7102609c6070f39f937b439b31e33 +a9108967a2fedd7c322711eca8159c533dd561bedcb181b646de98bf5c3079449478eab579731bee8d215ae8852c7e21 +b54c5171704f42a6f0f4e70767cdb3d96ffc4888c842eece343a01557da405961d53ffdc34d2f902ea25d3e1ed867cad +ae8d4b764a7a25330ba205bf77e9f46182cd60f94a336bbd96773cf8064e3d39caf04c310680943dc89ed1fbad2c6e0d +aa5150e911a8e1346868e1b71c5a01e2a4bb8632c195861fb6c3038a0e9b85f0e09b3822e9283654a4d7bb17db2fc5f4 +9685d3756ce9069bf8bb716cf7d5063ebfafe37e15b137fc8c3159633c4e006ff4887ddd0ae90360767a25c3f90cba7f +82155fd70f107ab3c8e414eadf226c797e07b65911508c76c554445422325e71af8c9a8e77fd52d94412a6fc29417cd3 +abfae52f53a4b6e00760468d973a267f29321997c3dbb5aee36dc1f20619551229c0c45b9d9749f410e7f531b73378e8 +81a76d921f8ef88e774fd985e786a4a330d779b93fad7def718c014685ca0247379e2e2a007ad63ee7f729cd9ed6ce1b +81947c84bc5e28e26e2e533af5ae8fe10407a7b77436dbf8f1d5b0bbe86fc659eae10f974659dc7c826c6dabd03e3a4b +92b8c07050d635b8dd4fd09df9054efe4edae6b86a63c292e73cc819a12a21dd7d104ce51fa56af6539dedf6dbe6f7b6 +b44c579e3881f32b32d20c82c207307eca08e44995dd2aac3b2692d2c8eb2a325626c80ac81c26eeb38c4137ff95add5 +97efab8941c90c30860926dea69a841f2dcd02980bf5413b9fd78d85904588bf0c1021798dbc16c8bbb32cce66c82621 +913363012528b50698e904de0588bf55c8ec5cf6f0367cfd42095c4468fcc64954fbf784508073e542fee242d0743867 +8ed203cf215148296454012bd10fddaf119203db1919a7b3d2cdc9f80e66729464fdfae42f1f2fc5af1ed53a42b40024 +ab84312db7b87d711e9a60824f4fe50e7a6190bf92e1628688dfcb38930fe87b2d53f9e14dd4de509b2216856d8d9188 +880726def069c160278b12d2258eac8fa63f729cd351a710d28b7e601c6712903c3ac1e7bbd0d21e4a15f13ca49db5aa +980699cd51bac6283959765f5174e543ed1e5f5584b5127980cbc2ef18d984ecabba45042c6773b447b8e694db066028 +aeb019cb80dc4cb4207430d0f2cd24c9888998b6f21d9bf286cc638449668d2eec0018a4cf3fe6448673cd6729335e2b +b29852f6aa6c60effdffe96ae88590c88abae732561d35cc19e82d3a51e26cb35ea00986193e07f90060756240f5346e +a0fa855adc5ba469f35800c48414b8921455950a5c0a49945d1ef6e8f2a1881f2e2dfae47de6417270a6bf49deeb091d +b6c7332e3b14813641e7272d4f69ecc7e09081df0037d6dab97ce13a9e58510f5c930d300633f208181d9205c5534001 +85a6c050f42fce560b5a8d54a11c3bbb8407abbadd859647a7b0c21c4b579ec65671098b74f10a16245dc779dff7838e +8f3eb34bb68759d53c6677de4de78a6c24dd32c8962a7fb355ed362572ef8253733e6b52bc21c9f92ecd875020a9b8de +a17dd44181e5dab4dbc128e1af93ec22624b57a448ca65d2d9e246797e4af7d079e09c6e0dfb62db3a9957ce92f098d5 +a56a1b854c3183082543a8685bb34cae1289f86cfa8123a579049dbd059e77982886bfeb61bf6e05b4b1fe4e620932e7 +aedae3033cb2fb7628cb4803435bdd7757370a86f808ae4cecb9a268ad0e875f308c048c80cbcac523de16b609683887 +9344905376aa3982b1179497fac5a1d74b14b7038fd15e3b002db4c11c8bfc7c39430db492cdaf58b9c47996c9901f28 +a3bfafdae011a19f030c749c3b071f83580dee97dd6f949e790366f95618ca9f828f1daaeabad6dcd664fcef81b6556d +81c03d8429129e7e04434dee2c529194ddb01b414feda3adee2271eb680f6c85ec872a55c9fa9d2096f517e13ed5abcc +98205ef3a72dff54c5a9c82d293c3e45d908946fa74bb749c3aabe1ab994ea93c269bcce1a266d2fe67a8f02133c5985 +85a70aeed09fda24412fadbafbbbf5ba1e00ac92885df329e147bfafa97b57629a3582115b780d8549d07d19b7867715 +b0fbe81c719f89a57d9ea3397705f898175808c5f75f8eb81c2193a0b555869ba7bd2e6bc54ee8a60cea11735e21c68c +b03a0bd160495ee626ff3a5c7d95bc79d7da7e5a96f6d10116600c8fa20bedd1132f5170f25a22371a34a2d763f2d6d0 +a90ab04091fbca9f433b885e6c1d60ab45f6f1daf4b35ec22b09909d493a6aab65ce41a6f30c98239cbca27022f61a8b +b66f92aa3bf2549f9b60b86f99a0bd19cbdd97036d4ae71ca4b83d669607f275260a497208f6476cde1931d9712c2402 +b08e1fdf20e6a9b0b4942f14fa339551c3175c1ffc5d0ab5b226b6e6a322e9eb0ba96adc5c8d59ca4259e2bdd04a7eb0 +a2812231e92c1ce74d4f5ac3ab6698520288db6a38398bb38a914ac9326519580af17ae3e27cde26607e698294022c81 +abfcbbcf1d3b9e84c02499003e490a1d5d9a2841a9e50c7babbef0b2dd20d7483371d4dc629ba07faf46db659459d296 +b0fe9f98c3da70927c23f2975a9dc4789194d81932d2ad0f3b00843dd9cbd7fb60747a1da8fe5a79f136a601becf279d +b130a6dba7645165348cb90f023713bed0eefbd90a976b313521c60a36d34f02032e69a2bdcf5361e343ed46911297ec +862f0cffe3020cea7a5fd4703353aa1eb1be335e3b712b29d079ff9f7090d1d8b12013011e1bdcbaa80c44641fd37c9f +8c6f11123b26633e1abb9ed857e0bce845b2b3df91cc7b013b2fc77b477eee445da0285fc6fc793e29d5912977f40916 +91381846126ea819d40f84d3005e9fb233dc80071d1f9bb07f102bf015f813f61e5884ffffb4f5cd333c1b1e38a05a58 +8add7d908de6e1775adbd39c29a391f06692b936518db1f8fde74eb4f533fc510673a59afb86e3a9b52ade96e3004c57 +8780e086a244a092206edcde625cafb87c9ab1f89cc3e0d378bc9ee776313836160960a82ec397bc3800c0a0ec3da283 +a6cb4cd9481e22870fdd757fae0785edf4635e7aacb18072fe8dc5876d0bab53fb99ce40964a7d3e8bcfff6f0ab1332f +af30ff47ecc5b543efba1ba4706921066ca8bb625f40e530fb668aea0551c7647a9d126e8aba282fbcce168c3e7e0130 +91b0bcf408ce3c11555dcb80c4410b5bc2386d3c05caec0b653352377efdcb6bab4827f2018671fc8e4a0e90d772acc1 +a9430b975ef138b6b2944c7baded8fe102d31da4cfe3bd3d8778bda79189c99d38176a19c848a19e2d1ee0bddd9a13c1 +aa5a4eef849d7c9d2f4b018bd01271c1dd83f771de860c4261f385d3bdcc130218495860a1de298f14b703ec32fa235f +b0ce79e7f9ae57abe4ff366146c3b9bfb38b0dee09c28c28f5981a5d234c6810ad4d582751948affb480d6ae1c8c31c4 +b75122748560f73d15c01a8907d36d06dc068e82ce22b84b322ac1f727034493572f7907dec34ebc3ddcc976f2f89ed7 +b0fc7836369a3e4411d34792d6bd5617c14f61d9bba023dda64e89dc5fb0f423244e9b48ee64869258931daa9753a56f +8956d7455ae9009d70c6e4a0bcd7610e55f37494cf9897a8f9e1b904cc8febc3fd2d642ebd09025cfff4609ad7e3bc52 +ad741efe9e472026aa49ae3d9914cb9c1a6f37a54f1a6fe6419bebd8c7d68dca105a751c7859f4389505ede40a0de786 +b52f418797d719f0d0d0ffb0846788b5cba5d0454a69a2925de4b0b80fa4dd7e8c445e5eac40afd92897ed28ca650566 +a0ab65fb9d42dd966cd93b1de01d7c822694669dd2b7a0c04d99cd0f3c3de795f387b9c92da11353412f33af5c950e9a +a0052f44a31e5741a331f7cac515a08b3325666d388880162d9a7b97598fde8b61f9ff35ff220df224eb5c4e40ef0567 +a0101cfdc94e42b2b976c0d89612a720e55d145a5ef6ef6f1f78cf6de084a49973d9b5d45915349c34ce712512191e3c +a0dd99fcf3f5cead5aaf08e82212df3a8bb543c407a4d6fab88dc5130c1769df3f147e934a46f291d6c1a55d92b86917 +a5939153f0d1931bbda5cf6bdf20562519ea55fbfa978d6dbc6828d298260c0da7a50c37c34f386e59431301a96c2232 +9568269f3f5257200f9ca44afe1174a5d3cf92950a7f553e50e279c239e156a9faaa2a67f288e3d5100b4142efe64856 +b746b0832866c23288e07f24991bbf687cad794e7b794d3d3b79367566ca617d38af586cdc8d6f4a85a34835be41d54f +a871ce28e39ab467706e32fec1669fda5a4abba2f8c209c6745df9f7a0fa36bbf1919cf14cb89ea26fa214c4c907ae03 +a08dacdd758e523cb8484f6bd070642c0c20e184abdf8e2a601f61507e93952d5b8b0c723c34fcbdd70a8485eec29db2 +85bdb78d501382bb95f1166b8d032941005661aefd17a5ac32df9a3a18e9df2fc5dc2c1f07075f9641af10353cecc0c9 +98d730c28f6fa692a389e97e368b58f4d95382fad8f0baa58e71a3d7baaea1988ead47b13742ce587456f083636fa98e +a557198c6f3d5382be9fb363feb02e2e243b0c3c61337b3f1801c4a0943f18e38ce1a1c36b5c289c8fa2aa9d58742bab +89174f79201742220ac689c403fc7b243eed4f8e3f2f8aba0bf183e6f5d4907cb55ade3e238e3623d9885f03155c4d2b +b891d600132a86709e06f3381158db300975f73ea4c1f7c100358e14e98c5fbe792a9af666b85c4e402707c3f2db321e +b9e5b2529ef1043278c939373fc0dbafe446def52ddd0a8edecd3e4b736de87e63e187df853c54c28d865de18a358bb6 +8589b2e9770340c64679062c5badb7bbef68f55476289b19511a158a9a721f197da03ece3309e059fc4468b15ac33aa3 +aad8c6cd01d785a881b446f06f1e9cd71bca74ba98674c2dcddc8af01c40aa7a6d469037498b5602e76e9c91a58d3dbd +abaccb1bd918a8465f1bf8dbe2c9ad4775c620b055550b949a399f30cf0d9eb909f3851f5b55e38f9e461e762f88f499 +ae62339d26db46e85f157c0151bd29916d5cc619bd4b832814b3fd2f00af8f38e7f0f09932ffe5bba692005dab2d9a74 +93a6ff30a5c0edf8058c89aba8c3259e0f1b1be1b80e67682de651e5346f7e1b4b4ac3d87cbaebf198cf779524aff6bf +8980a2b1d8f574af45b459193c952400b10a86122b71fca2acb75ee0dbd492e7e1ef5b959baf609a5172115e371f3177 +8c2f49f3666faee6940c75e8c7f6f8edc3f704cca7a858bbb7ee5e96bba3b0cf0993996f781ba6be3b0821ef4cb75039 +b14b9e348215b278696018330f63c38db100b0542cfc5be11dc33046e3bca6a13034c4ae40d9cef9ea8b34fef0910c4e +b59bc3d0a30d66c16e6a411cb641f348cb1135186d5f69fda8b0a0934a5a2e7f6199095ba319ec87d3fe8f1ec4a06368 +8874aca2a3767aa198e4c3fec2d9c62d496bc41ff71ce242e9e082b7f38cdf356089295f80a301a3cf1182bde5308c97 +b1820ebd61376d91232423fc20bf008b2ba37e761199f4ef0648ea2bd70282766799b4de814846d2f4d516d525c8daa7 +a6b202e5dedc16a4073e04a11af3a8509b23dfe5a1952f899adeb240e75c3f5bde0c424f811a81ea48d343591faffe46 +a69becee9c93734805523b92150a59a62eed4934f66056b645728740d42223f2925a1ad38359ba644da24d9414f4cdda +ad72f0f1305e37c7e6b48c272323ee883320994cb2e0d850905d6655fafc9f361389bcb9c66b3ff8d2051dbb58c8aa96 +b563600bd56fad7c8853af21c6a02a16ed9d8a8bbeea2c31731d63b976d83cb05b9779372d898233e8fd597a75424797 +b0abb78ce465bf7051f563c62e8be9c57a2cc997f47c82819300f36e301fefd908894bb2053a9d27ce2d0f8c46d88b5b +a071a85fb8274bac2202e0cb8e0e2028a5e138a82d6e0374d39ca1884a549c7c401312f00071b91f455c3a2afcfe0cda +b931c271513a0f267b9f41444a5650b1918100b8f1a64959c552aff4e2193cc1b9927906c6fa7b8a8c68ef13d79aaa52 +a6a1bb9c7d32cb0ca44d8b75af7e40479fbce67d216b48a2bb680d3f3a772003a49d3cd675fc64e9e0f8fabeb86d6d61 +b98d609858671543e1c3b8564162ad828808bb50ded261a9f8690ded5b665ed8368c58f947365ed6e84e5a12e27b423d +b3dca58cd69ec855e2701a1d66cad86717ff103ef862c490399c771ad28f675680f9500cb97be48de34bcdc1e4503ffd +b34867c6735d3c49865e246ddf6c3b33baf8e6f164db3406a64ebce4768cb46b0309635e11be985fee09ab7a31d81402 +acb966c554188c5b266624208f31fab250b3aa197adbdd14aee5ab27d7fb886eb4350985c553b20fdf66d5d332bfd3fe +943c36a18223d6c870d54c3b051ef08d802b85e9dd6de37a51c932f90191890656c06adfa883c87b906557ae32d09da0 +81bca7954d0b9b6c3d4528aadf83e4bc2ef9ea143d6209bc45ae9e7ae9787dbcd8333c41f12c0b6deee8dcb6805e826a +aba176b92256efb68f574e543479e5cf0376889fb48e3db4ebfb7cba91e4d9bcf19dcfec444c6622d9398f06de29e2b9 +b9f743691448053216f6ece7cd699871fff4217a1409ceb8ab7bdf3312d11696d62c74b0664ba0a631b1e0237a8a0361 +a383c2b6276fa9af346b21609326b53fb14fdf6f61676683076e80f375b603645f2051985706d0401e6fbed7eb0666b6 +a9ef2f63ec6d9beb8f3d04e36807d84bda87bdd6b351a3e4a9bf7edcb5618c46c1f58cfbf89e64b40f550915c6988447 +a141b2d7a82f5005eaea7ae7d112c6788b9b95121e5b70b7168d971812f3381de8b0082ac1f0a82c7d365922ebd2d26a +b1b76ef8120e66e1535c17038b75255a07849935d3128e3e99e56567b842fb1e8d56ef932d508d2fb18b82f7868fe1a9 +8e2e234684c81f21099f5c54f6bbe2dd01e3b172623836c77668a0c49ce1fe218786c3827e4d9ae2ea25c50a8924fb3c +a5caf5ff948bfd3c4ca3ffbdfcd91eec83214a6c6017235f309a0bbf7061d3b0b466307c00b44a1009cf575163898b43 +986415a82ca16ebb107b4c50b0c023c28714281db0bcdab589f6cb13d80e473a3034b7081b3c358e725833f6d845cb14 +b94836bf406ac2cbacb10e6df5bcdfcc9d9124ae1062767ca4e322d287fd5e353fdcebd0e52407cb3cd68571258a8900 +83c6d70a640b33087454a4788dfd9ef3ed00272da084a8d36be817296f71c086b23b576f98178ab8ca6a74f04524b46b +ad4115182ad784cfe11bcfc5ce21fd56229cc2ce77ac82746e91a2f0aa53ca6593a22efd2dc4ed8d00f84542643d9c58 +ab1434c5e5065da826d10c2a2dba0facccab0e52b506ce0ce42fbe47ced5a741797151d9ecc99dc7d6373cfa1779bbf6 +8a8b591d82358d55e6938f67ea87a89097ab5f5496f7260adb9f649abb289da12b498c5b2539c2f9614fb4e21b1f66b0 +964f355d603264bc1f44c64d6d64debca66f37dff39c971d9fc924f2bc68e6c187b48564a6dc82660a98b035f8addb5d +b66235eaaf47456bc1dc4bde454a028e2ce494ece6b713a94cd6bf27cf18c717fd0c57a5681caaa2ad73a473593cdd7a +9103e3bb74304186fa4e3e355a02da77da4aca9b7e702982fc2082af67127ebb23a455098313c88465bc9b7d26820dd5 +b6a42ff407c9dd132670cdb83cbad4b20871716e44133b59a932cd1c3f97c7ac8ff7f61acfaf8628372508d8dc8cad7c +883a9c21c16a167a4171b0f084565c13b6f28ba7c4977a0de69f0a25911f64099e7bbb4da8858f2e93068f4155d04e18 +8dbb3220abc6a43220adf0331e3903d3bfd1d5213aadfbd8dfcdf4b2864ce2e96a71f35ecfb7a07c3bbabf0372b50271 +b4ad08aee48e176bda390b7d9acf2f8d5eb008f30d20994707b757dc6a3974b2902d29cd9b4d85e032810ad25ac49e97 +865bb0f33f7636ec501bb634e5b65751c8a230ae1fa807a961a8289bbf9c7fe8c59e01fbc4c04f8d59b7f539cf79ddd5 +86a54d4c12ad1e3605b9f93d4a37082fd26e888d2329847d89afa7802e815f33f38185c5b7292293d788ad7d7da1df97 +b26c8615c5e47691c9ff3deca3021714662d236c4d8401c5d27b50152ce7e566266b9d512d14eb63e65bc1d38a16f914 +827639d5ce7db43ba40152c8a0eaad443af21dc92636cc8cc2b35f10647da7d475a1e408901cd220552fddad79db74df +a2b79a582191a85dbe22dc384c9ca3de345e69f6aa370aa6d3ff1e1c3de513e30b72df9555b15a46586bd27ea2854d9d +ae0d74644aba9a49521d3e9553813bcb9e18f0b43515e4c74366e503c52f47236be92dfbd99c7285b3248c267b1de5a0 +80fb0c116e0fd6822a04b9c25f456bdca704e2be7bdc5d141dbf5d1c5eeb0a2c4f5d80db583b03ef3e47517e4f9a1b10 +ac3a1fa3b4a2f30ea7e0a114cdc479eb51773573804c2a158d603ad9902ae8e39ffe95df09c0d871725a5d7f9ba71a57 +b56b2b0d601cba7f817fa76102c68c2e518c6f20ff693aad3ff2e07d6c4c76203753f7f91686b1801e8c4659e4d45c48 +89d50c1fc56e656fb9d3915964ebce703cb723fe411ab3c9eaa88ccc5d2b155a9b2e515363d9c600d3c0cee782c43f41 +b24207e61462f6230f3cd8ccf6828357d03e725769f7d1de35099ef9ee4dca57dbce699bb49ed994462bee17059d25ce +b886f17fcbcbfcd08ac07f04bb9543ef58510189decaccea4b4158c9174a067cb67d14b6be3c934e6e2a18c77efa9c9c +b9c050ad9cafd41c6e2e192b70d080076eed59ed38ea19a12bd92fa17b5d8947d58d5546aaf5e8e27e1d3b5481a6ce51 +aaf7a34d3267e3b1ddbc54c641e3922e89303f7c86ebebc7347ebca4cffad5b76117dac0cbae1a133053492799cd936f +a9ee604ada50adef82e29e893070649d2d4b7136cc24fa20e281ce1a07bd736bf0de7c420369676bcbcecff26fb6e900 +9855315a12a4b4cf80ab90b8bd13003223ba25206e52fd4fe6a409232fbed938f30120a3db23eab9c53f308bd8b9db81 +8cd488dd7a24f548a3cf03c54dec7ff61d0685cb0f6e5c46c2d728e3500d8c7bd6bba0156f4bf600466fda53e5b20444 +890ad4942ebac8f5b16c777701ab80c68f56fa542002b0786f8fea0fb073154369920ac3dbfc07ea598b82f4985b8ced +8de0cf9ddc84c9b92c59b9b044387597799246b30b9f4d7626fc12c51f6e423e08ee4cbfe9289984983c1f9521c3e19d +b474dfb5b5f4231d7775b3c3a8744956b3f0c7a871d835d7e4fd9cc895222c7b868d6c6ce250de568a65851151fac860 +86433b6135d9ed9b5ee8cb7a6c40e5c9d30a68774cec04988117302b8a02a11a71a1e03fd8e0264ef6611d219f103007 +80b9ed4adbe9538fb1ef69dd44ec0ec5b57cbfea820054d8d445b4261962624b4c70ac330480594bc5168184378379c3 +8b2e83562ccd23b7ad2d17f55b1ab7ef5fbef64b3a284e6725b800f3222b8bdf49937f4a873917ada9c4ddfb090938c2 +abe78cebc0f5a45d754140d1f685e387489acbfa46d297a8592aaa0d676a470654f417a4f7d666fc0b2508fab37d908e +a9c5f8ff1f8568e252b06d10e1558326db9901840e6b3c26bbd0cd5e850cb5fb3af3f117dbb0f282740276f6fd84126f +975f8dc4fb55032a5df3b42b96c8c0ffecb75456f01d4aef66f973cb7270d4eff32c71520ceefc1adcf38d77b6b80c67 +b043306ed2c3d8a5b9a056565afd8b5e354c8c4569fda66b0d797a50a3ce2c08cffbae9bbe292da69f39e89d5dc7911e +8d2afc36b1e44386ba350c14a6c1bb31ff6ea77128a0c5287584ac3584282d18516901ce402b4644a53db1ed8e7fa581 +8c294058bed53d7290325c363fe243f6ec4f4ea2343692f4bac8f0cb86f115c069ccb8334b53d2e42c067691ad110dba +b92157b926751aaf7ef82c1aa8c654907dccab6376187ee8b3e8c0c82811eae01242832de953faa13ebaff7da8698b3e +a780c4bdd9e4ba57254b09d745075cecab87feda78c88ffee489625c5a3cf96aa6b3c9503a374a37927d9b78de9bd22b +811f548ef3a2e6a654f7dcb28ac9378de9515ed61e5a428515d9594a83e80b35c60f96a5cf743e6fab0d3cb526149f49 +85a4dccf6d90ee8e094731eec53bd00b3887aec6bd81a0740efddf812fd35e3e4fe4f983afb49a8588691c202dabf942 +b152c2da6f2e01c8913079ae2b40a09b1f361a80f5408a0237a8131b429677c3157295e11b365b1b1841924b9efb922e +849b9efee8742502ffd981c4517c88ed33e4dd518a330802caff168abae3cd09956a5ee5eda15900243bc2e829016b74 +955a933f3c18ec0f1c0e38fa931e4427a5372c46a3906ebe95082bcf878c35246523c23f0266644ace1fa590ffa6d119 +911989e9f43e580c886656377c6f856cdd4ff1bd001b6db3bbd86e590a821d34a5c6688a29b8d90f28680e9fdf03ba69 +b73b8b4f1fd6049fb68d47cd96a18fcba3f716e0a1061aa5a2596302795354e0c39dea04d91d232aec86b0bf2ba10522 +90f87456d9156e6a1f029a833bf3c7dbed98ca2f2f147a8564922c25ae197a55f7ea9b2ee1f81bf7383197c4bad2e20c +903cba8b1e088574cb04a05ca1899ab00d8960580c884bd3c8a4c98d680c2ad11410f2b75739d6050f91d7208cac33a5 +9329987d42529c261bd15ecedd360be0ea8966e7838f32896522c965adfc4febf187db392bd441fb43bbd10c38fdf68b +8178ee93acf5353baa349285067b20e9bb41aa32d77b5aeb7384fe5220c1fe64a2461bd7a83142694fe673e8bbf61b7c +a06a8e53abcff271b1394bcc647440f81fb1c1a5f29c27a226e08f961c3353f4891620f2d59b9d1902bf2f5cc07a4553 +aaf5fe493b337810889e777980e6bbea6cac39ac66bc0875c680c4208807ac866e9fda9b5952aa1d04539b9f4a4bec57 +aa058abb1953eceac14ccfa7c0cc482a146e1232905dcecc86dd27f75575285f06bbae16a8c9fe8e35d8713717f5f19f +8f15dd732799c879ca46d2763453b359ff483ca33adb1d0e0a57262352e0476c235987dc3a8a243c74bc768f93d3014c +a61cc8263e9bc03cce985f1663b8a72928a607121005a301b28a278e9654727fd1b22bc8a949af73929c56d9d3d4a273 +98d6dc78502d19eb9f921225475a6ebcc7b44f01a2df6f55ccf6908d65b27af1891be2a37735f0315b6e0f1576c1f8d8 +8bd258b883f3b3793ec5be9472ad1ff3dc4b51bc5a58e9f944acfb927349ead8231a523cc2175c1f98e7e1e2b9f363b8 +aeacc2ecb6e807ad09bedd99654b097a6f39840e932873ace02eabd64ccfbb475abdcb62939a698abf17572d2034c51e +b8ccf78c08ccd8df59fd6eda2e01de328bc6d8a65824d6f1fc0537654e9bc6bf6f89c422dd3a295cce628749da85c864 +8f91fd8cb253ba2e71cc6f13da5e05f62c2c3b485c24f5d68397d04665673167fce1fc1aec6085c69e87e66ec555d3fd +a254baa10cb26d04136886073bb4c159af8a8532e3fd36b1e9c3a2e41b5b2b6a86c4ebc14dbe624ee07b7ccdaf59f9ab +94e3286fe5cd68c4c7b9a7d33ae3d714a7f265cf77cd0e9bc19fc51015b1d1c34ad7e3a5221c459e89f5a043ee84e3a9 +a279da8878af8d449a9539bec4b17cea94f0242911f66fab275b5143ab040825f78c89cb32a793930609415cfa3a1078 +ac846ceb89c9e5d43a2991c8443079dc32298cd63e370e64149cec98cf48a6351c09c856f2632fd2f2b3d685a18bbf8b +a847b27995c8a2e2454aaeb983879fb5d3a23105c33175839f7300b7e1e8ec3efd6450e9fa3f10323609dee7b98c6fd5 +a2f432d147d904d185ff4b2de8c6b82fbea278a2956bc406855b44c18041854c4f0ecccd472d1d0dff1d8aa8e281cb1d +94a48ad40326f95bd63dff4755f863a1b79e1df771a1173b17937f9baba57b39e651e7695be9f66a472f098b339364fc +a12a0ccd8f96e96e1bc6494341f7ebce959899341b3a084aa1aa87d1c0d489ac908552b7770b887bb47e7b8cbc3d8e66 +81a1f1681bda923bd274bfe0fbb9181d6d164fe738e54e25e8d4849193d311e2c4253614ed673c98af2c798f19a93468 +abf71106a05d501e84cc54610d349d7d5eae21a70bd0250f1bebbf412a130414d1c8dbe673ffdb80208fd72f1defa4d4 +96266dc2e0df18d8136d79f5b59e489978eee0e6b04926687fe389d4293c14f36f055c550657a8e27be4118b64254901 +8df5dcbefbfb4810ae3a413ca6b4bf08619ca53cd50eb1dde2a1c035efffc7b7ac7dff18d403253fd80104bd83dc029e +9610b87ff02e391a43324a7122736876d5b3af2a137d749c52f75d07b17f19900b151b7f439d564f4529e77aa057ad12 +a90a5572198b40fe2fcf47c422274ff36c9624df7db7a89c0eb47eb48a73a03c985f4ac5016161c76ca317f64339bce1 +98e5e61a6ab6462ba692124dba7794b6c6bde4249ab4fcc98c9edd631592d5bc2fb5e38466691a0970a38e48d87c2e43 +918cefb8f292f78d4db81462c633daf73b395e772f47b3a7d2cea598025b1d8c3ec0cbff46cdb23597e74929981cde40 +a98918a5dc7cf610fe55f725e4fd24ce581d594cb957bb9b4e888672e9c0137003e1041f83e3f1d7b9caab06462c87d4 +b92b74ac015262ca66c33f2d950221e19d940ba3bf4cf17845f961dc1729ae227aa9e1f2017829f2135b489064565c29 +a053ee339f359665feb178b4e7ee30a85df37debd17cacc5a27d6b3369d170b0114e67ad1712ed26d828f1df641bcd99 +8c3c8bad510b35da5ce5bd84b35c958797fbea024ad1c97091d2ff71d9b962e9222f65a9b776e5b3cc29c36e1063d2ee +af99dc7330fe7c37e850283eb47cc3257888e7c197cb0d102edf94439e1e02267b6a56306d246c326c4c79f9dc8c6986 +afecb2dc34d57a725efbd7eb93d61eb29dbe8409b668ab9ea040791f5b796d9be6d4fc10d7f627bf693452f330cf0435 +93334fedf19a3727a81a6b6f2459db859186227b96fe7a391263f69f1a0884e4235de64d29edebc7b99c44d19e7c7d7a +89579c51ac405ad7e9df13c904061670ce4b38372492764170e4d3d667ed52e5d15c7cd5c5991bbfa3a5e4e3fa16363e +9778f3e8639030f7ef1c344014f124e375acb8045bd13d8e97a92c5265c52de9d1ffebaa5bc3e1ad2719da0083222991 +88f77f34ee92b3d36791bdf3326532524a67d544297dcf1a47ff00b47c1b8219ff11e34034eab7d23b507caa2fd3c6b9 +a699c1e654e7c484431d81d90657892efeb4adcf72c43618e71ca7bd7c7a7ebbb1db7e06e75b75dc4c74efd306b5df3f +81d13153baebb2ef672b5bdb069d3cd669ce0be96b742c94e04038f689ff92a61376341366b286eee6bf3ae85156f694 +81efb17de94400fdacc1deec2550cbe3eecb27c7af99d8207e2f9be397e26be24a40446d2a09536bb5172c28959318d9 +989b21ebe9ceab02488992673dc071d4d5edec24bff0e17a4306c8cb4b3c83df53a2063d1827edd8ed16d6e837f0d222 +8d6005d6536825661b13c5fdce177cb37c04e8b109b7eb2b6d82ea1cb70efecf6a0022b64f84d753d165edc2bba784a3 +a32607360a71d5e34af2271211652d73d7756d393161f4cf0da000c2d66a84c6826e09e759bd787d4fd0305e2439d342 +aaad8d6f6e260db45d51b2da723be6fa832e76f5fbcb77a9a31e7f090dd38446d3b631b96230d78208cae408c288ac4e +abcfe425255fd3c5cffd3a818af7650190c957b6b07b632443f9e33e970a8a4c3bf79ac9b71f4d45f238a04d1c049857 +aeabf026d4c783adc4414b5923dbd0be4b039cc7201219f7260d321f55e9a5b166d7b5875af6129c034d0108fdc5d666 +af49e740c752d7b6f17048014851f437ffd17413c59797e5078eaaa36f73f0017c3e7da020310cfe7d3c85f94a99f203 +8854ca600d842566e3090040cd66bb0b3c46dae6962a13946f0024c4a8aca447e2ccf6f240045f1ceee799a88cb9210c +b6c03b93b1ab1b88ded8edfa1b487a1ed8bdce8535244dddb558ffb78f89b1c74058f80f4db2320ad060d0c2a9c351cc +b5bd7d17372faff4898a7517009b61a7c8f6f0e7ed4192c555db264618e3f6e57fb30a472d169fea01bf2bf0362a19a8 +96eb1d38319dc74afe7e7eb076fcd230d19983f645abd14a71e6103545c01301b31c47ae931e025f3ecc01fb3d2f31fa +b55a8d30d4403067def9b65e16f867299f8f64c9b391d0846d4780bc196569622e7e5b64ce799b5aefac8f965b2a7a7b +8356d199a991e5cbbff608752b6291731b6b6771aed292f8948b1f41c6543e4ab1bedc82dd26d10206c907c03508df06 +97f4137445c2d98b0d1d478049de952610ad698c91c9d0f0e7227d2aae690e9935e914ec4a2ea1fbf3fc1dddfeeacebb +af5621707e0938320b15ddfc87584ab325fbdfd85c30efea36f8f9bd0707d7ec12c344eff3ec21761189518d192df035 +8ac7817e71ea0825b292687928e349da7140285d035e1e1abff0c3704fa8453faaae343a441b7143a74ec56539687cc4 +8a5e0a9e4758449489df10f3386029ada828d1762e4fb0a8ffe6b79e5b6d5d713cb64ed95960e126398b0cdb89002bc9 +81324be4a71208bbb9bca74b77177f8f1abb9d3d5d9db195d1854651f2cf333cd618d35400da0f060f3e1b025124e4b2 +849971d9d095ae067525b3cbc4a7dfae81f739537ade6d6cec1b42fb692d923176197a8770907c58069754b8882822d6 +89f830825416802477cc81fdf11084885865ee6607aa15aa4eb28e351c569c49b8a1b9b5e95ddc04fa0ebafe20071313 +9240aeeaff37a91af55f860b9badd466e8243af9e8c96a7aa8cf348cd270685ab6301bc135b246dca9eda696f8b0e350 +acf74db78cc33138273127599eba35b0fb4e7b9a69fe02dae18fc6692d748ca332bd00b22afa8e654ed587aab11833f3 +b091e6d37b157b50d76bd297ad752220cd5c9390fac16dc838f8557aed6d9833fc920b61519df21265406216315e883f +a6446c429ebf1c7793c622250e23594c836b2fbcaf6c5b3d0995e1595a37f50ea643f3e549b0be8bbdadd69044d72ab9 +93e675353bd60e996bf1c914d5267eeaa8a52fc3077987ccc796710ef9becc6b7a00e3d82671a6bdfb8145ee3c80245a +a2f731e43251d04ed3364aa2f072d05355f299626f2d71a8a38b6f76cf08c544133f7d72dd0ab4162814b674b9fc7fa6 +97a8b791a5a8f6e1d0de192d78615d73d0c38f1e557e4e15d15adc663d649e655bc8da3bcc499ef70112eafe7fb45c7a +98cd624cbbd6c53a94469be4643c13130916b91143425bcb7d7028adbbfede38eff7a21092af43b12d4fab703c116359 +995783ce38fd5f6f9433027f122d4cf1e1ff3caf2d196ce591877f4a544ce9113ead60de2de1827eaff4dd31a20d79a8 +8cf251d6f5229183b7f3fe2f607a90b4e4b6f020fb4ba2459d28eb8872426e7be8761a93d5413640a661d73e34a5b81f +b9232d99620652a3aa7880cad0876f153ff881c4ed4c0c2e7b4ea81d5d42b70daf1a56b869d752c3743c6d4c947e6641 +849716f938f9d37250cccb1bf77f5f9fde53096cdfc6f2a25536a6187029a8f1331cdbed08909184b201f8d9f04b792f +80c7c4de098cbf9c6d17b14eba1805e433b5bc905f6096f8f63d34b94734f2e4ebf4bce8a177efd1186842a61204a062 +b790f410cf06b9b8daadceeb4fd5ff40a2deda820c8df2537e0a7554613ae3948e149504e3e79aa84889df50c8678eeb +813aab8bd000299cd37485b73cd7cba06e205f8efb87f1efc0bae8b70f6db2bc7702eb39510ad734854fb65515fe9d0f +94f0ab7388ac71cdb67f6b85dfd5945748afb2e5abb622f0b5ad104be1d4d0062b651f134ba22385c9e32c2dfdcccce1 +ab6223dca8bd6a4f969e21ccd9f8106fc5251d321f9e90cc42cea2424b3a9c4e5060a47eeef6b23c7976109b548498e8 +859c56b71343fce4d5c5b87814c47bf55d581c50fd1871a17e77b5e1742f5af639d0e94d19d909ec7dfe27919e954e0c +aae0d632b6191b8ad71b027791735f1578e1b89890b6c22e37de0e4a6074886126988fe8319ae228ac9ef3b3bcccb730 +8ca9f32a27a024c3d595ecfaf96b0461de57befa3b331ab71dc110ec3be5824fed783d9516597537683e77a11d334338 +a061df379fb3f4b24816c9f6cd8a94ecb89b4c6dc6cd81e4b8096fa9784b7f97ab3540259d1de9c02eb91d9945af4823 +998603102ac63001d63eb7347a4bb2bf4cf33b28079bb48a169076a65c20d511ccd3ef696d159e54cc8e772fb5d65d50 +94444d96d39450872ac69e44088c252c71f46be8333a608a475147752dbb99db0e36acfc5198f158509401959c12b709 +ac1b51b6c09fe055c1d7c9176eea9adc33f710818c83a1fbfa073c8dc3a7eb3513cbdd3f5960b7845e31e3e83181e6ba +803d530523fc9e1e0f11040d2412d02baef3f07eeb9b177fa9bfa396af42eea898a4276d56e1db998dc96ae47b644cb2 +85a3c9fc7638f5bf2c3e15ba8c2fa1ae87eb1ceb44c6598c67a2948667a9dfa41e61f66d535b4e7fda62f013a5a8b885 +a961cf5654c46a1a22c29baf7a4e77837a26b7f138f410e9d1883480ed5fa42411d522aba32040b577046c11f007388e +ad1154142344f494e3061ef45a34fab1aaacf5fdf7d1b26adbb5fbc3d795655fa743444e39d9a4119b4a4f82a6f30441 +b1d6c30771130c77806e7ab893b73d4deb590b2ff8f2f8b5e54c2040c1f3e060e2bd99afc668cf706a2df666a508bbf6 +a00361fd440f9decabd98d96c575cd251dc94c60611025095d1201ef2dedde51cb4de7c2ece47732e5ed9b3526c2012c +a85c5ab4d17d328bda5e6d839a9a6adcc92ff844ec25f84981e4f44a0e8419247c081530f8d9aa629c7eb4ca21affba6 +a4ddd3eab4527a2672cf9463db38bc29f61460e2a162f426b7852b7a7645fbd62084fd39a8e4d60e1958cce436dd8f57 +811648140080fe55b8618f4cf17f3c5a250adb0cd53d885f2ddba835d2b4433188e41fc0661faac88e4ff910b16278c0 +b85c7f1cfb0ed29addccf7546023a79249e8f15ac2d14a20accbfef4dd9dc11355d599815fa09d2b6b4e966e6ea8cff1 +a10b5d8c260b159043b020d5dd62b3467df2671afea6d480ca9087b7e60ed170c82b121819d088315902842d66c8fb45 +917e191df1bcf3f5715419c1e2191da6b8680543b1ba41fe84ed07ef570376e072c081beb67b375fca3565a2565bcabb +881fd967407390bfd7badc9ab494e8a287559a01eb07861f527207c127eadea626e9bcc5aa9cca2c5112fbac3b3f0e9c +959fd71149af82cc733619e0e5bf71760ca2650448c82984b3db74030d0e10f8ab1ce1609a6de6f470fe8b5bd90df5b3 +a3370898a1c5f33d15adb4238df9a6c945f18b9ada4ce2624fc32a844f9ece4c916a64e9442225b6592afa06d2e015f2 +817efb8a791435e4236f7d7b278181a5fa34587578c629dbc14fbf9a5c26772290611395eecd20222a4c58649fc256d8 +a04c9876acf2cfdc8ef96de4879742709270fa1d03fe4c8511fbef2d59eb0aaf0336fa2c7dfe41a651157377fa217813 +81e15875d7ea7f123e418edf14099f2e109d4f3a6ce0eb65f67fe9fb10d2f809a864a29f60ad3fc949f89e2596b21783 +b49f529975c09e436e6bc202fdc16e3fdcbe056db45178016ad6fdece9faad4446343e83aed096209690b21a6910724f +879e8eda589e1a279f7f49f6dd0580788c040d973748ec4942dbe51ea8fbd05983cc919b78f0c6b92ef3292ae29db875 +81a2b74b2118923f34139a102f3d95e7eee11c4c2929c2576dee200a5abfd364606158535a6c9e4178a6a83dbb65f3c4 +8913f281d8927f2b45fc815d0f7104631cb7f5f7278a316f1327d670d15868daadd2a64e3eb98e1f53fe7e300338cc80 +a6f815fba7ef9af7fbf45f93bc952e8b351f5de6568a27c7c47a00cb39a254c6b31753794f67940fc7d2e9cc581529f4 +b3722a15c66a0014ce4d082de118def8d39190c15678a472b846225585f3a83756ae1b255b2e3f86a26168878e4773b2 +817ae61ab3d0dd5b6e24846b5a5364b1a7dc2e77432d9fed587727520ae2f307264ea0948c91ad29f0aea3a11ff38624 +b3db467464415fcad36dc1de2d6ba7686772a577cc2619242ac040d6734881a45d3b40ed4588db124e4289cfeec4bbf6 +ad66a14f5a54ac69603b16e5f1529851183da77d3cc60867f10aea41339dd5e06a5257982e9e90a352cdd32750f42ee4 +adafa3681ef45d685555601a25a55cf23358319a17f61e2179e704f63df83a73bdd298d12cf6cef86db89bd17119e11d +a379dc44cb6dd3b9d378c07b2ec654fec7ca2f272de6ba895e3d00d20c9e4c5550498a843c8ac67e4221db2115bedc1c +b7bf81c267a78efc6b9e5a904574445a6487678d7ef70054e3e93ea6a23f966c2b68787f9164918e3b16d2175459ed92 +b41d66a13a4afafd5760062b77f79de7e6ab8ccacde9c6c5116a6d886912fb491dc027af435b1b44aacc6af7b3c887f2 +9904d23a7c1c1d2e4bab85d69f283eb0a8e26d46e8b7b30224438015c936729b2f0af7c7c54c03509bb0500acb42d8a4 +ae30d65e9e20c3bfd603994ae2b175ff691d51f3e24b2d058b3b8556d12ca4c75087809062dddd4aaac81c94d15d8a17 +9245162fab42ac01527424f6013310c3eb462982518debef6c127f46ba8a06c705d7dc9f0a41e796ba8d35d60ae6cc64 +87fab853638d7a29a20f3ba2b1a7919d023e9415bfa78ebb27973d8cbc7626f584dc5665d2e7ad71f1d760eba9700d88 +85aac46ecd330608e5272430970e6081ff02a571e8ea444f1e11785ea798769634a22a142d0237f67b75369d3c484a8a +938c85ab14894cc5dfce3d80456f189a2e98eddbc8828f4ff6b1df1dcb7b42b17ca2ff40226a8a1390a95d63dca698dd +a18ce1f846e3e3c4d846822f60271eecf0f5d7d9f986385ac53c5ace9589dc7c0188910448c19b91341a1ef556652fa9 +8611608a9d844f0e9d7584ad6ccf62a5087a64f764caf108db648a776b5390feb51e5120f0ef0e9e11301af3987dd7dc +8106333ba4b4de8d1ae43bc9735d3fea047392e88efd6a2fa6f7b924a18a7a265ca6123c3edc0f36307dd7fb7fe89257 +a91426fa500951ff1b051a248c050b7139ca30dde8768690432d597d2b3c4357b11a577be6b455a1c5d145264dcf81fc +b7f9f90e0e450f37b081297f7f651bad0496a8b9afd2a4cf4120a2671aaaa8536dce1af301258bfbfdb122afa44c5048 +84126da6435699b0c09fa4032dec73d1fca21d2d19f5214e8b0bea43267e9a8dd1fc44f8132d8315e734c8e2e04d7291 +aff064708103884cb4f1a3c1718b3fc40a238d35cf0a7dc24bdf9823693b407c70da50df585bf5bc4e9c07d1c2d203e8 +a8b40fc6533752983a5329c31d376c7a5c13ce6879cc7faee648200075d9cd273537001fb4c86e8576350eaac6ba60c2 +a02db682bdc117a84dcb9312eb28fcbde12d49f4ce915cc92c610bb6965ec3cc38290f8c5b5ec70afe153956692cda95 +86decd22b25d300508472c9ce75d3e465b737e7ce13bc0fcce32835e54646fe12322ba5bc457be18bfd926a1a6ca4a38 +a18666ef65b8c2904fd598791f5627207165315a85ee01d5fb0e6b2e10bdd9b00babc447da5bd63445e3337de33b9b89 +89bb0c06effadefdaf34ffe4b123e1678a90d4451ee856c863df1e752eef41fd984689ded8f0f878bf8916d5dd8e8024 +97cfcba08ebec05d0073992a66b1d7d6fb9d95871f2cdc36db301f78bf8069294d1c259efef5c93d20dc937eedae3a1a +ac2643b14ece79dcb2e289c96776a47e2bebd40dd6dc74fd035df5bb727b5596f40e3dd2d2202141e69b0993717ede09 +a5e6fd88a2f9174d9bd4c6a55d9c30974be414992f22aa852f552c7648f722ed8077acf5aba030abd47939bb451b2c60 +8ad40a612824a7994487731a40b311b7349038c841145865539c6ada75c56de6ac547a1c23df190e0caaafecddd80ccc +953a7cea1d857e09202c438c6108060961f195f88c32f0e012236d7a4b39d840c61b162ec86436e8c38567328bea0246 +80d8b47a46dae1868a7b8ccfe7029445bbe1009dad4a6c31f9ef081be32e8e1ac1178c3c8fb68d3e536c84990cc035b1 +81ecd99f22b3766ce0aca08a0a9191793f68c754fdec78b82a4c3bdc2db122bbb9ebfd02fc2dcc6e1567a7d42d0cc16a +b1dd0446bccc25846fb95d08c1c9cc52fb51c72c4c5d169ffde56ecfe800f108dc1106d65d5c5bd1087c656de3940b63 +b87547f0931e164e96de5c550ca5aa81273648fe34f6e193cd9d69cf729cb432e17aa02e25b1c27a8a0d20a3b795e94e +820a94e69a927e077082aae66f6b292cfbe4589d932edf9e68e268c9bd3d71ef76cf7d169dd445b93967c25db11f58f1 +b0d07ddf2595270c39adfa0c8cf2ab1322979b0546aa4d918f641be53cd97f36c879bb75d205e457c011aca3bbd9f731 +8700b876b35b4b10a8a9372c5230acecd39539c1bb87515640293ad4464a9e02929d7d6a6a11112e8a29564815ac0de4 +a61a601c5bb27dcb97e37c8e2b9ce479c6b192a5e04d9ed5e065833c5a1017ee5f237b77d1a17be5d48f8e7cc0bcacf6 +92fb88fe774c1ba1d4a08cae3c0e05467ad610e7a3f1d2423fd47751759235fe0a3036db4095bd6404716aa03820f484 +b274f140d77a3ce0796f5e09094b516537ccaf27ae1907099bff172e6368ba85e7c3ef8ea2a07457cac48ae334da95b3 +b2292d9181f16581a9a9142490b2bdcdfb218ca6315d1effc8592100d792eb89d5356996c890441f04f2b4a95763503e +8897e73f576d86bc354baa3bd96e553107c48cf5889dcc23c5ba68ab8bcd4e81f27767be2233fdfa13d39f885087e668 +a29eac6f0829791c728d71abc49569df95a4446ecbfc534b39f24f56c88fe70301838dfc1c19751e7f3c5c1b8c6af6a0 +9346dc3720adc5df500a8df27fd9c75ef38dc5c8f4e8ed66983304750e66d502c3c59b8e955be781b670a0afc70a2167 +9566d534e0e30a5c5f1428665590617e95fd05d45f573715f58157854ad596ece3a3cfec61356aee342308d623e029d5 +a464fb8bffe6bd65f71938c1715c6e296cc6d0311a83858e4e7eb5873b7f2cf0c584d2101e3407b85b64ca78b2ac93ce +b54088f7217987c87e9498a747569ac5b2f8afd5348f9c45bf3fd9fbf713a20f495f49c8572d087efe778ac7313ad6d3 +91fa9f5f8000fe050f5b224d90b59fcce13c77e903cbf98ded752e5b3db16adb2bc1f8c94be48b69f65f1f1ad81d6264 +92d04a5b0ac5d8c8e313709b432c9434ecd3e73231f01e9b4e7952b87df60cbfa97b5dedd2200bd033b4b9ea8ba45cc1 +a94b90ad3c3d6c4bbe169f8661a790c40645b40f0a9d1c7220f01cf7fc176e04d80bab0ced9323fcafb93643f12b2760 +94d86149b9c8443b46196f7e5a3738206dd6f3be7762df488bcbb9f9ee285a64c997ed875b7b16b26604fa59020a8199 +82efe4ae2c50a2d7645240c173a047f238536598c04a2c0b69c96e96bd18e075a99110f1206bc213f39edca42ba00cc1 +ab8667685f831bc14d4610f84a5da27b4ea5b133b4d991741a9e64dceb22cb64a3ce8f1b6e101d52af6296df7127c9ad +83ba433661c05dcc5d562f4a9a261c8110dac44b8d833ae1514b1fc60d8b4ee395b18804baea04cb10adb428faf713c3 +b5748f6f660cc5277f1211d2b8649493ed8a11085b871cd33a5aea630abd960a740f08c08be5f9c21574600ac9bf5737 +a5c8dd12af48fb710642ad65ebb97ca489e8206741807f7acfc334f8035d3c80593b1ff2090c9bb7bd138f0c48714ca8 +a2b382fd5744e3babf454b1d806cc8783efeb4761bc42b6914ea48a46a2eae835efbe0a18262b6bc034379e03cf1262b +b3145ffaf603f69f15a64936d32e3219eea5ed49fdfd2f5bf40ea0dfd974b36fb6ff12164d4c2282d892db4cf3ff3ce1 +87a316fb213f4c5e30c5e3face049db66be4f28821bd96034714ec23d3e97849d7b301930f90a4323c7ccf53de23050c +b9de09a919455070fed6220fc179c8b7a4c753062bcd27acf28f5b9947a659c0b364298daf7c85c4ca6fca7f945add1f +806fbd98d411b76979464c40ad88bc07a151628a27fcc1012ba1dfbaf5b5cc9d962fb9b3386008978a12515edce934bc +a15268877fae0d21610ae6a31061ed7c20814723385955fac09fdc9693a94c33dea11db98bb89fdfe68f933490f5c381 +8d633fb0c4da86b2e0b37d8fad5972d62bff2ac663c5ec815d095cd4b7e1fe66ebef2a2590995b57eaf941983c7ad7a4 +8139e5dd9cf405e8ef65f11164f0440827d98389ce1b418b0c9628be983a9ddd6cf4863036ccb1483b40b8a527acd9ed +88b15fa94a08eac291d2b94a2b30eb851ff24addf2cc30b678e72e32cfcb3424cf4b33aa395d741803f3e578ddf524de +b5eaf0c8506e101f1646bcf049ee38d99ea1c60169730da893fd6020fd00a289eb2f415947e44677af49e43454a7b1be +8489822ad0647a7e06aa2aa5595960811858ddd4542acca419dd2308a8c5477648f4dd969a6740bb78aa26db9bfcc555 +b1e9a7b9f3423c220330d45f69e45fa03d7671897cf077f913c252e3e99c7b1b1cf6d30caad65e4228d5d7b80eb86e5e +b28fe9629592b9e6a55a1406903be76250b1c50c65296c10c5e48c64b539fb08fe11f68cf462a6edcbba71b0cee3feb2 +a41acf96a02c96cd8744ff6577c244fc923810d17ade133587e4c223beb7b4d99fa56eae311a500d7151979267d0895c +880798938fe4ba70721be90e666dfb62fcab4f3556fdb7b0dc8ec5bc34f6b4513df965eae78527136eb391889fe2caf9 +98d4d89d358e0fb7e212498c73447d94a83c1b66e98fc81427ab13acddb17a20f52308983f3a5a8e0aaacec432359604 +81430b6d2998fc78ba937a1639c6020199c52da499f68109da227882dc26d005b73d54c5bdcac1a04e8356a8ca0f7017 +a8d906a4786455eb74613aba4ce1c963c60095ffb8658d368df9266fdd01e30269ce10bf984e7465f34b4fd83beba26a +af54167ac1f954d10131d44a8e0045df00d581dd9e93596a28d157543fbe5fb25d213806ed7fb3cba6b8f5b5423562db +8511e373a978a12d81266b9afbd55035d7bc736835cfa921903a92969eeba3624437d1346b55382e61415726ab84a448 +8cf43eea93508ae586fa9a0f1354a1e16af659782479c2040874a46317f9e8d572a23238efa318fdfb87cc63932602b7 +b0bdd3bacff077173d302e3a9678d1d37936188c7ecc34950185af6b462b7c679815176f3cce5db19aac8b282f2d60ad +a355e9b87f2f2672052f5d4d65b8c1c827d24d89b0d8594641fccfb69aef1b94009105f3242058bb31c8bf51caae5a41 +b8baa9e4b950b72ff6b88a6509e8ed1304bc6fd955748b2e59a523a1e0c5e99f52aec3da7fa9ff407a7adf259652466c +840bc3dbb300ea6f27d1d6dd861f15680bd098be5174f45d6b75b094d0635aced539fa03ddbccb453879de77fb5d1fe9 +b4bc7e7e30686303856472bae07e581a0c0bfc815657c479f9f5931cff208d5c12930d2fd1ff413ebd8424bcd7a9b571 +89b5d514155d7999408334a50822508b9d689add55d44a240ff2bdde2eee419d117031f85e924e2a2c1ca77db9b91eea +a8604b6196f87a04e1350302e8aa745bba8dc162115d22657b37a1d1a98cb14876ddf7f65840b5dbd77e80cd22b4256c +83cb7acdb9e03247515bb2ce0227486ccf803426717a14510f0d59d45e998b245797d356f10abca94f7a14e1a2f0d552 +aeb3266a9f16649210ab2df0e1908ac259f34ce1f01162c22b56cf1019096ee4ea5854c36e30bb2feb06c21a71e8a45c +89e72e86edf2aa032a0fc9acf4d876a40865fbb2c8f87cb7e4d88856295c4ac14583e874142fd0c314a49aba68c0aa3c +8c3576eba0583c2a7884976b4ed11fe1fda4f6c32f6385d96c47b0e776afa287503b397fa516a455b4b8c3afeedc76db +a31e5b633bda9ffa174654fee98b5d5930a691c3c42fcf55673d927dbc8d91c58c4e42e615353145431baa646e8bbb30 +89f2f3f7a8da1544f24682f41c68114a8f78c86bd36b066e27da13acb70f18d9f548773a16bd8e24789420e17183f137 +ada27fa4e90a086240c9164544d2528621a415a5497badb79f8019dc3dce4d12eb6b599597e47ec6ac39c81efda43520 +90dc1eb21bf21c0187f359566fc4bf5386abea52799306a0e5a1151c0817c5f5bc60c86e76b1929c092c0f3ff48cedd2 +b702a53ebcc17ae35d2e735a347d2c700e9cbef8eadbece33cac83df483b2054c126593e1f462cfc00a3ce9d737e2af5 +9891b06455ec925a6f8eafffba05af6a38cc5e193acaaf74ffbf199df912c5197106c5e06d72942bbb032ce277b6417f +8c0ee71eb01197b019275bcf96cae94e81d2cdc3115dbf2d8e3080074260318bc9303597e8f72b18f965ad601d31ec43 +8aaf580aaf75c1b7a5f99ccf60503506e62058ef43b28b02f79b8536a96be3f019c9f71caf327b4e6730134730d1bef5 +ae6f9fc21dd7dfa672b25a87eb0a41644f7609fab5026d5cedb6e43a06dbbfd6d6e30322a2598c8dedde88c52eaed626 +8159b953ffece5693edadb2e906ebf76ff080ee1ad22698950d2d3bfc36ac5ea78f58284b2ca180664452d55bd54716c +ab7647c32ca5e9856ac283a2f86768d68de75ceeba9e58b74c5324f8298319e52183739aba4340be901699d66ac9eb3f +a4d85a5701d89bcfaf1572db83258d86a1a0717603d6f24ac2963ffcf80f1265e5ab376a4529ca504f4396498791253c +816080c0cdbfe61b4d726c305747a9eb58ac26d9a35f501dd32ba43c098082d20faf3ccd41aad24600aa73bfa453dfac +84f3afac024f576b0fd9acc6f2349c2fcefc3f77dbe5a2d4964d14b861b88e9b1810334b908cf3427d9b67a8aee74b18 +94b390655557b1a09110018e9b5a14490681ade275bdc83510b6465a1218465260d9a7e2a6e4ec700f58c31dc3659962 +a8c66826b1c04a2dd4c682543242e7a57acae37278bd09888a3d17747c5b5fec43548101e6f46d703638337e2fd3277b +86e6f4608a00007fa533c36a5b054c5768ccafe41ad52521d772dcae4c8a4bcaff8f7609be30d8fab62c5988cbbb6830 +837da4cf09ae8aa0bceb16f8b3bfcc3b3367aecac9eed6b4b56d7b65f55981ef066490764fb4c108792623ecf8cad383 +941ff3011462f9b5bf97d8cbdb0b6f5d37a1b1295b622f5485b7d69f2cb2bcabc83630dae427f0259d0d9539a77d8424 +b99e5d6d82aa9cf7d5970e7f710f4039ac32c2077530e4c2779250c6b9b373bc380adb0a03b892b652f649720672fc8c +a791c78464b2d65a15440b699e1e30ebd08501d6f2720adbc8255d989a82fcded2f79819b5f8f201bed84a255211b141 +84af7ad4a0e31fcbb3276ab1ad6171429cf39adcf78dc03750dc5deaa46536d15591e26d53e953dfb31e1622bc0743ab +a833e62fe97e1086fae1d4917fbaf09c345feb6bf1975b5cb863d8b66e8d621c7989ab3dbecda36bc9eaffc5eaa6fa66 +b4ef79a46a2126f53e2ebe62770feb57fd94600be29459d70a77c5e9cc260fa892be06cd60f886bf48459e48eb50d063 +b43b8f61919ea380bf151c294e54d3a3ff98e20d1ee5efbfe38aa2b66fafbc6a49739793bd5cb1c809f8b30466277c3a +ab37735af2412d2550e62df9d8b3b5e6f467f20de3890bf56faf1abf2bf3bd1d98dc3fa0ad5e7ab3fce0fa20409eb392 +82416b74b1551d484250d85bb151fabb67e29cce93d516125533df585bc80779ab057ea6992801a3d7d5c6dcff87a018 +8145d0787f0e3b5325190ae10c1d6bee713e6765fb6a0e9214132c6f78f4582bb2771aaeae40d3dad4bafb56bf7e36d8 +b6935886349ecbdd5774e12196f4275c97ec8279fdf28ccf940f6a022ebb6de8e97d6d2173c3fe402cbe9643bed3883b +87ef9b4d3dc71ac86369f8ed17e0dd3b91d16d14ae694bc21a35b5ae37211b043d0e36d8ff07dcc513fb9e6481a1f37f +ae1d0ded32f7e6f1dc8fef495879c1d9e01826f449f903c1e5034aeeabc5479a9e323b162b688317d46d35a42d570d86 +a40d16497004db4104c6794e2f4428d75bdf70352685944f3fbe17526df333e46a4ca6de55a4a48c02ecf0bde8ba03c0 +8d45121efba8cc308a498e8ee39ea6fa5cae9fb2e4aab1c2ff9d448aa8494ccbec9a078f978a86fcd97b5d5e7be7522a +a8173865c64634ba4ac2fa432740f5c05056a9deaf6427cb9b4b8da94ca5ddbc8c0c5d3185a89b8b28878194de9cdfcd +b6ec06a74d690f6545f0f0efba236e63d1fdfba54639ca2617408e185177ece28901c457d02b849fd00f1a53ae319d0a +b69a12df293c014a40070e3e760169b6f3c627caf9e50b35a93f11ecf8df98b2bc481b410eecb7ab210bf213bbe944de +97e7dc121795a533d4224803e591eef3e9008bab16f12472210b73aaf77890cf6e3877e0139403a0d3003c12c8f45636 +acdfa6fdd4a5acb7738cc8768f7cba84dbb95c639399b291ae8e4e63df37d2d4096900a84d2f0606bf534a9ccaa4993f +86ee253f3a9446a33e4d1169719b7d513c6b50730988415382faaf751988c10a421020609f7bcdef91be136704b906e2 +aac9438382a856caf84c5a8a234282f71b5fc5f65219103b147e7e6cf565522285fbfd7417b513bdad8277a00f652ca1 +83f3799d8e5772527930f5dc071a2e0a65471618993ec8990a96ccdeee65270e490bda9d26bb877612475268711ffd80 +93f28a81ac8c0ec9450b9d762fae9c7f8feaace87a6ee6bd141ef1d2d0697ef1bbd159fe6e1de640dbdab2b0361fca8a +a0825c95ba69999b90eac3a31a3fd830ea4f4b2b7409bde5f202b61d741d6326852ce790f41de5cb0eccec7af4db30c1 +83924b0e66233edd603c3b813d698daa05751fc34367120e3cf384ea7432e256ccee4d4daf13858950549d75a377107d +956fd9fa58345277e06ba2ec72f49ed230b8d3d4ff658555c52d6cddeb84dd4e36f1a614f5242d5ca0192e8daf0543c2 +944869912476baae0b114cced4ff65c0e4c90136f73ece5656460626599051b78802df67d7201c55d52725a97f5f29fe +865cb25b64b4531fb6fe4814d7c8cd26b017a6c6b72232ff53defc18a80fe3b39511b23f9e4c6c7249d06e03b2282ed2 +81e09ff55214960775e1e7f2758b9a6c4e4cd39edf7ec1adfaad51c52141182b79fe2176b23ddc7df9fd153e5f82d668 +b31006896f02bc90641121083f43c3172b1039334501fbaf1672f7bf5d174ddd185f945adf1a9c6cf77be34c5501483d +88b92f6f42ae45e9f05b16e52852826e933efd0c68b0f2418ac90957fd018df661bc47c8d43c2a7d7bfcf669dab98c3c +92fc68f595853ee8683930751789b799f397135d002eda244fe63ecef2754e15849edde3ba2f0cc8b865c9777230b712 +99ca06a49c5cd0bb097c447793fcdd809869b216a34c66c78c7e41e8c22f05d09168d46b8b1f3390db9452d91bc96dea +b48b9490a5d65296802431852d548d81047bbefc74fa7dc1d4e2a2878faacdfcb365ae59209cb0ade01901a283cbd15d +aff0fdbef7c188b120a02bc9085d7b808e88f73973773fef54707bf2cd772cd066740b1b6f4127b5c349f657bd97e738 +966fd4463b4f43dd8ccba7ad50baa42292f9f8b2e70da23bb6780e14155d9346e275ef03ddaf79e47020dcf43f3738bd +9330c3e1fadd9e08ac85f4839121ae20bbeb0a5103d84fa5aadbd1213805bdcda67bf2fb75fc301349cbc851b5559d20 +993bb99867bd9041a71a55ad5d397755cfa7ab6a4618fc526179bfc10b7dc8b26e4372fe9a9b4a15d64f2b63c1052dda +a29b59bcfab51f9b3c490a3b96f0bf1934265c315349b236012adbd64a56d7f6941b2c8cc272b412044bc7731f71e1dc +a65c9cefe1fc35d089fe8580c2e7671ebefdb43014ac291528ff4deefd4883fd4df274af83711dad610dad0d615f9d65 +944c78c56fb227ae632805d448ca3884cd3d2a89181cead3d2b7835e63297e6d740aa79a112edb1d4727824991636df5 +a73d782da1db7e4e65d7b26717a76e16dd9fab4df65063310b8e917dc0bc24e0d6755df5546c58504d04d9e68c3b474a +af80f0b87811ae3124f68108b4ca1937009403f87928bbc53480e7c5408d072053ace5eeaf5a5aba814dab8a45502085 +88aaf1acfc6e2e19b8387c97da707cb171c69812fefdd4650468e9b2c627bd5ccfb459f4d8e56bdfd84b09ddf87e128f +92c97276ff6f72bab6e9423d02ad6dc127962dbce15a0dd1e4a393b4510c555df6aa27be0f697c0d847033a9ca8b8dfd +a0e07d43d96e2d85b6276b3c60aadb48f0aedf2de8c415756dc597249ea64d2093731d8735231dadc961e5682ac59479 +adc9e6718a8f9298957d1da3842a7751c5399bbdf56f8de6c1c4bc39428f4aee6f1ba6613d37bf46b9403345e9d6fc81 +951da434da4b20d949b509ceeba02e24da7ed2da964c2fcdf426ec787779c696b385822c7dbea4df3e4a35921f1e912c +a04cbce0d2b2e87bbf038c798a12ec828423ca6aca08dc8d481cf6466e3c9c73d4d4a7fa47df9a7e2e15aae9e9f67208 +8f855cca2e440d248121c0469de1f94c2a71b8ee2682bbad3a78243a9e03da31d1925e6760dbc48a1957e040fae9abe8 +b642e5b17c1df4a4e101772d73851180b3a92e9e8b26c918050f51e6dd3592f102d20b0a1e96f0e25752c292f4c903ff +a92454c300781f8ae1766dbbb50a96192da7d48ef4cbdd72dd8cbb44c6eb5913c112cc38e9144615fdc03684deb99420 +8b74f7e6c2304f8e780df4649ef8221795dfe85fdbdaa477a1542d135b75c8be45bf89adbbb6f3ddf54ca40f02e733e9 +85cf66292cbb30cec5fd835ab10c9fcb3aea95e093aebf123e9a83c26f322d76ebc89c4e914524f6c5f6ee7d74fc917d +ae0bfe0cdc97c09542a7431820015f2d16067b30dca56288013876025e81daa8c519e5e347268e19aa1a85fa1dc28793 +921322fc6a47dc091afa0ad6df18ed14cde38e48c6e71550aa513918b056044983aee402de21051235eecf4ce8040fbe +96c030381e97050a45a318d307dcb3c8377b79b4dd5daf6337cded114de26eb725c14171b9b8e1b3c08fe1f5ea6b49e0 +90c23b86b6111818c8baaf53a13eaee1c89203b50e7f9a994bf0edf851919b48edbac7ceef14ac9414cf70c486174a77 +8bf6c301240d2d1c8d84c71d33a6dfc6d9e8f1cfae66d4d0f7a256d98ae12b0bcebfa94a667735ee89f810bcd7170cff +a41a4ffbbea0e36874d65c009ee4c3feffff322f6fc0e30d26ee4dbc1f46040d05e25d9d0ecb378cef0d24a7c2c4b850 +a8d4cdd423986bb392a0a92c12a8bd4da3437eec6ef6af34cf5310944899287452a2eb92eb5386086d5063381189d10e +a81dd26ec057c4032a4ed7ad54d926165273ed51d09a1267b2e477535cf6966835a257c209e4e92d165d74fa75695fa3 +8d7f708c3ee8449515d94fc26b547303b53d8dd55f177bc3b25d3da2768accd9bc8e9f09546090ebb7f15c66e6c9c723 +839ba65cffcd24cfffa7ab3b21faabe3c66d4c06324f07b2729c92f15cad34e474b0f0ddb16cd652870b26a756b731d3 +87f1a3968afec354d92d77e2726b702847c6afcabb8438634f9c6f7766de4c1504317dc4fa9a4a735acdbf985e119564 +91a8a7fd6542f3e0673f07f510d850864b34ac087eb7eef8845a1d14b2b1b651cbdc27fa4049bdbf3fea54221c5c8549 +aef3cf5f5e3a2385ead115728d7059e622146c3457d266c612e778324b6e06fbfb8f98e076624d2f3ce1035d65389a07 +819915d6232e95ccd7693fdd78d00492299b1983bc8f96a08dcb50f9c0a813ed93ae53c0238345d5bea0beda2855a913 +8e9ba68ded0e94935131b392b28218315a185f63bf5e3c1a9a9dd470944509ca0ba8f6122265f8da851b5cc2abce68f1 +b28468e9b04ee9d69003399a3cf4457c9bf9d59f36ab6ceeb8e964672433d06b58beeea198fedc7edbaa1948577e9fa2 +a633005e2c9f2fd94c8bce2dd5bb708fe946b25f1ec561ae65e54e15cdd88dc339f1a083e01f0d39610c8fe24151aaf0 +841d0031e22723f9328dd993805abd13e0c99b0f59435d2426246996b08d00ce73ab906f66c4eab423473b409e972ce0 +85758d1b084263992070ec8943f33073a2d9b86a8606672550c17545507a5b3c88d87382b41916a87ee96ff55a7aa535 +8581b06b0fc41466ef94a76a1d9fb8ae0edca6d018063acf6a8ca5f4b02d76021902feba58972415691b4bdbc33ae3b4 +83539597ff5e327357ee62bc6bf8c0bcaec2f227c55c7c385a4806f0d37fb461f1690bad5066b8a5370950af32fafbef +aee3557290d2dc10827e4791d00e0259006911f3f3fce4179ed3c514b779160613eca70f720bff7804752715a1266ffa +b48d2f0c4e90fc307d5995464e3f611a9b0ef5fe426a289071f4168ed5cc4f8770c9332960c2ca5c8c427f40e6bb389f +847af8973b4e300bb06be69b71b96183fd1a0b9d51b91701bef6fcfde465068f1eb2b1503b07afda380f18d69de5c9e1 +a70a6a80ce407f07804c0051ac21dc24d794b387be94eb24e1db94b58a78e1bcfb48cd0006db8fc1f9bedaece7a44fbe +b40e942b8fa5336910ff0098347df716bff9d1fa236a1950c16eeb966b3bc1a50b8f7b0980469d42e75ae13ced53cead +b208fabaa742d7db3148515330eb7a3577487845abdb7bd9ed169d0e081db0a5816595c33d375e56aeac5b51e60e49d3 +b7c8194b30d3d6ef5ab66ec88ad7ebbc732a3b8a41731b153e6f63759a93f3f4a537eab9ad369705bd730184bdbbdc34 +9280096445fe7394d04aa1bc4620c8f9296e991cc4d6c131bd703cb1cc317510e6e5855ac763f4d958c5edfe7eebeed7 +abc2aa4616a521400af1a12440dc544e3c821313d0ab936c86af28468ef8bbe534837e364598396a81cf8d06274ed5a6 +b18ca8a3325adb0c8c18a666d4859535397a1c3fe08f95eebfac916a7a99bbd40b3c37b919e8a8ae91da38bc00fa56c0 +8a40c33109ecea2a8b3558565877082f79121a432c45ec2c5a5e0ec4d1c203a6788e6b69cb37f1fd5b8c9a661bc5476d +88c47301dd30998e903c84e0b0f2c9af2e1ce6b9f187dab03528d44f834dc991e4c86d0c474a2c63468cf4020a1e24a0 +920c832853e6ab4c851eecfa9c11d3acc7da37c823be7aa1ab15e14dfd8beb5d0b91d62a30cec94763bd8e4594b66600 +98e1addbe2a6b8edc7f12ecb9be81c3250aeeca54a1c6a7225772ca66549827c15f3950d01b8eb44aecb56fe0fff901a +8cfb0fa1068be0ec088402f5950c4679a2eb9218c729da67050b0d1b2d7079f3ddf4bf0f57d95fe2a8db04bc6bcdb20c +b70f381aafe336b024120453813aeab70baac85b9c4c0f86918797b6aee206e6ed93244a49950f3d8ec9f81f4ac15808 +a4c8edf4aa33b709a91e1062939512419711c1757084e46f8f4b7ed64f8e682f4e78b7135920c12f0eb0422fe9f87a6a +b4817e85fd0752d7ebb662d3a51a03367a84bac74ebddfba0e5af5e636a979500f72b148052d333b3dedf9edd2b4031b +a87430169c6195f5d3e314ff2d1c2f050e766fd5d2de88f5207d72dba4a7745bb86d0baca6e9ae156582d0d89e5838c7 +991b00f8b104566b63a12af4826b61ce7aa40f4e5b8fff3085e7a99815bdb4471b6214da1e480214fac83f86a0b93cc5 +b39966e3076482079de0678477df98578377a094054960ee518ef99504d6851f8bcd3203e8da5e1d4f6f96776e1fe6eb +a448846d9dc2ab7a0995fa44b8527e27f6b3b74c6e03e95edb64e6baa4f1b866103f0addb97c84bef1d72487b2e21796 +894bec21a453ae84b592286e696c35bc30e820e9c2fd3e63dd4fbe629e07df16439c891056070faa490155f255bf7187 +a9ec652a491b11f6a692064e955f3f3287e7d2764527e58938571469a1e29b5225b9415bd602a45074dfbfe9c131d6ca +b39d37822e6cbe28244b5f42ce467c65a23765bd16eb6447c5b3e942278069793763483dafd8c4dd864f8917aad357fe +88dba51133f2019cb266641c56101e3e5987d3b77647a2e608b5ff9113dfc5f85e2b7c365118723131fbc0c9ca833c9c +b566579d904b54ecf798018efcb824dccbebfc6753a0fd2128ac3b4bd3b038c2284a7c782b5ca6f310eb7ea4d26a3f0a +a97a55c0a492e53c047e7d6f9d5f3e86fb96f3dddc68389c0561515343b66b4bc02a9c0d5722dff1e3445308240b27f7 +a044028ab4bcb9e1a2b9b4ca4efbf04c5da9e4bf2fff0e8bd57aa1fc12a71e897999c25d9117413faf2f45395dee0f13 +a78dc461decbeaeed8ebd0909369b491a5e764d6a5645a7dac61d3140d7dc0062526f777b0eb866bff27608429ebbdde +b2c2a8991f94c39ca35fea59f01a92cb3393e0eccb2476dfbf57261d406a68bd34a6cff33ed80209991688c183609ef4 +84189eefb521aff730a4fd3fd5b10ddfd29f0d365664caef63bb015d07e689989e54c33c2141dd64427805d37a7e546e +85ac80bd734a52235da288ff042dea9a62e085928954e8eacd2c751013f61904ed110e5b3afe1ab770a7e6485efb7b5e +9183a560393dcb22d0d5063e71182020d0fbabb39e32493eeffeb808df084aa243eb397027f150b55a247d1ed0c8513e +81c940944df7ecc58d3c43c34996852c3c7915ed185d7654627f7af62abae7e0048dd444a6c09961756455000bd96d09 +aa8c34e164019743fd8284b84f06c3b449aae7996e892f419ee55d82ad548cb300fd651de329da0384243954c0ef6a60 +89a7b7bdfc7e300d06a14d463e573d6296d8e66197491900cc9ae49504c4809ff6e61b758579e9091c61085ba1237b83 +878d21809ba540f50bd11f4c4d9590fb6f3ab9de5692606e6e2ef4ed9d18520119e385be5e1f4b3f2e2b09c319f0e8fc +8eb248390193189cf0355365e630b782cd15751e672dc478b39d75dc681234dcd9309df0d11f4610dbb249c1e6be7ef9 +a1d7fb3aecb896df3a52d6bd0943838b13f1bd039c936d76d03de2044c371d48865694b6f532393b27fd10a4cf642061 +a34bca58a24979be442238cbb5ece5bee51ae8c0794dd3efb3983d4db713bc6f28a96e976ac3bd9a551d3ed9ba6b3e22 +817c608fc8cacdd178665320b5a7587ca21df8bdd761833c3018b967575d25e3951cf3d498a63619a3cd2ad4406f5f28 +86c95707db0495689afd0c2e39e97f445f7ca0edffad5c8b4cacd1421f2f3cc55049dfd504f728f91534e20383955582 +99c3b0bb15942c301137765d4e19502f65806f3b126dc01a5b7820c87e8979bce6a37289a8f6a4c1e4637227ad5bf3bf +8aa1518a80ea8b074505a9b3f96829f5d4afa55a30efe7b4de4e5dbf666897fdd2cf31728ca45921e21a78a80f0e0f10 +8d74f46361c79e15128ac399e958a91067ef4cec8983408775a87eca1eed5b7dcbf0ddf30e66f51780457413496c7f07 +a41cde4a786b55387458a1db95171aca4fd146507b81c4da1e6d6e495527c3ec83fc42fad1dfe3d92744084a664fd431 +8c352852c906fae99413a84ad11701f93f292fbf7bd14738814f4c4ceab32db02feb5eb70bc73898b0bc724a39d5d017 +a5993046e8f23b71ba87b7caa7ace2d9023fb48ce4c51838813174880d918e9b4d2b0dc21a2b9c6f612338c31a289df8 +83576d3324bf2d8afbfb6eaecdc5d767c8e22e7d25160414924f0645491df60541948a05e1f4202e612368e78675de8a +b43749b8df4b15bc9a3697e0f1c518e6b04114171739ef1a0c9c65185d8ec18e40e6954d125cbc14ebc652cf41ad3109 +b4eebd5d80a7327a040cafb9ccdb12b2dfe1aa86e6bc6d3ac8a57fadfb95a5b1a7332c66318ff72ba459f525668af056 +9198be7f1d413c5029b0e1c617bcbc082d21abe2c60ec8ce9b54ca1a85d3dba637b72fda39dae0c0ae40d047eab9f55a +8d96a0232832e24d45092653e781e7a9c9520766c3989e67bbe86b3a820c4bf621ea911e7cd5270a4bfea78b618411f6 +8d7160d0ea98161a2d14d46ef01dff72d566c330cd4fabd27654d300e1bc7644c68dc8eabf2a20a59bfe7ba276545f9b +abb60fce29dec7ba37e3056e412e0ec3e05538a1fc0e2c68877378c867605966108bc5742585ab6a405ce0c962b285b6 +8fabffa3ed792f05e414f5839386f6449fd9f7b41a47595c5d71074bd1bb3784cc7a1a7e1ad6b041b455035957e5b2dc +90ff017b4804c2d0533b72461436b10603ab13a55f86fd4ec11b06a70ef8166f958c110519ca1b4cc7beba440729fe2d +b340cfd120f6a4623e3a74cf8c32bfd7cd61a280b59dfd17b15ca8fae4d82f64a6f15fbde4c02f424debc72b7db5fe67 +871311c9c7220c932e738d59f0ecc67a34356d1429fe570ca503d340c9996cb5ee2cd188fad0e3bd16e4c468ec1dbebd +a772470262186e7b94239ba921b29f2412c148d6f97c4412e96d21e55f3be73f992f1ad53c71008f0558ec3f84e2b5a7 +b2a897dcb7ffd6257f3f2947ec966f2077d57d5191a88840b1d4f67effebe8c436641be85524d0a21be734c63ab5965d +a044f6eacc48a4a061fa149500d96b48cbf14853469aa4d045faf3dca973be1bd4b4ce01646d83e2f24f7c486d03205d +981af5dc2daa73f7fa9eae35a93d81eb6edba4a7f673b55d41f6ecd87a37685d31bb40ef4f1c469b3d72f2f18b925a17 +912d2597a07864de9020ac77083eff2f15ceb07600f15755aba61251e8ce3c905a758453b417f04d9c38db040954eb65 +9642b7f6f09394ba5e0805734ef6702c3eddf9eea187ba98c676d5bbaec0e360e3e51dc58433aaa1e2da6060c8659cb7 +8ab3836e0a8ac492d5e707d056310c4c8e0489ca85eb771bff35ba1d658360084e836a6f51bb990f9e3d2d9aeb18fbb5 +879e058e72b73bb1f4642c21ffdb90544b846868139c6511f299aafe59c2d0f0b944dffc7990491b7c4edcd6a9889250 +b9e60b737023f61479a4a8fd253ed0d2a944ea6ba0439bbc0a0d3abf09b0ad1f18d75555e4a50405470ae4990626f390 +b9c2535d362796dcd673640a9fa2ebdaec274e6f8b850b023153b0a7a30fffc87f96e0b72696f647ebe7ab63099a6963 +94aeff145386a087b0e91e68a84a5ede01f978f9dd9fe7bebca78941938469495dc30a96bba9508c0d017873aeea9610 +98b179f8a3d9f0d0a983c30682dd425a2ddc7803be59bd626c623c8951a5179117d1d2a68254c95c9952989877d0ee55 +889ecf5f0ee56938273f74eb3e9ecfb5617f04fb58e83fe4c0e4aef51615cf345bc56f3f61b17f6eed3249d4afd54451 +a0f2b2c39bcea4b50883e2587d16559e246248a66ecb4a4b7d9ab3b51fb39fe98d83765e087eee37a0f86b0ba4144c02 +b2a61e247ed595e8a3830f7973b07079cbda510f28ad8c78c220b26cb6acde4fbb5ee90c14a665f329168ee951b08cf0 +95bd0fcfb42f0d6d8a8e73d7458498a85bcddd2fb132fd7989265648d82ac2707d6d203fac045504977af4f0a2aca4b7 +843e5a537c298666e6cf50fcc044f13506499ef83c802e719ff2c90e85003c132024e04711be7234c04d4b0125512d5d +a46d1797c5959dcd3a5cfc857488f4d96f74277c3d13b98b133620192f79944abcb3a361d939a100187f1b0856eae875 +a1c7786736d6707a48515c38660615fcec67eb8a2598f46657855215f804fd72ab122d17f94fcffad8893f3be658dca7 +b23dc9e610abc7d8bd21d147e22509a0fa49db5be6ea7057b51aae38e31654b3aa044df05b94b718153361371ba2f622 +b00cc8f257d659c22d30e6d641f79166b1e752ea8606f558e4cad6fc01532e8319ea4ee12265ba4140ac45aa4613c004 +ac7019af65221b0cc736287b32d7f1a3561405715ba9a6a122342e04e51637ba911c41573de53e4781f2230fdcb2475f +81a630bc41b3da8b3eb4bf56cba10cd9f93153c3667f009dc332287baeb707d505fb537e6233c8e53d299ec0f013290c +a6b7aea5c545bb76df0f230548539db92bc26642572cb7dd3d5a30edca2b4c386f44fc8466f056b42de2a452b81aff5b +8271624ff736b7b238e43943c81de80a1612207d32036d820c11fc830c737972ccc9c60d3c2359922b06652311e3c994 +8a684106458cb6f4db478170b9ad595d4b54c18bf63b9058f095a2fa1b928c15101472c70c648873d5887880059ed402 +a5cc3c35228122f410184e4326cf61a37637206e589fcd245cb5d0cec91031f8f7586b80503070840fdfd8ce75d3c88b +9443fc631aed8866a7ed220890911057a1f56b0afe0ba15f0a0e295ab97f604b134b1ed9a4245e46ee5f9a93aa74f731 +984b6f7d79835dffde9558c6bb912d992ca1180a2361757bdba4a7b69dc74b056e303adc69fe67414495dd9c2dd91e64 +b15a5c8cba5de080224c274d31c68ed72d2a7126d347796569aef0c4e97ed084afe3da4d4b590b9dda1a07f0c2ff3dfb +991708fe9650a1f9a4e43938b91d45dc68c230e05ee999c95dbff3bf79b1c1b2bb0e7977de454237c355a73b8438b1d9 +b4f7edc7468b176a4a7c0273700c444fa95c726af6697028bed4f77eee887e3400f9c42ee15b782c0ca861c4c3b8c98a +8c60dcc16c51087eb477c13e837031d6c6a3dc2b8bf8cb43c23f48006bc7173151807e866ead2234b460c2de93b31956 +83ad63e9c910d1fc44bc114accfb0d4d333b7ebe032f73f62d25d3e172c029d5e34a1c9d547273bf6c0fead5c8801007 +85de73213cc236f00777560756bdbf2b16841ba4b55902cf2cad9742ecaf5d28209b012ceb41f337456dfeca93010cd7 +a7561f8827ccd75b6686ba5398bb8fc3083351c55a589b18984e186820af7e275af04bcd4c28e1dc11be1e8617a0610b +88c0a4febd4068850557f497ea888035c7fc9f404f6cc7794e7cc8722f048ad2f249e7dc62743e7a339eb7473ad3b0cd +932b22b1d3e6d5a6409c34980d176feb85ada1bf94332ef5c9fc4d42b907dabea608ceef9b5595ef3feee195151f18d8 +a2867bb3f5ab88fbdae3a16c9143ab8a8f4f476a2643c505bb9f37e5b1fd34d216cab2204c9a017a5a67b7ad2dda10e8 +b573d5f38e4e9e8a3a6fd82f0880dc049efa492a946d00283019bf1d5e5516464cf87039e80aef667cb86fdea5075904 +b948f1b5ab755f3f5f36af27d94f503b070696d793b1240c1bdfd2e8e56890d69e6904688b5f8ff5a4bdf5a6abfe195f +917eae95ebc4109a2e99ddd8fec7881d2f7aaa0e25fda44dec7ce37458c2ee832f1829db7d2dcfa4ca0f06381c7fe91d +95751d17ed00a3030bce909333799bb7f4ab641acf585807f355b51d6976dceee410798026a1a004ef4dcdff7ec0f5b8 +b9b7bd266f449a79bbfe075e429613e76c5a42ac61f01c8f0bbbd34669650682efe01ff9dbbc400a1e995616af6aa278 +ac1722d097ce9cd7617161f8ec8c23d68f1fb1c9ca533e2a8b4f78516c2fd8fb38f23f834e2b9a03bb06a9d655693ca9 +a7ad9e96ffd98db2ecdb6340c5d592614f3c159abfd832fe27ee9293519d213a578e6246aae51672ee353e3296858873 +989b8814d5de7937c4acafd000eec2b4cd58ba395d7b25f98cafd021e8efa37029b29ad8303a1f6867923f5852a220eb +a5bfe6282c771bc9e453e964042d44eff4098decacb89aecd3be662ea5b74506e1357ab26f3527110ba377711f3c9f41 +8900a7470b656639721d2abbb7b06af0ac4222ab85a1976386e2a62eb4b88bfb5b72cf7921ddb3cf3a395d7eeb192a2e +95a71b55cd1f35a438cf5e75f8ff11c5ec6a2ebf2e4dba172f50bfad7d6d5dca5de1b1afc541662c81c858f7604c1163 +82b5d62fea8db8d85c5bc3a76d68dedd25794cf14d4a7bc368938ffca9e09f7e598fdad2a5aac614e0e52f8112ae62b9 +997173f07c729202afcde3028fa7f52cefc90fda2d0c8ac2b58154a5073140683e54c49ed1f254481070d119ce0ce02a +aeffb91ccc7a72bbd6ffe0f9b99c9e66e67d59cec2e02440465e9636a613ab3017278cfa72ea8bc4aba9a8dc728cb367 +952743b06e8645894aeb6440fc7a5f62dd3acf96dab70a51e20176762c9751ea5f2ba0b9497ccf0114dc4892dc606031 +874c63baeddc56fbbca2ff6031f8634b745f6e34ea6791d7c439201aee8f08ef5ee75f7778700a647f3b21068513fce6 +85128fec9c750c1071edfb15586435cc2f317e3e9a175bb8a9697bcda1eb9375478cf25d01e7fed113483b28f625122d +85522c9576fd9763e32af8495ae3928ed7116fb70d4378448926bc9790e8a8d08f98cf47648d7da1b6e40d6a210c7924 +97d0f37a13cfb723b848099ca1c14d83e9aaf2f7aeb71829180e664b7968632a08f6a85f557d74b55afe6242f2a36e7c +abaa472d6ad61a5fccd1a57c01aa1bc081253f95abbcba7f73923f1f11c4e79b904263890eeb66926de3e2652f5d1c70 +b3c04945ba727a141e5e8aec2bf9aa3772b64d8fd0e2a2b07f3a91106a95cbcb249adcd074cbe498caf76fffac20d4ef +82c46781a3d730d9931bcabd7434a9171372dde57171b6180e5516d4e68db8b23495c8ac3ab96994c17ddb1cf249b9fb +a202d8b65613c42d01738ccd68ed8c2dbc021631f602d53f751966e04182743ebc8e0747d600b8a8676b1da9ae7f11ab +ae73e7256e9459db04667a899e0d3ea5255211fb486d084e6550b6dd64ca44af6c6b2d59d7aa152de9f96ce9b58d940d +b67d87b176a9722945ec7593777ee461809861c6cfd1b945dde9ee4ff009ca4f19cf88f4bbb5c80c9cbab2fe25b23ac8 +8f0b7a317a076758b0dac79959ee4a06c08b07d0f10538a4b53d3da2eda16e2af26922feb32c090330dc4d969cf69bd3 +90b36bf56adbd8c4b6cb32febc3a8d5f714370c2ac3305c10fa6d168dffb2a026804517215f9a2d4ec8310cdb6bb459b +aa80c19b0682ead69934bf18cf476291a0beddd8ef4ed75975d0a472e2ab5c70f119722a8574ae4973aceb733d312e57 +a3fc9abb12574e5c28dcb51750b4339b794b8e558675eef7d26126edf1de920c35e992333bcbffcbf6a5f5c0d383ce62 +a1573ff23ab972acdcd08818853b111fc757fdd35aa070186d3e11e56b172fb49d840bf297ac0dd222e072fc09f26a81 +98306f2be4caa92c2b4392212d0cbf430b409b19ff7d5b899986613bd0e762c909fc01999aa94be3bd529d67f0113d7f +8c1fc42482a0819074241746d17dc89c0304a2acdae8ed91b5009e9e3e70ff725ba063b4a3e68fdce05b74f5180c545e +a6c6113ebf72d8cf3163b2b8d7f3fa24303b13f55752522c660a98cd834d85d8c79214d900fa649499365e2e7641f77a +ab95eea424f8a2cfd9fb1c78bb724e5b1d71a0d0d1e4217c5d0f98b0d8bbd3f8400a2002abc0a0e4576d1f93f46fefad +823c5a4fd8cf4a75fdc71d5f2dd511b6c0f189b82affeacd2b7cfcad8ad1a5551227dcc9bfdb2e34b2097eaa00efbb51 +b97314dfff36d80c46b53d87a61b0e124dc94018a0bb680c32765b9a2d457f833a7c42bbc90b3b1520c33a182580398d +b17566ee3dcc6bb3b004afe4c0136dfe7dd27df9045ae896dca49fb36987501ae069eb745af81ba3fc19ff037e7b1406 +b0bdc0f55cfd98d331e3a0c4fbb776a131936c3c47c6bffdc3aaf7d8c9fa6803fbc122c2fefbb532e634228687d52174 +aa5d9e60cc9f0598559c28bb9bdd52aa46605ab4ffe3d192ba982398e72cec9a2a44c0d0d938ce69935693cabc0887ea +802b6459d2354fa1d56c592ac1346c428dadea6b6c0a87bf7d309bab55c94e1cf31dd98a7a86bd92a840dd51f218b91b +a526914efdc190381bf1a73dd33f392ecf01350b9d3f4ae96b1b1c3d1d064721c7d6eec5788162c933245a3943f5ee51 +b3b8fcf637d8d6628620a1a99dbe619eabb3e5c7ce930d6efd2197e261bf394b74d4e5c26b96c4b8009c7e523ccfd082 +8f7510c732502a93e095aba744535f3928f893f188adc5b16008385fb9e80f695d0435bfc5b91cdad4537e87e9d2551c +97b90beaa56aa936c3ca45698f79273a68dd3ccd0076eab48d2a4db01782665e63f33c25751c1f2e070f4d1a8525bf96 +b9fb798324b1d1283fdc3e48288e3861a5449b2ab5e884b34ebb8f740225324af86e4711da6b5cc8361c1db15466602f +b6d52b53cea98f1d1d4c9a759c25bf9d8a50b604b144e4912acbdbdc32aab8b9dbb10d64a29aa33a4f502121a6fb481c +9174ffff0f2930fc228f0e539f5cfd82c9368d26b074467f39c07a774367ff6cccb5039ac63f107677d77706cd431680 +a33b6250d4ac9e66ec51c063d1a6a31f253eb29bbaed12a0d67e2eccfffb0f3a52750fbf52a1c2aaba8c7692346426e7 +a97025fd5cbcebe8ef865afc39cd3ea707b89d4e765ec817fd021d6438e02fa51e3544b1fd45470c58007a08efac6edd +b32a78480edd9ff6ba2f1eec4088db5d6ceb2d62d7e59e904ecaef7bb4a2e983a4588e51692b3be76e6ffbc0b5f911a5 +b5ab590ef0bb77191f00495b33d11c53c65a819f7d0c1f9dc4a2caa147a69c77a4fff7366a602d743ee1f395ce934c1e +b3fb0842f9441fb1d0ee0293b6efbc70a8f58d12d6f769b12872db726b19e16f0f65efbc891cf27a28a248b0ef9c7e75 +9372ad12856fefb928ccb0d34e198df99e2f8973b07e9d417a3134d5f69e12e79ff572c4e03ccd65415d70639bc7c73e +aa8d6e83d09ce216bfe2009a6b07d0110d98cf305364d5529c170a23e693aabb768b2016befb5ada8dabdd92b4d012bb +a954a75791eeb0ce41c85200c3763a508ed8214b5945a42c79bfdcfb1ec4f86ad1dd7b2862474a368d4ac31911a2b718 +8e2081cfd1d062fe3ab4dab01f68062bac802795545fede9a188f6c9f802cb5f884e60dbe866710baadbf55dc77c11a4 +a2f06003b9713e7dd5929501ed485436b49d43de80ea5b15170763fd6346badf8da6de8261828913ee0dacd8ff23c0e1 +98eecc34b838e6ffd1931ca65eec27bcdb2fdcb61f33e7e5673a93028c5865e0d1bf6d3bec040c5e96f9bd08089a53a4 +88cc16019741b341060b95498747db4377100d2a5bf0a5f516f7dec71b62bcb6e779de2c269c946d39040e03b3ae12b7 +ad1135ccbc3019d5b2faf59a688eef2500697642be8cfbdf211a1ab59abcc1f24483e50d653b55ff1834675ac7b4978f +a946f05ed9972f71dfde0020bbb086020fa35b482cce8a4cc36dd94355b2d10497d7f2580541bb3e81b71ac8bba3c49f +a83aeed488f9a19d8cfd743aa9aa1982ab3723560b1cd337fc2f91ad82f07afa412b3993afb845f68d47e91ba4869840 +95eebe006bfc316810cb71da919e5d62c2cebb4ac99d8e8ef67be420302320465f8b69873470982de13a7c2e23516be9 +a55f8961295a11e91d1e5deadc0c06c15dacbfc67f04ccba1d069cba89d72aa3b3d64045579c3ea8991b150ac29366ae +b321991d12f6ac07a5de3c492841d1a27b0d3446082fbce93e7e1f9e8d8fe3b45d41253556261c21b70f5e189e1a7a6f +a0b0822f15f652ce7962a4f130104b97bf9529797c13d6bd8e24701c213cc37f18157bd07f3d0f3eae6b7cd1cb40401f +96e2fa4da378aa782cc2d5e6e465fc9e49b5c805ed01d560e9b98abb5c0de8b74a2e7bec3aa5e2887d25cccb12c66f0c +97e4ab610d414f9210ed6f35300285eb3ccff5b0b6a95ed33425100d7725e159708ea78704497624ca0a2dcabce3a2f9 +960a375b17bdb325761e01e88a3ea57026b2393e1d887b34b8fa5d2532928079ce88dc9fd06a728b26d2bb41b12b9032 +8328a1647398e832aadc05bd717487a2b6fcdaa0d4850d2c4da230c6a2ed44c3e78ec4837b6094f3813f1ee99414713f +aa283834ebd18e6c99229ce4b401eda83f01d904f250fedd4e24f1006f8fa0712a6a89a7296a9bf2ce8de30e28d1408e +b29e097f2caadae3e0f0ae3473c072b0cd0206cf6d2e9b22c1a5ad3e07d433e32bd09ed1f4e4276a2da4268633357b7f +9539c5cbba14538b2fe077ecf67694ef240da5249950baaabea0340718b882a966f66d97f08556b08a4320ceb2cc2629 +b4529f25e9b42ae8cf8338d2eface6ba5cd4b4d8da73af502d081388135c654c0b3afb3aa779ffc80b8c4c8f4425dd2b +95be0739c4330619fbe7ee2249c133c91d6c07eab846c18c5d6c85fc21ac5528c5d56dcb0145af68ed0c6a79f68f2ccd +ac0c83ea802227bfc23814a24655c9ff13f729619bcffdb487ccbbf029b8eaee709f8bddb98232ef33cd70e30e45ca47 +b503becb90acc93b1901e939059f93e671900ca52c6f64ae701d11ac891d3a050b505d89324ce267bc43ab8275da6ffe +98e3811b55b1bacb70aa409100abb1b870f67e6d059475d9f278c751b6e1e2e2d6f2e586c81a9fb6597fda06e7923274 +b0b0f61a44053fa6c715dbb0731e35d48dba257d134f851ee1b81fd49a5c51a90ebf5459ec6e489fce25da4f184fbdb1 +b1d2117fe811720bb997c7c93fe9e4260dc50fca8881b245b5e34f724aaf37ed970cdad4e8fcb68e05ac8cf55a274a53 +a10f502051968f14b02895393271776dee7a06db9de14effa0b3471825ba94c3f805302bdddac4d397d08456f620999d +a3dbad2ef060ae0bb7b02eaa4a13594f3f900450faa1854fc09620b01ac94ab896321dfb1157cf2374c27e5718e8026a +b550fdec503195ecb9e079dcdf0cad559d64d3c30818ef369b4907e813e689da316a74ad2422e391b4a8c2a2bef25fc0 +a25ba865e2ac8f28186cea497294c8649a201732ecb4620c4e77b8e887403119910423df061117e5f03fc5ba39042db1 +b3f88174e03fdb443dd6addd01303cf88a4369352520187c739fc5ae6b22fa99629c63c985b4383219dab6acc5f6f532 +97a7503248e31e81b10eb621ba8f5210c537ad11b539c96dfb7cf72b846c7fe81bd7532c5136095652a9618000b7f8d3 +a8bcdc1ce5aa8bfa683a2fc65c1e79de8ff5446695dcb8620f7350c26d2972a23da22889f9e2b1cacb3f688c6a2953dc +8458c111df2a37f5dd91a9bee6c6f4b79f4f161c93fe78075b24a35f9817da8dde71763218d627917a9f1f0c4709c1ed +ac5f061a0541152b876cbc10640f26f1cc923c9d4ae1b6621e4bb3bf2cec59bbf87363a4eb72fb0e5b6d4e1c269b52d5 +a9a25ca87006e8a9203cbb78a93f50a36694aa4aad468b8d80d3feff9194455ca559fcc63838128a0ab75ad78c07c13a +a450b85f5dfffa8b34dfd8bc985f921318efacf8857cf7948f93884ba09fb831482ee90a44224b1a41e859e19b74962f +8ed91e7f92f5c6d7a71708b6132f157ac226ecaf8662af7d7468a4fa25627302efe31e4620ad28719318923e3a59bf82 +ab524165fd4c71b1fd395467a14272bd2b568592deafa039d8492e9ef36c6d3f96927c95c72d410a768dc0b6d1fbbc9b +b662144505aa8432c75ffb8d10318526b6d5777ac7af9ebfad87d9b0866c364f7905a6352743bd8fd79ffd9d5dd4f3e6 +a48f1677550a5cd40663bb3ba8f84caaf8454f332d0ceb1d94dbea52d0412fe69c94997f7749929712fd3995298572f7 +8391cd6e2f6b0c242de1117a612be99776c3dc95cb800b187685ea5bf7e2722275eddb79fd7dfc8be8e389c4524cdf70 +875d3acb9af47833b72900bc0a2448999d638f153c5e97e8a14ec02d0c76f6264353a7e275e1f1a5855daced523d243b +91f1823657d30b59b2f627880a9a9cb530f5aca28a9fd217fe6f2f5133690dfe7ad5a897872e400512db2e788b3f7628 +ad3564332aa56cea84123fc7ca79ea70bb4fef2009fa131cb44e4b15e8613bd11ca1d83b9d9bf456e4b7fee9f2e8b017 +8c530b84001936d5ab366c84c0b105241a26d1fb163669f17c8f2e94776895c2870edf3e1bc8ccd04d5e65531471f695 +932d01fa174fdb0c366f1230cffde2571cc47485f37f23ba5a1825532190cc3b722aeb1f15aed62cf83ccae9403ba713 +88b28c20585aca50d10752e84b901b5c2d58efef5131479fbbe53de7bce2029e1423a494c0298e1497669bd55be97a5d +b914148ca717721144ebb3d3bf3fcea2cd44c30c5f7051b89d8001502f3856fef30ec167174d5b76265b55d70f8716b5 +81d0173821c6ddd2a068d70766d9103d1ee961c475156e0cbd67d54e668a796310474ef698c7ab55abe6f2cf76c14679 +8f28e8d78e2fe7fa66340c53718e0db4b84823c8cfb159c76eac032a62fb53da0a5d7e24ca656cf9d2a890cb2a216542 +8a26360335c73d1ab51cec3166c3cf23b9ea51e44a0ad631b0b0329ef55aaae555420348a544e18d5760969281759b61 +94f326a32ed287545b0515be9e08149eb0a565025074796d72387cc3a237e87979776410d78339e23ef3172ca43b2544 +a785d2961a2fa5e70bffa137858a92c48fe749fee91b02599a252b0cd50d311991a08efd7fa5e96b78d07e6e66ffe746 +94af9030b5ac792dd1ce517eaadcec1482206848bea4e09e55cc7f40fd64d4c2b3e9197027c5636b70d6122c51d2235d +9722869f7d1a3992850fe7be405ec93aa17dc4d35e9e257d2e469f46d2c5a59dbd504056c85ab83d541ad8c13e8bcd54 +b13c4088b61a06e2c03ac9813a75ff1f68ffdfee9df6a8f65095179a475e29cc49119cad2ce05862c3b1ac217f3aace9 +8c64d51774753623666b10ca1b0fe63ae42f82ed6aa26b81dc1d48c86937c5772eb1402624c52a154b86031854e1fb9f +b47e4df18002b7dac3fee945bf9c0503159e1b8aafcce2138818e140753011b6d09ef1b20894e08ba3006b093559061b +93cb5970076522c5a0483693f6a35ffd4ea2aa7aaf3730c4eccd6af6d1bebfc1122fc4c67d53898ae13eb6db647be7e2 +a68873ef80986795ea5ed1a597d1cd99ed978ec25e0abb57fdcc96e89ef0f50aeb779ff46e3dce21dc83ada3157a8498 +8cab67f50949cc8eee6710e27358aea373aae3c92849f8f0b5531c080a6300cdf2c2094fe6fecfef6148de0d28446919 +993e932bcb616dbaa7ad18a4439e0565211d31071ef1b85a0627db74a05d978c60d507695eaeea5c7bd9868a21d06923 +acdadff26e3132d9478a818ef770e9fa0d2b56c6f5f48bd3bd674436ccce9bdfc34db884a73a30c04c5f5e9764cb2218 +a0d3e64c9c71f84c0eef9d7a9cb4fa184224b969db5514d678e93e00f98b41595588ca802643ea225512a4a272f5f534 +91c9140c9e1ba6e330cb08f6b2ce4809cd0d5a0f0516f70032bf30e912b0ed684d07b413b326ab531ee7e5b4668c799b +87bc2ee7a0c21ba8334cd098e35cb703f9af57f35e091b8151b9b63c3a5b0f89bd7701dbd44f644ea475901fa6d9ef08 +9325ccbf64bf5d71b303e31ee85d486298f9802c5e55b2c3d75427097bf8f60fa2ab4fcaffa9b60bf922c3e24fbd4b19 +95d0506e898318f3dc8d28d16dfd9f0038b54798838b3c9be2a2ae3c2bf204eb496166353fc042220b0bd4f6673b9285 +811de529416331fe9c416726d45df9434c29dcd7e949045eb15740f47e97dde8f31489242200e19922cac2a8b7c6fd1f +ade632d04a4c8bbab6ca7df370b2213cb9225023e7973f0e29f4f5e52e8aeaabc65171306bbdd12a67b195dfbb96d48f +88b7f029e079b6ae956042c0ea75d53088c5d0efd750dd018adaeacf46be21bf990897c58578c491f41afd3978d08073 +91f477802de507ffd2be3f4319903119225b277ad24f74eb50f28b66c14d32fae53c7edb8c7590704741af7f7f3e3654 +809838b32bb4f4d0237e98108320d4b079ee16ed80c567e7548bd37e4d7915b1192880f4812ac0e00476d246aec1dbc8 +84183b5fc4a7997a8ae5afedb4d21dce69c480d5966b5cbdafd6dd10d29a9a6377f3b90ce44da0eb8b176ac3af0253bb +8508abbf6d3739a16b9165caf0f95afb3b3ac1b8c38d6d374cf0c91296e2c1809a99772492b539cda184510bce8a0271 +8722054e59bab2062e6419a6e45fc803af77fde912ef2cd23055ad0484963de65a816a2debe1693d93c18218d2b8e81a +8e895f80e485a7c4f56827bf53d34b956281cdc74856c21eb3b51f6288c01cc3d08565a11cc6f3e2604775885490e8c5 +afc92714771b7aa6e60f3aee12efd9c2595e9659797452f0c1e99519f67c8bc3ac567119c1ddfe82a3e961ee9defea9a +818ff0fd9cefd32db87b259e5fa32967201016fc02ef44116cdca3c63ce5e637756f60477a408709928444a8ad69c471 +8251e29af4c61ae806fc5d032347fb332a94d472038149225298389495139ce5678fae739d02dfe53a231598a992e728 +a0ea39574b26643f6f1f48f99f276a8a64b5481989cfb2936f9432a3f8ef5075abfe5c067dc5512143ce8bf933984097 +af67a73911b372bf04e57e21f289fc6c3dfac366c6a01409b6e76fea4769bdb07a6940e52e8d7d3078f235c6d2f632c6 +b5291484ef336024dd2b9b4cf4d3a6b751133a40656d0a0825bcc6d41c21b1c79cb50b0e8f4693f90c29c8f4358641f9 +8bc0d9754d70f2cb9c63f991902165a87c6535a763d5eece43143b5064ae0bcdce7c7a8f398f2c1c29167b2d5a3e6867 +8d7faff53579ec8f6c92f661c399614cc35276971752ce0623270f88be937c414eddcb0997e14724a783905a026c8883 +9310b5f6e675fdf60796f814dbaa5a6e7e9029a61c395761e330d9348a7efab992e4e115c8be3a43d08e90d21290c892 +b5eb4f3eb646038ad2a020f0a42202532d4932e766da82b2c1002bf9c9c2e5336b54c8c0ffcc0e02d19dde2e6a35b6cc +91dabfd30a66710f1f37a891136c9be1e23af4abf8cb751f512a40c022a35f8e0a4fb05b17ec36d4208de02d56f0d53a +b3ded14e82d62ac7a5a036122a62f00ff8308498f3feae57d861babaff5a6628d43f0a0c5fc903f10936bcf4e2758ceb +a88e8348fed2b26acca6784d19ef27c75963450d99651d11a950ea81d4b93acd2c43e0ecce100eaf7e78508263d5baf3 +b1f5bbf7c4756877b87bb42163ac570e08c6667c4528bf68b5976680e19beeff7c5effd17009b0718797077e2955457a +ad2e7b516243f915d4d1415326e98b1a7390ae88897d0b03b66c2d9bd8c3fba283d7e8fe44ed3333296a736454cef6d8 +8f82eae096d5b11f995de6724a9af895f5e1c58d593845ad16ce8fcae8507e0d8e2b2348a0f50a1f66a17fd6fac51a5c +890e4404d0657c6c1ee14e1aac132ecf7a568bb3e04137b85ac0f84f1d333bd94993e8750f88eee033a33fb00f85dcc7 +82ac7d3385e035115f1d39a99fc73e5919de44f5e6424579776d118d711c8120b8e5916372c6f27bed4cc64cac170b6c +85ee16d8901c272cfbbe966e724b7a891c1bd5e68efd5d863043ad8520fc409080af61fd726adc680b3f1186fe0ac8b8 +86dc564c9b545567483b43a38f24c41c6551a49cabeebb58ce86404662a12dbfafd0778d30d26e1c93ce222e547e3898 +a29f5b4522db26d88f5f95f18d459f8feefab02e380c2edb65aa0617a82a3c1a89474727a951cef5f15050bcf7b380fb +a1ce039c8f6cac53352899edb0e3a72c76da143564ad1a44858bd7ee88552e2fe6858d1593bbd74aeee5a6f8034b9b9d +97f10d77983f088286bd7ef3e7fdd8fa275a56bec19919adf33cf939a90c8f2967d2b1b6fc51195cb45ad561202a3ed7 +a25e2772e8c911aaf8712bdac1dd40ee061c84d3d224c466cfaae8e5c99604053f940cde259bd1c3b8b69595781dbfec +b31bb95a0388595149409c48781174c340960d59032ab2b47689911d03c68f77a2273576fbe0c2bf4553e330656058c7 +b8b2e9287ad803fb185a13f0d7456b397d4e3c8ad5078f57f49e8beb2e85f661356a3392dbd7bcf6a900baa5582b86a1 +a3d0893923455eb6e96cc414341cac33d2dbc88fba821ac672708cce131761d85a0e08286663a32828244febfcae6451 +82310cb42f647d99a136014a9f881eb0b9791efd2e01fc1841907ad3fc8a9654d3d1dab6689c3607214b4dc2aca01cee +874022d99c16f60c22de1b094532a0bc6d4de700ad01a31798fac1d5088b9a42ad02bef8a7339af7ed9c0d4f16b186ee +94981369e120265aed40910eebc37eded481e90f4596b8d57c3bec790ab7f929784bd33ddd05b7870aad6c02e869603b +a4f1f50e1e2a73f07095e0dd31cb45154f24968dae967e38962341c1241bcd473102fff1ff668b20c6547e9732d11701 +ae2328f3b0ad79fcda807e69a1b5278145225083f150f67511dafc97e079f860c3392675f1752ae7e864c056e592205b +875d8c971e593ca79552c43d55c8c73b17cd20c81ff2c2fed1eb19b1b91e4a3a83d32df150dbfd5db1092d0aebde1e1f +add2e80aa46aae95da73a11f130f4bda339db028e24c9b11e5316e75ba5e63bc991d2a1da172c7c8e8fee038baae3433 +b46dbe1cb3424002aa7de51e82f600852248e251465c440695d52538d3f36828ff46c90ed77fc1d11534fe3c487df8ef +a5e5045d28b4e83d0055863c30c056628c58d4657e6176fd0536f5933f723d60e851bb726d5bf3c546b8ce4ac4a57ef8 +91fec01e86dd1537e498fff7536ea3ca012058b145f29d9ada49370cd7b7193ac380e116989515df1b94b74a55c45df3 +a7428176d6918cd916a310bdc75483c72de660df48cac4e6e7478eef03205f1827ea55afc0df5d5fa7567d14bbea7fc9 +851d89bef45d9761fe5fdb62972209335193610015e16a675149519f9911373bac0919add226ef118d9f3669cfdf4734 +b74acf5c149d0042021cb2422ea022be4c4f72a77855f42393e71ffd12ebb3eec16bdf16f812159b67b79a9706e7156d +99f35dce64ec99aa595e7894b55ce7b5a435851b396e79036ffb249c28206087db4c85379df666c4d95857db02e21ff9 +b6b9a384f70db9e298415b8ab394ee625dafff04be2886476e59df8d052ca832d11ac68a9b93fba7ab055b7bc36948a4 +898ee4aefa923ffec9e79f2219c7389663eb11eb5b49014e04ed4a336399f6ea1691051d86991f4c46ca65bcd4fdf359 +b0f948217b0d65df7599a0ba4654a5e43c84db477936276e6f11c8981efc6eaf14c90d3650107ed4c09af4cc8ec11137 +aa6286e27ac54f73e63dbf6f41865dd94d24bc0cf732262fcaff67319d162bb43af909f6f8ee27b1971939cfbba08141 +8bca7cdf730cf56c7b2c8a2c4879d61361a6e1dba5a3681a1a16c17a56e168ace0e99cf0d15826a1f5e67e6b8a8a049a +a746d876e8b1ce225fcafca603b099b36504846961526589af977a88c60d31ba2cc56e66a3dec8a77b3f3531bf7524c9 +a11e2e1927e6704cdb8874c75e4f1842cef84d7d43d7a38e339e61dc8ba90e61bbb20dd3c12e0b11d2471d58eed245be +a36395e22bc1d1ba8b0459a235203177737397da5643ce54ded3459d0869ff6d8d89f50c73cb62394bf66a959cde9b90 +8b49f12ba2fdf9aca7e5f81d45c07d47f9302a2655610e7634d1e4bd16048381a45ef2c95a8dd5b0715e4b7cf42273af +91cffa2a17e64eb7f76bccbe4e87280ee1dd244e04a3c9eac12e15d2d04845d876eb24fe2ec6d6d266cce9efb281077f +a6b8afabf65f2dee01788114e33a2f3ce25376fb47a50b74da7c3c25ff1fdc8aa9f41307534abbf48acb6f7466068f69 +8d13db896ccfea403bd6441191995c1a65365cab7d0b97fbe9526da3f45a877bd1f4ef2edef160e8a56838cd1586330e +98c717de9e01bef8842c162a5e757fe8552d53269c84862f4d451e7c656ae6f2ae473767b04290b134773f63be6fdb9d +8c2036ace1920bd13cf018e82848c49eb511fad65fd0ff51f4e4b50cf3bfc294afb63cba682c16f52fb595a98fa84970 +a3520fdff05dbad9e12551b0896922e375f9e5589368bcb2cc303bde252743b74460cb5caf99629325d3620f13adc796 +8d4f83a5bfec05caf5910e0ce538ee9816ee18d0bd44c1d0da2a87715a23cd2733ad4d47552c6dc0eb397687d611dd19 +a7b39a0a6a02823452d376533f39d35029867b3c9a6ad6bca181f18c54132d675613a700f9db2440fb1b4fa13c8bf18a +80bcb114b2544b80f404a200fc36860ed5e1ad31fe551acd4661d09730c452831751baa9b19d7d311600d267086a70bc +90dcce03c6f88fc2b08f2b42771eedde90cc5330fe0336e46c1a7d1b5a6c1641e5fcc4e7b3d5db00bd8afca9ec66ed81 +aec15f40805065c98e2965b1ae12a6c9020cfdb094c2d0549acfc7ea2401a5fb48d3ea7d41133cf37c4e096e7ff53eb9 +80e129b735dba49fa627a615d6c273119acec8e219b2f2c4373a332b5f98d66cbbdd688dfbe72a8f8bfefaccc02c50c1 +a9b596da3bdfe23e6799ece5f7975bf7a1979a75f4f546deeaf8b34dfe3e0d623217cb4cf4ccd504cfa3625b88cd53f1 +abcbbb70b16f6e517c0ab4363ab76b46e4ff58576b5f8340e5c0e8cc0e02621b6e23d742d73b015822a238b17cfd7665 +a046937cc6ea6a2e1adae543353a9fe929c1ae4ad655be1cc051378482cf88b041e28b1e9a577e6ccff2d3570f55e200 +831279437282f315e65a60184ef158f0a3dddc15a648dc552bdc88b3e6fe8288d3cfe9f0031846d81350f5e7874b4b33 +993d7916fa213c6d66e7c4cafafc1eaec9a2a86981f91c31eb8a69c5df076c789cbf498a24c84e0ee77af95b42145026 +823907a3b6719f8d49b3a4b7c181bd9bb29fcf842d7c70660c4f351852a1e197ca46cf5e879b47fa55f616fa2b87ce5e +8d228244e26132b234930ee14c75d88df0943cdb9c276a8faf167d259b7efc1beec2a87c112a6c608ad1600a239e9aae +ab6e55766e5bfb0cf0764ed909a8473ab5047d3388b4f46faeba2d1425c4754c55c6daf6ad4751e634c618b53e549529 +ab0cab6860e55a84c5ad2948a7e0989e2b4b1fd637605634b118361497332df32d9549cb854b2327ca54f2bcb85eed8f +b086b349ae03ef34f4b25a57bcaa5d1b29bd94f9ebf87e22be475adfe475c51a1230c1ebe13506cb72c4186192451658 +8a0b49d8a254ca6d91500f449cbbfbb69bb516c6948ac06808c65595e46773e346f97a5ce0ef7e5a5e0de278af22709c +ac49de11edaaf04302c73c578cc0824bdd165c0d6321be1c421c1950e68e4f3589aa3995448c9699e93c6ebae8803e27 +884f02d841cb5d8f4c60d1402469216b114ab4e93550b5bc1431756e365c4f870a9853449285384a6fa49e12ce6dc654 +b75f3a28fa2cc8d36b49130cb7448a23d73a7311d0185ba803ad55c8219741d451c110f48b786e96c728bc525903a54f +80ae04dbd41f4a35e33f9de413b6ad518af0919e5a30cb0fa1b061b260420780bb674f828d37fd3b52b5a31673cbd803 +b9a8011eb5fcea766907029bf743b45262db3e49d24f84503687e838651ed11cb64c66281e20a0ae9f6aa51acc552263 +90bfdd75e2dc9cf013e22a5d55d2d2b8a754c96103a17524488e01206e67f8b6d52b1be8c4e3d5307d4fe06d0e51f54c +b4af353a19b06203a815ec43e79a88578cc678c46f5a954b85bc5c53b84059dddba731f3d463c23bfd5273885c7c56a4 +aa125e96d4553b64f7140e5453ff5d2330318b69d74d37d283e84c26ad672fa00e3f71e530eb7e28be1e94afb9c4612e +a18e060aee3d49cde2389b10888696436bb7949a79ca7d728be6456a356ea5541b55492b2138da90108bd1ce0e6f5524 +93e55f92bdbccc2de655d14b1526836ea2e52dba65eb3f87823dd458a4cb5079bf22ce6ef625cb6d6bfdd0995ab9a874 +89f5a683526b90c1c3ceebbb8dc824b21cff851ce3531b164f6626e326d98b27d3e1d50982e507d84a99b1e04e86a915 +83d1c38800361633a3f742b1cb2bfc528129496e80232611682ddbe403e92c2ac5373aea0bca93ecb5128b0b2b7a719e +8ecba560ac94905e19ce8d9c7af217bf0a145d8c8bd38e2db82f5e94cc3f2f26f55819176376b51f154b4aab22056059 +a7e2a4a002b60291924850642e703232994acb4cfb90f07c94d1e0ecd2257bb583443283c20fc6017c37e6bfe85b7366 +93ed7316fa50b528f1636fc6507683a672f4f4403e55e94663f91221cc198199595bd02eef43d609f451acc9d9b36a24 +a1220a8ebc5c50ceed76a74bc3b7e0aa77f6884c71b64b67c4310ac29ce5526cb8992d6abc13ef6c8413ce62486a6795 +b2f6eac5c869ad7f4a25161d3347093e2f70e66cd925032747e901189355022fab3038bca4d610d2f68feb7e719c110b +b703fa11a4d511ca01c7462979a94acb40b5d933759199af42670eb48f83df202fa0c943f6ab3b4e1cc54673ea3aab1e +b5422912afbfcb901f84791b04f1ddb3c3fbdc76d961ee2a00c5c320e06d3cc5b5909c3bb805df66c5f10c47a292b13d +ad0934368da823302e1ac08e3ede74b05dfdbfffca203e97ffb0282c226814b65c142e6e15ec1e754518f221f01b30f7 +a1dd302a02e37df15bf2f1147efe0e3c06933a5a767d2d030e1132f5c3ce6b98e216b6145eb39e1e2f74e76a83165b8d +a346aab07564432f802ae44738049a36f7ca4056df2d8f110dbe7fef4a3e047684dea609b2d03dc6bf917c9c2a47608f +b96c5f682a5f5d02123568e50f5d0d186e4b2c4c9b956ec7aabac1b3e4a766d78d19bd111adb5176b898e916e49be2aa +8a96676d56876fc85538db2e806e1cba20fd01aeb9fa3cb43ca6ca94a2c102639f65660db330e5d74a029bb72d6a0b39 +ab0048336bd5c3def1a4064eadd49e66480c1f2abb4df46e03afbd8a3342c2c9d74ee35d79f08f4768c1646681440984 +888427bdf76caec90814c57ee1c3210a97d107dd88f7256f14f883ad0f392334b82be11e36dd8bfec2b37935177c7831 +b622b282becf0094a1916fa658429a5292ba30fb48a4c8066ce1ddcefb71037948262a01c95bab6929ed3a76ba5db9fe +b5b9e005c1f456b6a368a3097634fb455723abe95433a186e8278dceb79d4ca2fbe21f8002e80027b3c531e5bf494629 +a3c6707117a1e48697ed41062897f55d8119403eea6c2ee88f60180f6526f45172664bfee96bf61d6ec0b7fbae6aa058 +b02a9567386a4fbbdb772d8a27057b0be210447348efe6feb935ceec81f361ed2c0c211e54787dc617cdffed6b4a6652 +a9b8364e40ef15c3b5902e5534998997b8493064fa2bea99600def58279bb0f64574c09ba11e9f6f669a8354dd79dc85 +9998a2e553a9aa9a206518fae2bc8b90329ee59ab23005b10972712389f2ec0ee746033c733092ffe43d73d33abbb8ef +843a4b34d9039bf79df96d79f2d15e8d755affb4d83d61872daf540b68c0a3888cf8fc00d5b8b247b38524bcb3b5a856 +84f7128920c1b0bb40eee95701d30e6fc3a83b7bb3709f16d97e72acbb6057004ee7ac8e8f575936ca9dcb7866ab45f7 +918d3e2222e10e05edb34728162a899ad5ada0aaa491aeb7c81572a9c0d506e31d5390e1803a91ff3bd8e2bb15d47f31 +9442d18e2489613a7d47bb1cb803c8d6f3259d088cd079460976d87f7905ee07dea8f371b2537f6e1d792d36d7e42723 +b491976970fe091995b2ed86d629126523ccf3e9daf8145302faca71b5a71a5da92e0e05b62d7139d3efac5c4e367584 +aa628006235dc77c14cef4c04a308d66b07ac92d377df3de1a2e6ecfe3144f2219ad6d7795e671e1cb37a3641910b940 +99d386adaea5d4981d7306feecac9a555b74ffdc218c907c5aa7ac04abaead0ec2a8237300d42a3fbc464673e417ceed +8f78e8b1556f9d739648ea3cab9606f8328b52877fe72f9305545a73b74d49884044ba9c1f1c6db7d9b7c7b7c661caba +8fb357ae49932d0babdf74fc7aa7464a65d3b6a2b3acf4f550b99601d3c0215900cfd67f2b6651ef94cfc323bac79fae +9906f2fa25c0290775aa001fb6198113d53804262454ae8b83ef371b5271bde189c0460a645829cb6c59f9ee3a55ce4d +8f4379b3ebb50e052325b27655ca6a82e6f00b87bf0d2b680d205dd2c7afdc9ff32a9047ae71a1cdf0d0ce6b9474d878 +a85534e88c2bd43c043792eaa75e50914b21741a566635e0e107ae857aed0412035f7576cf04488ade16fd3f35fdbb87 +b4ce93199966d3c23251ca7f28ec5af7efea1763d376b0385352ffb2e0a462ef95c69940950278cf0e3dafd638b7bd36 +b10cb3d0317dd570aa73129f4acf63c256816f007607c19b423fb42f65133ce21f2f517e0afb41a5378cccf893ae14d0 +a9b231c9f739f7f914e5d943ed9bff7eba9e2c333fbd7c34eb1648a362ee01a01af6e2f7c35c9fe962b11152cddf35de +99ff6a899e156732937fb81c0cced80ae13d2d44c40ba99ac183aa246103b31ec084594b1b7feb96da58f4be2dd5c0ed +8748d15d18b75ff2596f50d6a9c4ce82f61ecbcee123a6ceae0e43cab3012a29b6f83cf67b48c22f6f9d757c6caf76b2 +b88ab05e4248b7fb634cf640a4e6a945d13e331237410f7217d3d17e3e384ddd48897e7a91e4516f1b9cbd30f35f238b +8d826deaeeb84a3b2d2c04c2300ca592501f992810582d6ae993e0d52f6283a839dba66c6c72278cff5871802b71173b +b36fed027c2f05a5ef625ca00b0364b930901e9e4420975b111858d0941f60e205546474bb25d6bfa6928d37305ae95f +af2fcfc6b87967567e8b8a13a4ed914478185705724e56ce68fb2df6d1576a0cf34a61e880997a0d35dc2c3276ff7501 +ac351b919cd1fbf106feb8af2c67692bfcddc84762d18cea681cfa7470a5644839caace27efee5f38c87d3df306f4211 +8d6665fb1d4d8d1fa23bd9b8a86e043b8555663519caac214d1e3e3effbc6bee7f2bcf21e645f77de0ced279d69a8a8b +a9fc1c2061756b2a1a169c1b149f212ff7f0d2488acd1c5a0197eba793cffa593fc6d1d1b40718aa75ca3ec77eff10e1 +aff64f0fa009c7a6cf0b8d7a22ddb2c8170c3cb3eec082e60d5aadb00b0040443be8936d728d99581e33c22178c41c87 +82e0b181adc5e3b1c87ff8598447260e839d53debfae941ebea38265575546c3a74a14b4325a030833a62ff6c52d9365 +b7ad43cbb22f6f892c2a1548a41dc120ab1f4e1b8dea0cb6272dd9cb02054c542ecabc582f7e16de709d48f5166cae86 +985e0c61094281532c4afb788ecb2dfcba998e974b5d4257a22040a161883908cdd068fe80f8eb49b8953cfd11acf43a +ae46895c6d67ea6d469b6c9c07b9e5d295d9ae73b22e30da4ba2c973ba83a130d7eef39717ec9d0f36e81d56bf742671 +8600177ea1f7e7ef90514b38b219a37dedfc39cb83297e4c7a5b479817ef56479d48cf6314820960c751183f6edf8b0e +b9208ec1c1d7a1e99b59c62d3e4e61dfb706b0e940d09d3abfc3454c19749083260614d89cfd7e822596c3cdbcc6bb95 +a1e94042c796c2b48bc724352d2e9f3a22291d9a34705993357ddb6adabd76da6fc25dac200a8cb0b5bbd99ecddb7af6 +b29c3adedd0bcad8a930625bc4dfdc3552a9afd5ca6dd9c0d758f978068c7982b50b711aa0eb5b97f2b84ee784637835 +af0632a238bb1f413c7ea8e9b4c3d68f2827bd2e38cd56024391fba6446ac5d19a780d0cfd4a78fe497d537b766a591a +aaf6e7f7d54f8ef5e2e45dd59774ecbeecf8683aa70483b2a75be6a6071b5981bbaf1627512a65d212817acdfab2e428 +8c751496065da2e927cf492aa5ca9013b24f861d5e6c24b30bbf52ec5aaf1905f40f9a28175faef283dd4ed4f2182a09 +8952377d8e80a85cf67d6b45499f3bad5fd452ea7bcd99efc1b066c4720d8e5bff1214cea90fd1f972a7f0baac3d29be +a1946ee543d1a6e21f380453be4d446e4130950c5fc3d075794eb8260f6f52d0a795c1ff91d028a648dc1ce7d9ab6b47 +89f3fefe37af31e0c17533d2ca1ce0884cc1dc97c15cbfab9c331b8debd94781c9396abef4bb2f163d09277a08d6adf0 +a2753f1e6e1a154fb117100a5bd9052137add85961f8158830ac20541ab12227d83887d10acf7fd36dcaf7c2596d8d23 +814955b4198933ee11c3883863b06ff98c7eceb21fc3e09df5f916107827ccf3323141983e74b025f46ae00284c9513b +8cc5c6bb429073bfef47cae7b3bfccb0ffa076514d91a1862c6bda4d581e0df87db53cc6c130bf8a7826304960f5a34e +909f22c1f1cdc87f7be7439c831a73484a49acbf8f23d47087d7cf867c64ef61da3bde85dc57d705682b4c3fc710d36e +8048fee7f276fcd504aed91284f28e73693615e0eb3858fa44bcf79d7285a9001c373b3ef71d9a3054817ba293ebe28c +94400e5cf5d2700ca608c5fe35ce14623f71cc24959f2bc27ca3684092850f76b67fb1f07ca9e5b2ca3062cf8ad17bd4 +81c2ae7d4d1b17f8b6de6a0430acc0d58260993980fe48dc2129c4948269cdc74f9dbfbf9c26b19360823fd913083d48 +8c41fe765128e63f6889d6a979f6a4342300327c8b245a8cfe3ecfbcac1e09c3da30e2a1045b24b78efc6d6d50c8c6ac +a5dd4ae51ae48c8be4b218c312ade226cffce671cf121cb77810f6c0990768d6dd767badecb5c69921d5574d5e8433d3 +b7642e325f4ba97ae2a39c1c9d97b35aafd49d53dba36aed3f3cb0ca816480b3394079f46a48252d46596559c90f4d58 +ae87375b40f35519e7bd4b1b2f73cd0b329b0c2cb9d616629342a71c6c304338445eda069b78ea0fbe44087f3de91e09 +b08918cb6f736855e11d3daca1ddfbdd61c9589b203b5493143227bf48e2c77c2e8c94b0d1aa2fab2226e0eae83f2681 +ac36b84a4ac2ebd4d6591923a449c564e3be8a664c46092c09e875c2998eba16b5d32bfd0882fd3851762868e669f0b1 +a44800a3bb192066fa17a3f29029a23697240467053b5aa49b9839fb9b9b8b12bcdcbfc557f024b61f4f51a9aacdefcb +9064c688fec23441a274cdf2075e5a449caf5c7363cc5e8a5dc9747183d2e00a0c69f2e6b3f6a7057079c46014c93b3b +aa367b021469af9f5b764a79bb3afbe2d87fe1e51862221672d1a66f954b165778b7c27a705e0f93841fab4c8468344d +a1a8bfc593d4ab71f91640bc824de5c1380ab2591cfdafcbc78a14b32de3c0e15f9d1b461d85c504baa3d4232c16bb53 +97df48da1799430f528184d30b6baa90c2a2f88f34cdfb342d715339c5ebd6d019aa693cea7c4993daafc9849063a3aa +abd923831fbb427e06e0dd335253178a9e5791395c84d0ab1433c07c53c1209161097e9582fb8736f8a60bde62d8693e +84cd1a43f1a438b43dc60ffc775f646937c4f6871438163905a3cebf1115f814ccd38a6ccb134130bff226306e412f32 +91426065996b0743c5f689eb3ca68a9f7b9e4d01f6c5a2652b57fa9a03d8dc7cd4bdbdab0ca5a891fee1e97a7f00cf02 +a4bee50249db3df7fd75162b28f04e57c678ba142ce4d3def2bc17bcb29e4670284a45f218dad3969af466c62a903757 +83141ebcc94d4681404e8b67a12a46374fded6df92b506aff3490d875919631408b369823a08b271d006d5b93136f317 +a0ea1c8883d58d5a784da3d8c8a880061adea796d7505c1f903d07c287c5467f71e4563fc0faafbc15b5a5538b0a7559 +89d9d480574f201a87269d26fb114278ed2c446328df431dc3556e3500e80e4cd01fcac196a2459d8646361ebda840df +8bf302978973632dd464bec819bdb91304712a3ec859be071e662040620422c6e75eba6f864f764cffa2799272efec39 +922f666bc0fd58b6d7d815c0ae4f66d193d32fc8382c631037f59eeaeae9a8ca6c72d08e72944cf9e800b8d639094e77 +81ad8714f491cdff7fe4399f2eb20e32650cff2999dd45b9b3d996d54a4aba24cc6c451212e78c9e5550368a1a38fb3f +b58fcf4659d73edb73175bd9139d18254e94c3e32031b5d4b026f2ed37aa19dca17ec2eb54c14340231615277a9d347e +b365ac9c2bfe409b710928c646ea2fb15b28557e0f089d39878e365589b9d1c34baf5566d20bb28b33bb60fa133f6eff +8fcae1d75b53ab470be805f39630d204853ca1629a14158bac2f52632277d77458dec204ff84b7b2d77e641c2045be65 +a03efa6bebe84f4f958a56e2d76b5ba4f95dd9ed7eb479edc7cc5e646c8d4792e5b0dfc66cc86aa4b4afe2f7a4850760 +af1c823930a3638975fb0cc5c59651771b2719119c3cd08404fbd4ce77a74d708cefbe3c56ea08c48f5f10e6907f338f +8260c8299b17898032c761c325ac9cabb4c5b7e735de81eacf244f647a45fb385012f4f8df743128888c29aefcaaad16 +ab2f37a573c82e96a8d46198691cd694dfa860615625f477e41f91b879bc58a745784fccd8ffa13065834ffd150d881d +986c746c9b4249352d8e5c629e8d7d05e716b3c7aab5e529ca969dd1e984a14b5be41528baef4c85d2369a42d7209216 +b25e32da1a8adddf2a6080725818b75bc67240728ad1853d90738485d8924ea1e202df0a3034a60ffae6f965ec55cf63 +a266e627afcebcefea6b6b44cbc50f5c508f7187e87d047b0450871c2a030042c9e376f3ede0afcf9d1952f089582f71 +86c3bbca4c0300606071c0a80dbdec21ce1dd4d8d4309648151c420854032dff1241a1677d1cd5de4e4de4385efda986 +b9a21a1fe2d1f3273a8e4a9185abf2ff86448cc98bfa435e3d68306a2b8b4a6a3ea33a155be3cb62a2170a86f77679a5 +b117b1ea381adce87d8b342cba3a15d492ff2d644afa28f22424cb9cbc820d4f7693dfc1a4d1b3697046c300e1c9b4c8 +9004c425a2e68870d6c69b658c344e3aa3a86a8914ee08d72b2f95c2e2d8a4c7bb0c6e7e271460c0e637cec11117bf8e +86a18aa4783b9ebd9131580c8b17994825f27f4ac427b0929a1e0236907732a1c8139e98112c605488ee95f48bbefbfc +84042243b955286482ab6f0b5df4c2d73571ada00716d2f737ca05a0d2e88c6349e8ee9e67934cfee4a1775dbf7f4800 +92c2153a4733a62e4e1d5b60369f3c26777c7d01cd3c8679212660d572bd3bac9b8a8a64e1f10f7dbf5eaa7579c4e423 +918454b6bb8e44a2afa144695ba8d48ae08d0cdfef4ad078f67709eddf3bb31191e8b006f04e82ea45a54715ef4d5817 +acf0b54f6bf34cf6ed6c2b39cf43194a40d68de6bcf1e4b82c34c15a1343e9ac3737885e1a30b78d01fa3a5125463db8 +a7d60dbe4b6a7b054f7afe9ee5cbbfeca0d05dc619e6041fa2296b549322529faddb8a11e949562309aecefb842ac380 +91ffb53e6d7e5f11159eaf13e783d6dbdfdb1698ed1e6dbf3413c6ea23492bbb9e0932230a9e2caac8fe899a17682795 +b6e8d7be5076ee3565d5765a710c5ecf17921dd3cf555c375d01e958a365ae087d4a88da492a5fb81838b7b92bf01143 +a8c6b763de2d4b2ed42102ef64eccfef31e2fb2a8a2776241c82912fa50fc9f77f175b6d109a97ede331307c016a4b1a +99839f86cb700c297c58bc33e28d46b92931961548deac29ba8df91d3e11721b10ea956c8e16984f9e4acf1298a79b37 +8c2e2c338f25ea5c25756b7131cde0d9a2b35abf5d90781180a00fe4b8e64e62590dc63fe10a57fba3a31c76d784eb01 +9687d7df2f41319ca5469d91978fed0565a5f11f829ebadaa83db92b221755f76c6eacd7700735e75c91e257087512e3 +8795fdfb7ff8439c58b9bf58ed53873d2780d3939b902b9ddaaa4c99447224ced9206c3039a23c2c44bcc461e2bb637f +a803697b744d2d087f4e2307218d48fa88620cf25529db9ce71e2e3bbcc65bac5e8bb9be04777ef7bfb5ed1a5b8e6170 +80f3d3efbbb9346ddd413f0a8e36b269eb5d7ff6809d5525ff9a47c4bcab2c01b70018b117f6fe05253775612ff70c6b +9050e0e45bcc83930d4c505af35e5e4d7ca01cd8681cba92eb55821aececcebe32bb692ebe1a4daac4e7472975671067 +8d206812aac42742dbaf233e0c080b3d1b30943b54b60283515da005de05ea5caa90f91fedcfcba72e922f64d7040189 +a2d44faaeb2eff7915c83f32b13ca6f31a6847b1c1ce114ea240bac3595eded89f09b2313b7915ad882292e2b586d5b4 +961776c8576030c39f214ea6e0a3e8b3d32f023d2600958c098c95c8a4e374deeb2b9dc522adfbd6bda5949bdc09e2a2 +993fa7d8447407af0fbcd9e6d77f815fa5233ab00674efbcf74a1f51c37481445ae291cc7b76db7c178f9cb0e570e0fc +abd5b1c78e05f9d7c8cc99bdaef8b0b6a57f2daf0f02bf492bec48ea4a27a8f1e38b5854da96efff11973326ff980f92 +8f15af4764bc275e6ccb892b3a4362cacb4e175b1526a9a99944e692fe6ccb1b4fc19abf312bb2a089cb1f344d91a779 +a09b27ccd71855512aba1d0c30a79ffbe7f6707a55978f3ced50e674b511a79a446dbc6d7946add421ce111135a460af +94b2f98ce86a9271fbd4153e1fc37de48421fe3490fb3840c00f2d5a4d0ba8810c6a32880b002f6374b59e0a7952518b +8650ac644f93bbcb88a6a0f49fee2663297fd4bc6fd47b6a89b9d8038d32370438ab3a4775ec9b58cb10aea8a95ef7b6 +95e5c2f2e84eed88c6980bbba5a1c0bb375d5a628bff006f7516d45bb7d723da676add4fdd45956f312e7bab0f052644 +b3278a3fa377ac93af7cfc9453f8cb594aae04269bbc99d2e0e45472ff4b6a2f97a26c4c57bf675b9d86f5e77a5d55d1 +b4bcbe6eb666a206e2ea2f877912c1d3b5bdbd08a989fc4490eb06013e1a69ad1ba08bcdac048bf29192312be399077b +a76d70b78c99fffcbf9bb9886eab40f1ea4f99a309710b660b64cbf86057cbcb644d243f6e341711bb7ef0fedf0435a7 +b2093c1ee945dca7ac76ad5aed08eae23af31dd5a77c903fd7b6f051f4ab84425d33a03c3d45bf2907bc93c02d1f3ad8 +904b1f7534e053a265b22d20be859912b9c9ccb303af9a8d6f1d8f6ccdc5c53eb4a45a1762b880d8444d9be0cd55e7f9 +8f664a965d65bc730c9ef1ec7467be984d4b8eb46bd9b0d64e38e48f94e6e55dda19aeac82cbcf4e1473440e64c4ca18 +8bcee65c4cc7a7799353d07b114c718a2aae0cd10a3f22b7eead5185d159dafd64852cb63924bf87627d176228878bce +8c78f2e3675096fef7ebaa898d2615cd50d39ca3d8f02b9bdfb07e67da648ae4be3da64838dffc5935fd72962c4b96c7 +8c40afd3701629421fec1df1aac4e849384ef2e80472c0e28d36cb1327acdf2826f99b357f3d7afdbc58a6347fc40b3c +a197813b1c65a8ea5754ef782522a57d63433ef752215ecda1e7da76b0412ee619f58d904abd2e07e0c097048b6ae1dd +a670542629e4333884ad7410f9ea3bd6f988df4a8f8a424ca74b9add2312586900cf9ae8bd50411f9146e82626b4af56 +a19875cc07ab84e569d98b8b67fb1dbbdfb59093c7b748fae008c8904a6fd931a63ca8d03ab5fea9bc8d263568125a9b +b57e7f68e4eb1bd04aafa917b1db1bdab759a02aa8a9cdb1cba34ba8852b5890f655645c9b4e15d5f19bf37e9f2ffe9f +8abe4e2a4f6462b6c64b3f10e45db2a53c2b0d3c5d5443d3f00a453e193df771eda635b098b6c8604ace3557514027af +8459e4fb378189b22b870a6ef20183deb816cefbf66eca1dc7e86d36a2e011537db893729f500dc154f14ce24633ba47 +930851df4bc7913c0d8c0f7bd3b071a83668987ed7c397d3d042fdc0d9765945a39a3bae83da9c88cb6b686ed8aeeb26 +8078c9e5cd05e1a8c932f8a1d835f61a248b6e7133fcbb3de406bf4ffc0e584f6f9f95062740ba6008d98348886cf76b +addff62bb29430983fe578e3709b0949cdc0d47a13a29bc3f50371a2cb5c822ce53e2448cfaa01bcb6e0aa850d5a380e +9433add687b5a1e12066721789b1db2edf9b6558c3bdc0f452ba33b1da67426abe326e9a34d207bfb1c491c18811bde1 +822beda3389963428cccc4a2918fa9a8a51cf0919640350293af70821967108cded5997adae86b33cb917780b097f1ca +a7a9f52bda45e4148ed56dd176df7bd672e9b5ed18888ccdb405f47920fdb0844355f8565cefb17010b38324edd8315f +b35c3a872e18e607b2555c51f9696a17fa18da1f924d503b163b4ec9fe22ed0c110925275cb6c93ce2d013e88f173d6a +adf34b002b2b26ab84fc1bf94e05bd8616a1d06664799ab149363c56a6e0c807fdc473327d25632416e952ea327fcd95 +ae4a6b9d22a4a3183fac29e2551e1124a8ce4a561a9a2afa9b23032b58d444e6155bb2b48f85c7b6d70393274e230db7 +a2ea3be4fc17e9b7ce3110284038d46a09e88a247b6971167a7878d9dcf36925d613c382b400cfa4f37a3ebea3699897 +8e5863786b641ce3140fbfe37124d7ad3925472e924f814ebfc45959aaf3f61dc554a597610b5defaecc85b59a99b50f +aefde3193d0f700d0f515ab2aaa43e2ef1d7831c4f7859f48e52693d57f97fa9e520090f3ed700e1c966f4b76048e57f +841a50f772956622798e5cd208dc7534d4e39eddee30d8ce133383d66e5f267e389254a0cdae01b770ecd0a9ca421929 +8fbc2bfd28238c7d47d4c03b1b910946c0d94274a199575e5b23242619b1de3497784e646a92aa03e3e24123ae4fcaba +926999579c8eec1cc47d7330112586bdca20b4149c8b2d066f527c8b9f609e61ce27feb69db67eea382649c6905efcf9 +b09f31f305efcc65589adf5d3690a76cf339efd67cd43a4e3ced7b839507466e4be72dd91f04e89e4bbef629d46e68c0 +b917361f6b95f759642638e0b1d2b3a29c3bdef0b94faa30de562e6078c7e2d25976159df3edbacbf43614635c2640b4 +8e7e8a1253bbda0e134d62bfe003a2669d471b47bd2b5cde0ff60d385d8e62279d54022f5ac12053b1e2d3aaa6910b4c +b69671a3c64e0a99d90b0ed108ce1912ff8ed983e4bddd75a370e9babde25ee1f5efb59ec707edddd46793207a8b1fe7 +910b2f4ebd37b7ae94108922b233d0920b4aba0bd94202c70f1314418b548d11d8e9caa91f2cd95aff51b9432d122b7f +82f645c90dfb52d195c1020346287c43a80233d3538954548604d09fbab7421241cde8593dbc4acc4986e0ea39a27dd9 +8fee895f0a140d88104ce442fed3966f58ff9d275e7373483f6b4249d64a25fb5374bbdc6bce6b5ab0270c2847066f83 +84f5bd7aab27b2509397aeb86510dd5ac0a53f2c8f73799bf720f2f87a52277f8d6b0f77f17bc80739c6a7119b7eb062 +9903ceced81099d7e146e661bcf01cbaccab5ba54366b85e2177f07e2d8621e19d9c9c3eee14b9266de6b3f9b6ea75ae +b9c16ea2a07afa32dd6c7c06df0dec39bca2067a9339e45475c98917f47e2320f6f235da353fd5e15b477de97ddc68dd +9820a9bbf8b826bec61ebf886de2c4f404c1ebdc8bab82ee1fea816d9de29127ce1852448ff717a3fe8bbfe9e92012e5 +817224d9359f5da6f2158c2c7bf9165501424f063e67ba9859a07ab72ee2ee62eb00ca6da821cfa19065c3282ca72c74 +94b95c465e6cb00da400558a3c60cfec4b79b27e602ca67cbc91aead08de4b6872d8ea096b0dc06dca4525c8992b8547 +a2b539a5bccd43fa347ba9c15f249b417997c6a38c63517ca38394976baa08e20be384a360969ff54e7e721db536b3e5 +96caf707e34f62811ee8d32ccf28d8d6ec579bc33e424d0473529af5315c456fd026aa910c1fed70c91982d51df7d3ca +8a77b73e890b644c6a142bdbac59b22d6a676f3b63ddafb52d914bb9d395b8bf5aedcbcc90429337df431ebd758a07a6 +8857830a7351025617a08bc44caec28d2fae07ebf5ffc9f01d979ce2a53839a670e61ae2783e138313929129790a51a1 +aa3e420321ed6f0aa326d28d1a10f13facec6f605b6218a6eb9cbc074801f3467bf013a456d1415a5536f12599efa3d3 +824aed0951957b00ea2f3d423e30328a3527bf6714cf9abbae84cf27e58e5c35452ba89ccc011de7c68c75d6e021d8f1 +a2e87cc06bf202e953fb1081933d8b4445527dde20e38ed1a4f440144fd8fa464a2b73e068b140562e9045e0f4bd3144 +ae3b8f06ad97d7ae3a5e5ca839efff3e4824dc238c0c03fc1a8d2fc8aa546cdfd165b784a31bb4dec7c77e9305b99a4b +b30c3e12395b1fb8b776f3ec9f87c70e35763a7b2ddc68f0f60a4982a84017f27c891a98561c830038deb033698ed7fc +874e507757cd1177d0dff0b0c62ce90130324442a33da3b2c8ee09dbca5d543e3ecfe707e9f1361e7c7db641c72794bb +b53012dd10b5e7460b57c092eaa06d6502720df9edbbe3e3f61a9998a272bf5baaac4a5a732ad4efe35d6fac6feca744 +85e6509d711515534d394e6cacbed6c81da710074d16ef3f4950bf2f578d662a494d835674f79c4d6315bced4defc5f0 +b6132b2a34b0905dcadc6119fd215419a7971fe545e52f48b768006944b4a9d7db1a74b149e2951ea48c083b752d0804 +989867da6415036d19b4bacc926ce6f4df7a556f50a1ba5f3c48eea9cefbb1c09da81481c8009331ee83f0859185e164 +960a6c36542876174d3fbc1505413e29f053ed87b8d38fef3af180491c7eff25200b45dd5fe5d4d8e63c7e8c9c00f4c8 +9040b59bd739d9cc2e8f6e894683429e4e876a8106238689ff4c22770ae5fdae1f32d962b30301fa0634ee163b524f35 +af3fcd0a45fe9e8fe256dc7eab242ef7f582dd832d147444483c62787ac820fafc6ca55d639a73f76bfa5e7f5462ab8f +b934c799d0736953a73d91e761767fdb78454355c4b15c680ce08accb57ccf941b13a1236980001f9e6195801cffd692 +8871e8e741157c2c326b22cf09551e78da3c1ec0fc0543136f581f1550f8bab03b0a7b80525c1e99812cdbf3a9698f96 +a8a977f51473a91d178ee8cfa45ffef8d6fd93ab1d6e428f96a3c79816d9c6a93cd70f94d4deda0125fd6816e30f3bea +a7688b3b0a4fc1dd16e8ba6dc758d3cfe1b7cf401c31739484c7fa253cce0967df1b290769bcefc9d23d3e0cb19e6218 +8ae84322662a57c6d729e6ff9d2737698cc2da2daeb1f39e506618750ed23442a6740955f299e4a15dda6db3e534d2c6 +a04a961cdccfa4b7ef83ced17ab221d6a043b2c718a0d6cc8e6f798507a31f10bf70361f70a049bc8058303fa7f96864 +b463e39732a7d9daec8a456fb58e54b30a6e160aa522a18b9a9e836488cce3342bcbb2e1deab0f5e6ec0a8796d77197d +b1434a11c6750f14018a2d3bcf94390e2948f4f187e93bb22070ca3e5393d339dc328cbfc3e48815f51929465ffe7d81 +84ff81d73f3828340623d7e3345553610aa22a5432217ef0ebd193cbf4a24234b190c65ca0873c22d10ea7b63bd1fbed +b6fe2723f0c47757932c2ddde7a4f8434f665612f7b87b4009c2635d56b6e16b200859a8ade49276de0ef27a2b6c970a +9742884ed7cd52b4a4a068a43d3faa02551a424136c85a9313f7cb58ea54c04aa83b0728fd741d1fe39621e931e88f8f +b7d2d65ea4d1ad07a5dee39e40d6c03a61264a56b1585b4d76fc5b2a68d80a93a42a0181d432528582bf08d144c2d6a9 +88c0f66bada89f8a43e5a6ead2915088173d106c76f724f4a97b0f6758aed6ae5c37c373c6b92cdd4aea8f6261f3a374 +81f9c43582cb42db3900747eb49ec94edb2284999a499d1527f03315fd330e5a509afa3bff659853570e9886aab5b28b +821f9d27d6beb416abf9aa5c79afb65a50ed276dbda6060103bc808bcd34426b82da5f23e38e88a55e172f5c294b4d40 +8ba307b9e7cb63a6c4f3851b321aebfdb6af34a5a4c3bd949ff7d96603e59b27ff4dc4970715d35f7758260ff942c9e9 +b142eb6c5f846de33227d0bda61d445a7c33c98f0a8365fe6ab4c1fabdc130849be597ef734305894a424ea715372d08 +a732730ae4512e86a741c8e4c87fee8a05ee840fec0e23b2e037d58dba8dde8d10a9bc5191d34d00598941becbbe467f +adce6f7c30fd221f6b10a0413cc76435c4bb36c2d60bca821e5c67409fe9dbb2f4c36ef85eb3d734695e4be4827e9fd3 +a74f00e0f9b23aff7b2527ce69852f8906dab9d6abe62ecd497498ab21e57542e12af9918d4fd610bb09e10b0929c510 +a593b6b0ef26448ce4eb3ab07e84238fc020b3cb10d542ff4b16d4e2be1bcde3797e45c9cf753b8dc3b0ffdb63984232 +aed3913afccf1aa1ac0eb4980eb8426d0baccebd836d44651fd72af00d09fac488a870223c42aca3ceb39752070405ae +b2c44c66a5ea7fde626548ba4cef8c8710191343d3dadfd3bb653ce715c0e03056a5303a581d47dde66e70ea5a2d2779 +8e5029b2ccf5128a12327b5103f7532db599846e422531869560ceaff392236434d87159f597937dbf4054f810c114f4 +82beed1a2c4477e5eb39fc5b0e773b30cfec77ef2b1bf17eadaf60eb35b6d0dd9d8cf06315c48d3546badb3f21cd0cca +90077bd6cc0e4be5fff08e5d07a5a158d36cebd1d1363125bc4fae0866ffe825b26f933d4ee5427ba5cd0c33c19a7b06 +a7ec0d8f079970e8e34f0ef3a53d3e0e45428ddcef9cc776ead5e542ef06f3c86981644f61c5a637e4faf001fb8c6b3e +ae6d4add6d1a6f90b22792bc9d40723ee6850c27d0b97eefafd5b7fd98e424aa97868b5287cc41b4fbd7023bca6a322c +831aa917533d077da07c01417feaa1408846363ba2b8d22c6116bb858a95801547dd88b7d7fa1d2e3f0a02bdeb2e103d +96511b860b07c8a5ed773f36d4aa9d02fb5e7882753bf56303595bcb57e37ccc60288887eb83bef08c657ec261a021a2 +921d2a3e7e9790f74068623de327443666b634c8443aba80120a45bba450df920b2374d96df1ce3fb1b06dd06f8cf6e3 +aa74451d51fe82b4581ead8e506ec6cd881010f7e7dd51fc388eb9a557db5d3c6721f81c151d08ebd9c2591689fbc13e +a972bfbcf4033d5742d08716c927c442119bdae336bf5dff914523b285ccf31953da2733759aacaa246a9af9f698342c +ad1fcd0cae0e76840194ce4150cb8a56ebed728ec9272035f52a799d480dfc85840a4d52d994a18b6edb31e79be6e8ad +a2c69fe1d36f235215432dad48d75887a44c99dfa0d78149acc74087da215a44bdb5f04e6eef88ff7eff80a5a7decc77 +a94ab2af2b6ee1bc6e0d4e689ca45380d9fbd3c5a65b9bd249d266a4d4c07bf5d5f7ef2ae6000623aee64027892bf8fe +881ec1fc514e926cdc66480ac59e139148ff8a2a7895a49f0dff45910c90cdda97b66441a25f357d6dd2471cddd99bb3 +884e6d3b894a914c8cef946a76d5a0c8351843b2bffa2d1e56c6b5b99c84104381dd1320c451d551c0b966f4086e60f9 +817c6c10ce2677b9fc5223500322e2b880583254d0bb0d247d728f8716f5e05c9ff39f135854342a1afecd9fbdcf7c46 +aaf4a9cb686a14619aa1fc1ac285dd3843ac3dd99f2b2331c711ec87b03491c02f49101046f3c5c538dc9f8dba2a0ac2 +97ecea5ce53ca720b5d845227ae61d70269a2f53540089305c86af35f0898bfd57356e74a8a5e083fa6e1ea70080bd31 +a22d811e1a20a75feac0157c418a4bfe745ccb5d29466ffa854dca03e395b6c3504a734341746b2846d76583a780b32e +940cbaa0d2b2db94ae96b6b9cf2deefbfd059e3e5745de9aec4a25f0991b9721e5cd37ef71c631575d1a0c280b01cd5b +ae33cb4951191258a11044682de861bf8d92d90ce751b354932dd9f3913f542b6a0f8a4dc228b3cd9244ac32c4582832 +a580df5e58c4274fe0f52ac2da1837e32f5c9db92be16c170187db4c358f43e5cfdda7c5911dcc79d77a5764e32325f5 +81798178cb9d8affa424f8d3be67576ba94d108a28ccc01d330c51d5a63ca45bb8ca63a2f569b5c5fe1303cecd2d777f +89975b91b94c25c9c3660e4af4047a8bacf964783010820dbc91ff8281509379cb3b24c25080d5a01174dd9a049118d5 +a7327fcb3710ed3273b048650bde40a32732ef40a7e58cf7f2f400979c177944c8bc54117ba6c80d5d4260801dddab79 +92b475dc8cb5be4b90c482f122a51bcb3b6c70593817e7e2459c28ea54a7845c50272af38119406eaadb9bcb993368d0 +9645173e9ecefc4f2eae8363504f7c0b81d85f8949a9f8a6c01f2d49e0a0764f4eacecf3e94016dd407fc14494fce9f9 +9215fd8983d7de6ae94d35e6698226fc1454977ae58d42d294be9aad13ac821562ad37d5e7ee5cdfe6e87031d45cd197 +810360a1c9b88a9e36f520ab5a1eb8bed93f52deefbe1312a69225c0a08edb10f87cc43b794aced9c74220cefcc57e7d +ad7e810efd61ed4684aeda9ed8bb02fb9ae4b4b63fda8217d37012b94ff1b91c0087043bfa4e376f961fff030c729f3b +8b07c95c6a06db8738d10bb03ec11b89375c08e77f0cab7e672ce70b2685667ca19c7e1c8b092821d31108ea18dfd4c7 +968825d025ded899ff7c57245250535c732836f7565eab1ae23ee7e513201d413c16e1ba3f5166e7ac6cf74de8ceef4f +908243370c5788200703ade8164943ad5f8c458219186432e74dbc9904a701ea307fd9b94976c866e6c58595fd891c4b +959969d16680bc535cdc6339e6186355d0d6c0d53d7bbfb411641b9bf4b770fd5f575beef5deec5c4fa4d192d455c350 +ad177f4f826a961adeac76da40e2d930748effff731756c797eddc4e5aa23c91f070fb69b19221748130b0961e68a6bb +82f8462bcc25448ef7e0739425378e9bb8a05e283ce54aae9dbebaf7a3469f57833c9171672ad43a79778366c72a5e37 +a28fb275b1845706c2814d9638573e9bc32ff552ebaed761fe96fdbce70395891ca41c400ae438369264e31a2713b15f +8a9c613996b5e51dadb587a787253d6081ea446bf5c71096980bf6bd3c4b69905062a8e8a3792de2d2ece3b177a71089 +8d5aefef9f60cb27c1db2c649221204dda48bb9bf8bf48f965741da051340e8e4cab88b9d15c69f3f84f4c854709f48a +93ebf2ca6ad85ab6deace6de1a458706285b31877b1b4d7dcb9d126b63047efaf8c06d580115ec9acee30c8a7212fa55 +b3ee46ce189956ca298057fa8223b7fd1128cf52f39159a58bca03c71dd25161ac13f1472301f72aef3e1993fe1ab269 +a24d7a8d066504fc3f5027ccb13120e2f22896860e02c45b5eba1dbd512d6a17c28f39155ea581619f9d33db43a96f92 +ae9ceacbfe12137db2c1a271e1b34b8f92e4816bad1b3b9b6feecc34df0f8b3b0f7ed0133acdf59c537d43d33fc8d429 +83967e69bf2b361f86361bd705dce0e1ad26df06da6c52b48176fe8dfcbeb03c462c1a4c9e649eff8c654b18c876fdef +9148e6b814a7d779c19c31e33a068e97b597de1f8100513db3c581190513edc4d544801ce3dd2cf6b19e0cd6daedd28a +94ccdafc84920d320ed22de1e754adea072935d3c5f8c2d1378ebe53d140ea29853f056fb3fb1e375846061a038cc9bc +afb43348498c38b0fa5f971b8cdd3a62c844f0eb52bc33daf2f67850af0880fce84ecfb96201b308d9e6168a0d443ae3 +86d5736520a83538d4cd058cc4b4e84213ed00ebd6e7af79ae787adc17a92ba5359e28ba6c91936d967b4b28d24c3070 +b5210c1ff212c5b1e9ef9126e08fe120a41e386bb12c22266f7538c6d69c7fd8774f11c02b81fd4e88f9137b020801fe +b78cfd19f94d24e529d0f52e18ce6185cb238edc6bd43086270fd51dd99f664f43dd4c7d2fe506762fbd859028e13fcf +a6e7220598c554abdcc3fdc587b988617b32c7bb0f82c06205467dbedb58276cc07cae317a190f19d19078773f4c2bbb +b88862809487ee430368dccd85a5d72fa4d163ca4aad15c78800e19c1a95be2192719801e315d86cff7795e0544a77e4 +87ecb13a03921296f8c42ceb252d04716f10e09c93962239fcaa0a7fef93f19ab3f2680bc406170108bc583e9ff2e721 +a810cd473832b6581c36ec4cb403f2849357ba2d0b54df98ef3004b8a530c078032922a81d40158f5fb0043d56477f6e +a247b45dd85ca7fbb718b328f30a03f03c84aef2c583fbdc9fcc9eb8b52b34529e8c8f535505c10598b1b4dac3d7c647 +96ee0b91313c68bac4aa9e065ce9e1d77e51ca4cff31d6a438718c58264dee87674bd97fc5c6b8008be709521e4fd008 +837567ad073e42266951a9a54750919280a2ac835a73c158407c3a2b1904cf0d17b7195a393c71a18ad029cbd9cf79ee +a6a469c44b67ebf02196213e7a63ad0423aab9a6e54acc6fcbdbb915bc043586993454dc3cd9e4be8f27d67c1050879b +8712d380a843b08b7b294f1f06e2f11f4ad6bcc655fdde86a4d8bc739c23916f6fad2b902fe47d6212f03607907e9f0e +920adfb644b534789943cdae1bdd6e42828dda1696a440af2f54e6b97f4f97470a1c6ea9fa6a2705d8f04911d055acd1 +a161c73adf584a0061e963b062f59d90faac65c9b3a936b837a10d817f02fcabfa748824607be45a183dd40f991fe83f +874f4ecd408c76e625ea50bc59c53c2d930ee25baf4b4eca2440bfbffb3b8bc294db579caa7c68629f4d9ec24187c1ba +8bff18087f112be7f4aa654e85c71fef70eee8ae480f61d0383ff6f5ab1a0508f966183bb3fc4d6f29cb7ca234aa50d3 +b03b46a3ca3bc743a173cbc008f92ab1aedd7466b35a6d1ca11e894b9482ea9dc75f8d6db2ddd1add99bfbe7657518b7 +8b4f3691403c3a8ad9e097f02d130769628feddfa8c2b3dfe8cff64e2bed7d6e5d192c1e2ba0ac348b8585e94acd5fa1 +a0d9ca4a212301f97591bf65d5ef2b2664766b427c9dd342e23cb468426e6a56be66b1cb41fea1889ac5d11a8e3c50a5 +8c93ed74188ca23b3df29e5396974b9cc135c91fdefdea6c0df694c8116410e93509559af55533a3776ac11b228d69b1 +82dd331fb3f9e344ebdeeb557769b86a2cc8cc38f6c298d7572a33aea87c261afa9dbd898989139b9fc16bc1e880a099 +a65faedf326bcfd8ef98a51410c78b021d39206704e8291cd1f09e096a66b9b0486be65ff185ca224c45918ac337ddeb +a188b37d363ac072a766fd5d6fa27df07363feff1342217b19e3c37385e42ffde55e4be8355aceaa2f267b6d66b4ac41 +810fa3ba3e96d843e3bafd3f2995727f223d3567c8ba77d684c993ba1773c66551eb5009897c51b3fe9b37196984f5ec +87631537541852da323b4353af45a164f68b304d24c01183bf271782e11687f3fcf528394e1566c2a26cb527b3148e64 +b721cb2b37b3c477a48e3cc0044167d51ff568a5fd2fb606e5aec7a267000f1ddc07d3db919926ae12761a8e017c767c +904dfad4ba2cc1f6e60d1b708438a70b1743b400164cd981f13c064b8328d5973987d4fb9cf894068f29d3deaf624dfb +a70491538893552c20939fae6be2f07bfa84d97e2534a6bbcc0f1729246b831103505e9f60e97a8fa7d2e6c1c2384579 +8726cf1b26b41f443ff7485adcfddc39ace2e62f4d65dd0bb927d933e262b66f1a9b367ded5fbdd6f3b0932553ac1735 +ae8a11cfdf7aa54c08f80cb645e3339187ab3886babe9fae5239ba507bb3dd1c0d161ca474a2df081dcd3d63e8fe445e +92328719e97ce60e56110f30a00ac5d9c7a2baaf5f8d22355d53c1c77941e3a1fec7d1405e6fbf8959665fe2ba7a8cad +8d9d6255b65798d0018a8cccb0b6343efd41dc14ff2058d3eed9451ceaad681e4a0fa6af67b0a04318aa628024e5553d +b70209090055459296006742d946a513f0cba6d83a05249ee8e7a51052b29c0ca9722dc4af5f9816a1b7938a5dac7f79 +aab7b766b9bf91786dfa801fcef6d575dc6f12b77ecc662eb4498f0312e54d0de9ea820e61508fc8aeee5ab5db529349 +a8104b462337748b7f086a135d0c3f87f8e51b7165ca6611264b8fb639d9a2f519926cb311fa2055b5fadf03da70c678 +b0d2460747d5d8b30fc6c6bd0a87cb343ddb05d90a51b465e8f67d499cfc5e3a9e365da05ae233bbee792cdf90ec67d5 +aa55f5bf3815266b4a149f85ed18e451c93de9163575e3ec75dd610381cc0805bb0a4d7c4af5b1f94d10231255436d2c +8d4c6a1944ff94426151909eb5b99cfd92167b967dabe2bf3aa66bb3c26c449c13097de881b2cfc1bf052862c1ef7b03 +8862296162451b9b6b77f03bf32e6df71325e8d7485cf3335d66fd48b74c2a8334c241db8263033724f26269ad95b395 +901aa96deb26cda5d9321190ae6624d357a41729d72ef1abfd71bebf6139af6d690798daba53b7bc5923462115ff748a +96c195ec4992728a1eb38cdde42d89a7bce150db43adbc9e61e279ea839e538deec71326b618dd39c50d589f78fc0614 +b6ff8b8aa0837b99a1a8b46fb37f20ad4aecc6a98381b1308697829a59b8442ffc748637a88cb30c9b1f0f28a926c4f6 +8d807e3dca9e7bef277db1d2cfb372408dd587364e8048b304eff00eacde2c723bfc84be9b98553f83cba5c7b3cba248 +8800c96adb0195c4fc5b24511450dee503c32bf47044f5e2e25bd6651f514d79a2dd9b01cd8c09f3c9d3859338490f57 +89fe366096097e38ec28dd1148887112efa5306cc0c3da09562aafa56f4eb000bf46ff79bf0bdd270cbde6bf0e1c8957 +af409a90c2776e1e7e3760b2042507b8709e943424606e31e791d42f17873a2710797f5baaab4cc4a19998ef648556b0 +8d761863c9b6edbd232d35ab853d944f5c950c2b643f84a1a1327ebb947290800710ff01dcfa26dc8e9828481240e8b1 +90b95e9be1e55c463ed857c4e0617d6dc3674e99b6aa62ed33c8e79d6dfcf7d122f4f4cc2ee3e7c5a49170cb617d2e2e +b3ff381efefabc4db38cc4727432e0301949ae4f16f8d1dea9b4f4de611cf5a36d84290a0bef160dac4e1955e516b3b0 +a8a84564b56a9003adcadb3565dc512239fc79572762cda7b5901a255bc82656bb9c01212ad33d6bef4fbbce18dacc87 +90a081890364b222eef54bf0075417f85e340d2fec8b7375995f598aeb33f26b44143ebf56fca7d8b4ebb36b5747b0eb +ade6ee49e1293224ddf2d8ab7f14bb5be6bc6284f60fd5b3a1e0cf147b73cff57cf19763b8a36c5083badc79c606b103 +b2fa99806dd2fa3de09320b615a2570c416c9bcdb052e592b0aead748bbe407ec9475a3d932ae48b71c2627eb81986a6 +91f3b7b73c8ccc9392542711c45fe6f236057e6efad587d661ad5cb4d6e88265f86b807bb1151736b1009ab74fd7acb4 +8800e2a46af96696dfbdcbf2ca2918b3dcf28ad970170d2d1783b52b8d945a9167d052beeb55f56c126da7ffa7059baa +9862267a1311c385956b977c9aa08548c28d758d7ba82d43dbc3d0a0fd1b7a221d39e8399997fea9014ac509ff510ac4 +b7d24f78886fd3e2d283e18d9ad5a25c1a904e7d9b9104bf47da469d74f34162e27e531380dbbe0a9d051e6ffd51d6e7 +b0f445f9d143e28b9df36b0f2c052da87ee2ca374d9d0fbe2eff66ca6fe5fe0d2c1951b428d58f7314b7e74e45d445ea +b63fc4083eabb8437dafeb6a904120691dcb53ce2938b820bb553da0e1eecd476f72495aacb72600cf9cad18698fd3db +b9ffd8108eaebd582d665f8690fe8bb207fd85185e6dd9f0b355a09bac1bbff26e0fdb172bc0498df025414e88fe2eda +967ed453e1f1a4c5b7b6834cc9f75c13f6889edc0cc91dc445727e9f408487bbf05c337103f61397a10011dfbe25d61d +98ceb673aff36e1987d5521a3984a07079c3c6155974bb8b413e8ae1ce84095fe4f7862fba7aefa14753eb26f2a5805f +85f01d28603a8fdf6ce6a50cb5c44f8a36b95b91302e3f4cd95c108ce8f4d212e73aec1b8d936520d9226802a2bd9136 +88118e9703200ca07910345fbb789e7a8f92bd80bbc79f0a9e040e8767d33df39f6eded403a9b636eabf9101e588482a +90833a51eef1b10ed74e8f9bbd6197e29c5292e469c854eed10b0da663e2bceb92539710b1858bbb21887bd538d28d89 +b513b905ec19191167c6193067b5cfdf5a3d3828375360df1c7e2ced5815437dfd37f0c4c8f009d7fb29ff3c8793f560 +b1b6d405d2d18f9554b8a358cc7e2d78a3b34269737d561992c8de83392ac9a2857be4bf15de5a6c74e0c9d0f31f393c +b828bd3e452b797323b798186607849f85d1fb20c616833c0619360dfd6b3e3aa000fd09dafe4b62d74abc41072ff1a9 +8efde67d0cca56bb2c464731879c9ac46a52e75bac702a63200a5e192b4f81c641f855ca6747752b84fe469cb7113b6c +b2762ba1c89ac3c9a983c242e4d1c2610ff0528585ed5c0dfc8a2c0253551142af9b59f43158e8915a1da7cc26b9df67 +8a3f1157fb820d1497ef6b25cd70b7e16bb8b961b0063ad340d82a79ee76eb2359ca9e15e6d42987ed7f154f5eeaa2da +a75e29f29d38f09c879f971c11beb5368affa084313474a5ecafa2896180b9e47ea1995c2733ec46f421e395a1d9cffe +8e8c3dd3e7196ef0b4996b531ec79e4a1f211db5d5635e48ceb80ff7568b2ff587e845f97ee703bb23a60945ad64314a +8e7f32f4a3e3c584af5e3d406924a0aa34024c42eca74ef6cc2a358fd3c9efaf25f1c03aa1e66bb94b023a2ee2a1cace +ab7dce05d59c10a84feb524fcb62478906b3fa045135b23afbede3bb32e0c678d8ebe59feabccb5c8f3550ea76cae44b +b38bb4b44d827f6fd3bd34e31f9186c59e312dbfadd4a7a88e588da10146a78b1f8716c91ad8b806beb8da65cab80c4c +9490ce9442bbbd05438c7f5c4dea789f74a7e92b1886a730544b55ba377840740a3ae4f2f146ee73f47c9278b0e233bc +83c003fab22a7178eed1a668e0f65d4fe38ef3900044e9ec63070c23f2827d36a1e73e5c2b883ec6a2afe2450171b3b3 +9982f02405978ddc4fca9063ebbdb152f524c84e79398955e66fe51bc7c1660ec1afc3a86ec49f58d7b7dde03505731c +ab337bd83ccdd2322088ffa8d005f450ced6b35790f37ab4534313315ee84312adc25e99cce052863a8bedee991729ed +8312ce4bec94366d88f16127a17419ef64285cd5bf9e5eda010319b48085966ed1252ed2f5a9fd3e0259b91bb65f1827 +a60d5a6327c4041b0c00a1aa2f0af056520f83c9ce9d9ccd03a0bd4d9e6a1511f26a422ea86bd858a1f77438adf07e6c +b84a0a0b030bdad83cf5202aa9afe58c9820e52483ab41f835f8c582c129ee3f34aa096d11c1cd922eda02ea1196a882 +8077d105317f4a8a8f1aadeb05e0722bb55f11abcb490c36c0904401107eb3372875b0ac233144829e734f0c538d8c1d +9202503bd29a6ec198823a1e4e098f9cfe359ed51eb5174d1ca41368821bfeebcbd49debfd02952c41359d1c7c06d2b1 +abc28c155e09365cb77ffead8dc8f602335ef93b2f44e4ef767ce8fc8ef9dd707400f3a722e92776c2e0b40192c06354 +b0f6d1442533ca45c9399e0a63a11f85ff288d242cea6cb3b68c02e77bd7d158047cae2d25b3bcd9606f8f66d9b32855 +b01c3d56a0db84dc94575f4b6ee2de4beca3230e86bed63e2066beb22768b0a8efb08ebaf8ac3dedb5fe46708b084807 +8c8634b0432159f66feaabb165842d1c8ac378f79565b1b90c381aa8450eb4231c3dad11ec9317b9fc2b155c3a771e32 +8e67f623d69ecd430c9ee0888520b6038f13a2b6140525b056dc0951f0cfed2822e62cf11d952a483107c5c5acac4826 +9590bb1cba816dd6acd5ac5fba5142c0a19d53573e422c74005e0bcf34993a8138c83124cad35a3df65879dba6134edd +801cd96cde0749021a253027118d3ea135f3fcdbe895db08a6c145641f95ebd368dd6a1568d995e1d0084146aebe224a +848b5d196427f6fc1f762ee3d36e832b64a76ec1033cfedc8b985dea93932a7892b8ef1035c653fb9dcd9ab2d9a44ac8 +a1017eb83d5c4e2477e7bd2241b2b98c4951a3b391081cae7d75965cadc1acaec755cf350f1f3d29741b0828e36fedea +8d6d2785e30f3c29aad17bd677914a752f831e96d46caf54446d967cb2432be2c849e26f0d193a60bee161ea5c6fe90a +935c0ba4290d4595428e034b5c8001cbd400040d89ab00861108e8f8f4af4258e41f34a7e6b93b04bc253d3b9ffc13bf +aac02257146246998477921cef2e9892228590d323b839f3e64ea893b991b463bc2f47e1e5092ddb47e70b2f5bce7622 +b921fde9412970a5d4c9a908ae8ce65861d06c7679af577cf0ad0d5344c421166986bee471fd6a6cecb7d591f06ec985 +8ef4c37487b139d6756003060600bb6ebac7ea810b9c4364fc978e842f13ac196d1264fbe5af60d76ff6d9203d8e7d3f +94b65e14022b5cf6a9b95f94be5ace2711957c96f4211c3f7bb36206bd39cfbd0ea82186cab5ad0577a23214a5c86e9e +a31c166d2a2ca1d5a75a5920fef7532681f62191a50d8555fdaa63ba4581c3391cc94a536fc09aac89f64eafceec3f90 +919a8cc128de01e9e10f5d83b08b52293fdd41bde2b5ae070f3d95842d4a16e5331cf2f3d61c765570c8022403610fa4 +b23d6f8331eef100152d60483cfa14232a85ee712c8538c9b6417a5a7c5b353c2ac401390c6c215cb101f5cee6b5f43e +ab357160c08a18319510a571eafff154298ce1020de8e1dc6138a09fcb0fcbcdd8359f7e9386bda00b7b9cdea745ffdc +ab55079aea34afa5c0bd1124b9cdfe01f325b402fdfa017301bf87812eaa811ea5798c3aaf818074d420d1c782b10ada +ade616010dc5009e7fc4f8d8b00dc716686a5fa0a7816ad9e503e15839d3b909b69d9dd929b7575376434ffec0d2bea8 +863997b97ed46898a8a014599508fa3079f414b1f4a0c4fdc6d74ae8b444afa350f327f8bfc2a85d27f9e2d049c50135 +8d602ff596334efd4925549ed95f2aa762b0629189f0df6dbb162581657cf3ea6863cd2287b4d9c8ad52813d87fcd235 +b70f68c596dcdeed92ad5c6c348578b26862a51eb5364237b1221e840c47a8702f0fbc56eb520a22c0eed99795d3903e +9628088f8e0853cefadee305a8bf47fa990c50fa96a82511bbe6e5dc81ef4b794e7918a109070f92fc8384d77ace226f +97e26a46e068b605ce96007197ecd943c9a23881862f4797a12a3e96ba2b8d07806ad9e2a0646796b1889c6b7d75188c +b1edf467c068cc163e2d6413cc22b16751e78b3312fe47b7ea82b08a1206d64415b2c8f2a677fa89171e82cc49797150 +a44d15ef18745b251429703e3cab188420e2d974de07251501799b016617f9630643fcd06f895634d8ecdd579e1bf000 +abd126df3917ba48c618ee4dbdf87df506193462f792874439043fa1b844466f6f4e0ff2e42516e63b5b23c0892b2695 +a2a67f57c4aa3c2aa1eeddbfd5009a89c26c2ce8fa3c96a64626aba19514beb125f27df8559506f737de3eae0f1fc18f +a633e0132197e6038197304b296ab171f1d8e0d0f34dcf66fe9146ac385b0239232a8470b9205a4802ab432389f4836d +a914b3a28509a906c3821463b936455d58ff45dcbe158922f9efb2037f2eb0ce8e92532d29b5d5a3fcd0d23fa773f272 +a0e1412ce4505daf1a2e59ce4f0fc0e0023e335b50d2b204422f57cd65744cc7a8ed35d5ef131a42c70b27111d3115b7 +a2339e2f2b6072e88816224fdd612c04d64e7967a492b9f8829db15367f565745325d361fd0607b0def1be384d010d9e +a7309fc41203cb99382e8193a1dcf03ac190a7ce04835304eb7e341d78634e83ea47cb15b885601956736d04cdfcaa01 +81f3ccd6c7f5b39e4e873365f8c37b214e8ab122d04a606fbb7339dc3298c427e922ec7418002561d4106505b5c399ee +92c121cf914ca549130e352eb297872a63200e99b148d88fbc9506ad882bec9d0203d65f280fb5b0ba92e336b7f932e8 +a4b330cf3f064f5b131578626ad7043ce2a433b6f175feb0b52d36134a454ca219373fd30d5e5796410e005b69082e47 +86fe5774112403ad83f9c55d58317eeb17ad8e1176d9f2f69c2afb7ed83bc718ed4e0245ceab4b377f5f062dcd4c00e7 +809d152a7e2654c7fd175b57f7928365a521be92e1ed06c05188a95864ddb25f7cab4c71db7d61bbf4cae46f3a1d96ce +b82d663e55c2a5ada7e169e9b1a87bc1c0177baf1ec1c96559b4cb1c5214ce1ddf2ab8d345014cab6402f3774235cf5a +86580af86df1bd2c385adb8f9a079e925981b7184db66fc5fe5b14cddb82e7d836b06eaeef14924ac529487b23dae111 +b5f5f4c5c94944ecc804df6ab8687d64e27d988cbfeae1ba7394e0f6adbf778c5881ead7cd8082dd7d68542b9bb4ecd5 +a6016916146c2685c46e8fdd24186394e2d5496e77e08c0c6a709d4cd7dfa97f1efcef94922b89196819076a91ad37b5 +b778e7367ded3b6eab53d5fc257f7a87e8faf74a593900f2f517220add2125be3f6142022660d8181df8d164ad9441ce +8581b2d36abe6f553add4d24be761bec1b8efaa2929519114346615380b3c55b59e6ad86990e312f7e234d0203bdf59b +9917e74fd45c3f71a829ff5498a7f6b5599b48c098dda2339bf04352bfc7f368ccf1a407f5835901240e76452ae807d7 +afd196ce6f9335069138fd2e3d133134da253978b4ce373152c0f26affe77a336505787594022e610f8feb722f7cc1fb +a477491a1562e329764645e8f24d8e228e5ef28c9f74c6b5b3abc4b6a562c15ffb0f680d372aed04d9e1bf944dece7be +9767440d58c57d3077319d3a330e5322b9ba16981ec74a5a14d53462eab59ae7fd2b14025bfc63b268862094acb444e6 +80986d921be3513ef69264423f351a61cb48390c1be8673aee0f089076086aaebea7ebe268fd0aa7182695606116f679 +a9554c5c921c07b450ee04e34ec58e054ac1541b26ce2ce5a393367a97348ba0089f53db6660ad76b60278b66fd12e3e +95097e7d2999b3e84bf052c775581cf361325325f4a50192521d8f4693c830bed667d88f482dc1e3f833aa2bd22d2cbf +9014c91d0f85aefd28436b5228c12f6353c055a9326c7efbf5e071e089e2ee7c070fcbc84c5fafc336cbb8fa6fec1ca1 +90f57ba36ee1066b55d37384942d8b57ae00f3cf9a3c1d6a3dfee1d1af42d4b5fa9baeb0cd7e46687d1d6d090ddb931d +8e4b1db12fd760a17214c9e47f1fce6e43c0dbb4589a827a13ac61aaae93759345697bb438a00edab92e0b7b62414683 +8022a959a513cdc0e9c705e0fc04eafd05ff37c867ae0f31f6d01cddd5df86138a426cab2ff0ac8ff03a62e20f7e8f51 +914e9a38829834c7360443b8ed86137e6f936389488eccf05b4b4db7c9425611705076ecb3f27105d24b85c852be7511 +957fb10783e2bd0db1ba66b18e794df710bc3b2b05776be146fa5863c15b1ebdd39747b1a95d9564e1772cdfc4f37b8a +b6307028444daed8ed785ac9d0de76bc3fe23ff2cc7e48102553613bbfb5afe0ebe45e4212a27021c8eb870721e62a1f +8f76143597777d940b15a01b39c5e1b045464d146d9a30a6abe8b5d3907250e6c7f858ff2308f8591e8b0a7b3f3c568a +96163138ac0ce5fd00ae9a289648fd9300a0ca0f63a88481d703ecd281c06a52a3b5178e849e331f9c85ca4ba398f4cc +a63ef47c3e18245b0482596a09f488a716df3cbd0f9e5cfabed0d742843e65db8961c556f45f49762f3a6ac8b627b3ef +8cb595466552e7c4d42909f232d4063e0a663a8ef6f6c9b7ce3a0542b2459cde04e0e54c7623d404acb5b82775ac04f6 +b47fe69960eb45f399368807cff16d941a5a4ebad1f5ec46e3dc8a2e4d598a7e6114d8f0ca791e9720fd786070524e2b +89eb5ff83eea9df490e5beca1a1fbbbbcf7184a37e2c8c91ede7a1e654c81e8cd41eceece4042ea7918a4f4646b67fd6 +a84f5d155ed08b9054eecb15f689ba81e44589e6e7207a99790c598962837ca99ec12344105b16641ca91165672f7153 +a6cc8f25c2d5b2d2f220ec359e6a37a52b95fa6af6e173c65e7cd55299eff4aa9e6d9e6f2769e6459313f1f2aecb0fab +afcde944411f017a9f7979755294981e941cc41f03df5e10522ef7c7505e5f1babdd67b3bf5258e8623150062eb41d9b +8fab39f39c0f40182fcd996ade2012643fe7731808afbc53f9b26900b4d4d1f0f5312d9d40b3df8baa4739970a49c732 +ae193af9726da0ebe7df1f9ee1c4846a5b2a7621403baf8e66c66b60f523e719c30c6b4f897bb14b27d3ff3da8392eeb +8ac5adb82d852eba255764029f42e6da92dcdd0e224d387d1ef94174038db9709ac558d90d7e7c57ad4ce7f89bbfc38c +a2066b3458fdf678ee487a55dd5bfb74fde03b54620cb0e25412a89ee28ad0d685e309a51e3e4694be2fa6f1593a344c +88d031745dd0ae07d61a15b594be5d4b2e2a29e715d081649ad63605e3404b0c3a5353f0fd9fad9c05c18e93ce674fa1 +8283cfb0ef743a043f2b77ecaeba3005e2ca50435585b5dd24777ee6bce12332f85e21b446b536da38508807f0f07563 +b376de22d5f6b0af0b59f7d9764561f4244cf8ffe22890ecd3dcf2ff1832130c9b821e068c9d8773136f4796721e5963 +ae3afc50c764f406353965363840bf28ee85e7064eb9d5f0bb3c31c64ab10f48c853e942ee2c9b51bae59651eaa08c2f +948b204d103917461a01a6c57a88f2d66b476eae5b00be20ec8c747650e864bc8a83aee0aff59cb7584b7a3387e0ee48 +81ab098a082b07f896c5ffd1e4446cb7fb44804cbbf38d125208b233fc82f8ec9a6a8d8dd1c9a1162dc28ffeec0dde50 +a149c6f1312821ced2969268789a3151bdda213451760b397139a028da609c4134ac083169feb0ee423a0acafd10eceb +b0ac9e27a5dadaf523010f730b28f0ebac01f460d3bbbe277dc9d44218abb5686f4fac89ae462682fef9edbba663520a +8d0e0073cca273daaaa61b6fc54bfe5a009bc3e20ae820f6c93ba77b19eca517d457e948a2de5e77678e4241807157cb +ad61d3a2edf7c7533a04964b97499503fd8374ca64286dba80465e68fe932e96749b476f458c6fc57cb1a7ca85764d11 +90eb5e121ae46bc01a30881eaa556f46bd8457a4e80787cf634aab355082de34ac57d7f497446468225f7721e68e2a47 +8cdac557de7c42d1f3780e33dec1b81889f6352279be81c65566cdd4952d4c15d79e656cbd46035ab090b385e90245ef +82b67e61b88b84f4f4d4f65df37b3e3dcf8ec91ea1b5c008fdccd52da643adbe6468a1cfdb999e87d195afe2883a3b46 +8503b467e8f5d6048a4a9b78496c58493a462852cab54a70594ae3fd064cfd0deb4b8f336a262155d9fedcaa67d2f6fd +8db56c5ac763a57b6ce6832930c57117058e3e5a81532b7d19346346205e2ec614eb1a2ee836ef621de50a7bc9b7f040 +ad344699198f3c6e8c0a3470f92aaffc805b76266734414c298e10b5b3797ca53578de7ccb2f458f5e0448203f55282b +80602032c43c9e2a09154cc88b83238343b7a139f566d64cb482d87436b288a98f1ea244fd3bff8da3c398686a900c14 +a6385bd50ecd548cfb37174cdbb89e10025b5cadaf3cff164c95d7aef5a33e3d6a9bf0c681b9e11db9ef54ebeee2a0c1 +abf2d95f4aa34b0581eb9257a0cc8462b2213941a5deb8ba014283293e8b36613951b61261cc67bbd09526a54cbbff76 +a3d5de52f48df72c289ff713e445991f142390798cd42bd9d9dbefaee4af4f5faf09042d126b975cf6b98711c3072553 +8e627302ff3d686cff8872a1b7c2a57b35f45bf2fc9aa42b049d8b4d6996a662b8e7cbac6597f0cb79b0cc4e29fbf133 +8510702e101b39a1efbf4e504e6123540c34b5689645e70d0bac1ecc1baf47d86c05cef6c4317a4e99b4edaeb53f2d00 +aa173f0ecbcc6088f878f8726d317748c81ebf501bba461f163b55d66099b191ec7c55f7702f351a9c8eb42cfa3280e2 +b560a697eafab695bcef1416648a0a664a71e311ecbe5823ae903bd0ed2057b9d7574b9a86d3fe22aa3e6ddce38ea513 +8df6304a3d9cf40100f3f687575419c998cd77e5cc27d579cf4f8e98642de3609af384a0337d145dd7c5635172d26a71 +8105c7f3e4d30a29151849673853b457c1885c186c132d0a98e63096c3774bc9deb956cf957367e633d0913680bda307 +95373fc22c0917c3c2044ac688c4f29a63ed858a45c0d6d2d0fe97afd6f532dcb648670594290c1c89010ecc69259bef +8c2fae9bcadab341f49b55230310df93cac46be42d4caa0d42e45104148a91e527af1b4209c0d972448162aed28fab64 +b05a77baab70683f76209626eaefdda2d36a0b66c780a20142d23c55bd479ddd4ad95b24579384b6cf62c8eb4c92d021 +8e6bc6a7ea2755b4aaa19c1c1dee93811fcde514f03485fdc3252f0ab7f032c315614f6336e57cea25dcfb8fb6084eeb +b656a27d06aade55eadae2ad2a1059198918ea6cc3fd22c0ed881294d34d5ac7b5e4700cc24350e27d76646263b223aa +a296469f24f6f56da92d713afcd4dd606e7da1f79dc4e434593c53695847eefc81c7c446486c4b3b8c8d00c90c166f14 +87a326f57713ac2c9dffeb3af44b9f3c613a8f952676fc46343299122b47ee0f8d792abaa4b5db6451ced5dd153aabd0 +b689e554ba9293b9c1f6344a3c8fcb6951d9f9eac4a2e2df13de021aade7c186be27500e81388e5b8bcab4c80f220a31 +87ae0aa0aa48eac53d1ca5a7b93917de12db9e40ceabf8fdb40884ae771cfdf095411deef7c9f821af0b7070454a2608 +a71ffa7eae8ace94e6c3581d4cb2ad25d48cbd27edc9ec45baa2c8eb932a4773c3272b2ffaf077b40f76942a1f3af7f2 +94c218c91a9b73da6b7a495b3728f3028df8ad9133312fc0c03e8c5253b7ccb83ed14688fd4602e2fd41f29a0bc698bd +ae1e77b90ca33728af07a4c03fb2ef71cd92e2618e7bf8ed4d785ce90097fc4866c29999eb84a6cf1819d75285a03af2 +b7a5945b277dab9993cf761e838b0ac6eaa903d7111fca79f9fde3d4285af7a89bf6634a71909d095d7619d913972c9c +8c43b37be02f39b22029b20aca31bff661abce4471dca88aa3bddefd9c92304a088b2dfc8c4795acc301ca3160656af2 +b32e5d0fba024554bd5fe8a793ebe8003335ddd7f585876df2048dcf759a01285fecb53daae4950ba57f3a282a4d8495 +85ea7fd5e10c7b659df5289b2978b2c89e244f269e061b9a15fcab7983fc1962b63546e82d5731c97ec74b6804be63ef +96b89f39181141a7e32986ac02d7586088c5a9662cec39843f397f3178714d02f929af70630c12cbaba0268f8ba2d4fa +929ab1a2a009b1eb37a2817c89696a06426529ebe3f306c586ab717bd34c35a53eca2d7ddcdef36117872db660024af9 +a696dccf439e9ca41511e16bf3042d7ec0e2f86c099e4fc8879d778a5ea79e33aa7ce96b23dc4332b7ba26859d8e674d +a8fe69a678f9a194b8670a41e941f0460f6e2dbc60470ab4d6ae2679cc9c6ce2c3a39df2303bee486dbfde6844e6b31a +95f58f5c82de2f2a927ca99bf63c9fc02e9030c7e46d0bf6b67fe83a448d0ae1c99541b59caf0e1ccab8326231af09a5 +a57badb2c56ca2c45953bd569caf22968f76ed46b9bac389163d6fe22a715c83d5e94ae8759b0e6e8c2f27bff7748f3f +868726fd49963b24acb5333364dffea147e98f33aa19c7919dc9aca0fd26661cfaded74ede7418a5fadbe7f5ae67b67b +a8d8550dcc64d9f1dd7bcdab236c4122f2b65ea404bb483256d712c7518f08bb028ff8801f1da6aed6cbfc5c7062e33b +97e25a87dae23155809476232178538d4bc05d4ff0882916eb29ae515f2a62bfce73083466cc0010ca956aca200aeacc +b4ea26be3f4bd04aa82d7c4b0913b97bcdf5e88b76c57eb1a336cbd0a3eb29de751e1bc47c0e8258adec3f17426d0c71 +99ee555a4d9b3cf2eb420b2af8e3bc99046880536116d0ce7193464ac40685ef14e0e3c442f604e32f8338cb0ef92558 +8c64efa1da63cd08f319103c5c7a761221080e74227bbc58b8fb35d08aa42078810d7af3e60446cbaff160c319535648 +8d9fd88040076c28420e3395cbdfea402e4077a3808a97b7939d49ecbcf1418fe50a0460e1c1b22ac3f6e7771d65169a +ae3c19882d7a9875d439265a0c7003c8d410367627d21575a864b9cb4918de7dbdb58a364af40c5e045f3df40f95d337 +b4f7bfacab7b2cafe393f1322d6dcc6f21ffe69cd31edc8db18c06f1a2b512c27bd0618091fd207ba8df1808e9d45914 +94f134acd0007c623fb7934bcb65ef853313eb283a889a3ffa79a37a5c8f3665f3d5b4876bc66223610c21dc9b919d37 +aa15f74051171daacdc1f1093d3f8e2d13da2833624b80a934afec86fc02208b8f55d24b7d66076444e7633f46375c6a +a32d6bb47ef9c836d9d2371807bafbbbbb1ae719530c19d6013f1d1f813c49a60e4fa51d83693586cba3a840b23c0404 +b61b3599145ea8680011aa2366dc511a358b7d67672d5b0c5be6db03b0efb8ca5a8294cf220ea7409621f1664e00e631 +859cafc3ee90b7ececa1ed8ef2b2fc17567126ff10ca712d5ffdd16aa411a5a7d8d32c9cab1fbf63e87dce1c6e2f5f53 +a2fef1b0b2874387010e9ae425f3a9676d01a095d017493648bcdf3b31304b087ccddb5cf76abc4e1548b88919663b6b +939e18c73befc1ba2932a65ede34c70e4b91e74cc2129d57ace43ed2b3af2a9cc22a40fbf50d79a63681b6d98852866d +b3b4259d37b1b14aee5b676c9a0dd2d7f679ab95c120cb5f09f9fbf10b0a920cb613655ddb7b9e2ba5af4a221f31303c +997255fe51aaca6e5a9cb3359bcbf25b2bb9e30649bbd53a8a7c556df07e441c4e27328b38934f09c09d9500b5fabf66 +abb91be2a2d860fd662ed4f1c6edeefd4da8dc10e79251cf87f06029906e7f0be9b486462718f0525d5e049472692cb7 +b2398e593bf340a15f7801e1d1fbda69d93f2a32a889ec7c6ae5e8a37567ac3e5227213c1392ee86cfb3b56ec2787839 +8ddf10ccdd72922bed36829a36073a460c2118fc7a56ff9c1ac72581c799b15c762cb56cb78e3d118bb9f6a7e56cb25e +93e6bc0a4708d16387cacd44cf59363b994dc67d7ada7b6d6dbd831c606d975247541b42b2a309f814c1bfe205681fc6 +b93fc35c05998cffda2978e12e75812122831523041f10d52f810d34ff71944979054b04de0117e81ddf5b0b4b3e13c0 +92221631c44d60d68c6bc7b287509f37ee44cbe5fdb6935cee36b58b17c7325098f98f7910d2c3ca5dc885ad1d6dabc7 +a230124424a57fad3b1671f404a94d7c05f4c67b7a8fbacfccea28887b78d7c1ed40b92a58348e4d61328891cd2f6cee +a6a230edb8518a0f49d7231bc3e0bceb5c2ac427f045819f8584ba6f3ae3d63ed107a9a62aad543d7e1fcf1f20605706 +845be1fe94223c7f1f97d74c49d682472585d8f772762baad8a9d341d9c3015534cc83d102113c51a9dea2ab10d8d27b +b44262515e34f2db597c8128c7614d33858740310a49cdbdf9c8677c5343884b42c1292759f55b8b4abc4c86e4728033 +805592e4a3cd07c1844bc23783408310accfdb769cca882ad4d07d608e590a288b7370c2cb327f5336e72b7083a0e30f +95153e8b1140df34ee864f4ca601cb873cdd3efa634af0c4093fbaede36f51b55571ab271e6a133020cd34db8411241f +82878c1285cfa5ea1d32175c9401f3cc99f6bb224d622d3fd98cc7b0a27372f13f7ab463ce3a33ec96f9be38dbe2dfe3 +b7588748f55783077c27fc47d33e20c5c0f5a53fc0ac10194c003aa09b9f055d08ec971effa4b7f760553997a56967b3 +b36b4de6d1883b6951f59cfae381581f9c6352fcfcf1524fccdab1571a20f80441d9152dc6b48bcbbf00371337ca0bd5 +89c5523f2574e1c340a955cbed9c2f7b5fbceb260cb1133160dabb7d41c2f613ec3f6e74bbfab3c4a0a6f0626dbe068f +a52f58cc39f968a9813b1a8ddc4e83f4219e4dd82c7aa1dd083bea7edf967151d635aa9597457f879771759b876774e4 +8300a67c2e2e123f89704abfde095463045dbd97e20d4c1157bab35e9e1d3d18f1f4aaba9cbe6aa2d544e92578eaa1b6 +ac6a7f2918768eb6a43df9d3a8a04f8f72ee52f2e91c064c1c7d75cad1a3e83e5aba9fe55bb94f818099ac91ccf2e961 +8d64a2b0991cf164e29835c8ddef6069993a71ec2a7de8157bbfa2e00f6367be646ed74cbaf524f0e9fe13fb09fa15fd +8b2ffe5a545f9f680b49d0a9797a4a11700a2e2e348c34a7a985fc278f0f12def6e06710f40f9d48e4b7fbb71e072229 +8ab8f71cd337fa19178924e961958653abf7a598e3f022138b55c228440a2bac4176cea3aea393549c03cd38a13eb3fc +8419d28318c19ea4a179b7abb43669fe96347426ef3ac06b158d79c0acf777a09e8e770c2fb10e14b3a0421705990b23 +8bacdac310e1e49660359d0a7a17fe3d334eb820e61ae25e84cb52f863a2f74cbe89c2e9fc3283745d93a99b79132354 +b57ace3fa2b9f6b2db60c0d861ace7d7e657c5d35d992588aeed588c6ce3a80b6f0d49f8a26607f0b17167ab21b675e4 +83e265cde477f2ecc164f49ddc7fb255bb05ff6adc347408353b7336dc3a14fdedc86d5a7fb23f36b8423248a7a67ed1 +a60ada971f9f2d79d436de5d3d045f5ab05308cae3098acaf5521115134b2a40d664828bb89895840db7f7fb499edbc5 +a63eea12efd89b62d3952bf0542a73890b104dd1d7ff360d4755ebfa148fd62de668edac9eeb20507967ea37fb220202 +a0275767a270289adc991cc4571eff205b58ad6d3e93778ddbf95b75146d82517e8921bd0d0564e5b75fa0ccdab8e624 +b9b03fd3bf07201ba3a039176a965d736b4ef7912dd9e9bf69fe1b57c330a6aa170e5521fe8be62505f3af81b41d7806 +a95f640e26fb1106ced1729d6053e41a16e4896acac54992279ff873e5a969aad1dcfa10311e28b8f409ac1dab7f03bb +b144778921742418053cb3c70516c63162c187f00db2062193bb2c14031075dbe055d020cde761b26e8c58d0ea6df2c1 +8432fbb799e0435ef428d4fefc309a05dd589bce74d7a87faf659823e8c9ed51d3e42603d878e80f439a38be4321c2fa +b08ddef14e42d4fd5d8bf39feb7485848f0060d43b51ed5bdda39c05fe154fb111d29719ee61a23c392141358c0cfcff +8ae3c5329a5e025b86b5370e06f5e61177df4bda075856fade20a17bfef79c92f54ed495f310130021ba94fb7c33632b +92b6d3c9444100b4d7391febfc1dddaa224651677c3695c47a289a40d7a96d200b83b64e6d9df51f534564f272a2c6c6 +b432bc2a3f93d28b5e506d68527f1efeb2e2570f6be0794576e2a6ef9138926fdad8dd2eabfa979b79ab7266370e86bc +8bc315eacedbcfc462ece66a29662ca3dcd451f83de5c7626ef8712c196208fb3d8a0faf80b2e80384f0dd9772f61a23 +a72375b797283f0f4266dec188678e2b2c060dfed5880fc6bb0c996b06e91a5343ea2b695adaab0a6fd183b040b46b56 +a43445036fbaa414621918d6a897d3692fdae7b2961d87e2a03741360e45ebb19fcb1703d23f1e15bb1e2babcafc56ac +b9636b2ffe305e63a1a84bd44fb402442b1799bd5272638287aa87ca548649b23ce8ce7f67be077caed6aa2dbc454b78 +99a30bf0921d854c282b83d438a79f615424f28c2f99d26a05201c93d10378ab2cd94a792b571ddae5d4e0c0013f4006 +8648e3c2f93d70b392443be116b48a863e4b75991bab5db656a4ef3c1e7f645e8d536771dfe4e8d1ceda3be8d32978b0 +ab50dc9e6924c1d2e9d2e335b2d679fc7d1a7632e84964d3bac0c9fe57e85aa5906ec2e7b0399d98ddd022e9b19b5904 +ab729328d98d295f8f3272afaf5d8345ff54d58ff9884da14f17ecbdb7371857fdf2f3ef58080054e9874cc919b46224 +83fa5da7592bd451cad3ad7702b4006332b3aae23beab4c4cb887fa6348317d234bf62a359e665b28818e5410c278a09 +8bdbff566ae9d368f114858ef1f009439b3e9f4649f73efa946e678d6c781d52c69af195df0a68170f5f191b2eac286b +91245e59b4425fd4edb2a61d0d47c1ccc83d3ced8180de34887b9655b5dcda033d48cde0bdc3b7de846d246c053a02e8 +a2cb00721e68f1cad8933947456f07144dc69653f96ceed845bd577d599521ba99cdc02421118971d56d7603ed118cbf +af8cd66d303e808b22ec57860dd909ca64c27ec2c60e26ffecfdc1179d8762ffd2739d87b43959496e9fee4108df71df +9954136812dffcd5d3f167a500e7ab339c15cfc9b3398d83f64b0daa3dd5b9a851204f424a3493b4e326d3de81e50a62 +93252254d12511955f1aa464883ad0da793f84d900fea83e1df8bca0f2f4cf5b5f9acbaec06a24160d33f908ab5fea38 +997cb55c26996586ba436a95566bd535e9c22452ca5d2a0ded2bd175376557fa895f9f4def4519241ff386a063f2e526 +a12c78ad451e0ac911260ade2927a768b50cb4125343025d43474e7f465cdc446e9f52a84609c5e7e87ae6c9b3f56cda +a789d4ca55cbba327086563831b34487d63d0980ba8cf55197c016702ed6da9b102b1f0709ce3da3c53ff925793a3d73 +a5d76acbb76741ce85be0e655b99baa04f7f587347947c0a30d27f8a49ae78cce06e1cde770a8b618d3db402be1c0c4b +873c0366668c8faddb0eb7c86f485718d65f8c4734020f1a18efd5fa123d3ea8a990977fe13592cd01d17e60809cb5ff +b659b71fe70f37573ff7c5970cc095a1dc0da3973979778f80a71a347ef25ad5746b2b9608bad4ab9a4a53a4d7df42d7 +a34cbe05888e5e5f024a2db14cb6dcdc401a9cbd13d73d3c37b348f68688f87c24ca790030b8f84fef9e74b4eab5e412 +94ce8010f85875c045b0f014db93ef5ab9f1f6842e9a5743dce9e4cb872c94affd9e77c1f1d1ab8b8660b52345d9acb9 +adefa9b27a62edc0c5b019ddd3ebf45e4de846165256cf6329331def2e088c5232456d3de470fdce3fa758bfdd387512 +a6b83821ba7c1f83cc9e4529cf4903adb93b26108e3d1f20a753070db072ad5a3689643144bdd9c5ea06bb9a7a515cd0 +a3a9ddedc2a1b183eb1d52de26718151744db6050f86f3580790c51d09226bf05f15111691926151ecdbef683baa992c +a64bac89e7686932cdc5670d07f0b50830e69bfb8c93791c87c7ffa4913f8da881a9d8a8ce8c1a9ce5b6079358c54136 +a77b5a63452cb1320b61ab6c7c2ef9cfbcade5fd4727583751fb2bf3ea330b5ca67757ec1f517bf4d503ec924fe32fbd +8746fd8d8eb99639d8cd0ca34c0d9c3230ed5a312aab1d3d925953a17973ee5aeb66e68667e93caf9cb817c868ea8f3d +88a2462a26558fc1fbd6e31aa8abdc706190a17c27fdc4217ffd2297d1b1f3321016e5c4b2384c5454d5717dc732ed03 +b78893a97e93d730c8201af2e0d3b31cb923d38dc594ffa98a714e627c473d42ea82e0c4d2eeb06862ee22a9b2c54588 +920cc8b5f1297cf215a43f6fc843e379146b4229411c44c0231f6749793d40f07b9af7699fd5d21fd69400b97febe027 +a0f0eafce1e098a6b58c7ad8945e297cd93aaf10bc55e32e2e32503f02e59fc1d5776936577d77c0b1162cb93b88518b +98480ba0064e97a2e7a6c4769b4d8c2a322cfc9a3b2ca2e67e9317e2ce04c6e1108169a20bd97692e1cb1f1423b14908 +83dbbb2fda7e287288011764a00b8357753a6a44794cc8245a2275237f11affdc38977214e463ad67aec032f3dfa37e9 +86442fff37598ce2b12015ff19b01bb8a780b40ad353d143a0f30a06f6d23afd5c2b0a1253716c855dbf445cc5dd6865 +b8a4c60c5171189414887847b9ed9501bff4e4c107240f063e2d254820d2906b69ef70406c585918c4d24f1dd052142b +919f33a98e84015b2034b57b5ffe9340220926b2c6e45f86fd79ec879dbe06a148ae68b77b73bf7d01bd638a81165617 +95c13e78d89474a47fbc0664f6f806744b75dede95a479bbf844db4a7f4c3ae410ec721cb6ffcd9fa9c323da5740d5ae +ab7151acc41fffd8ec6e90387700bcd7e1cde291ea669567295bea1b9dd3f1df2e0f31f3588cd1a1c08af8120aca4921 +80e74c5c47414bd6eeef24b6793fb1fa2d8fb397467045fcff887c52476741d5bc4ff8b6d3387cb53ad285485630537f +a296ad23995268276aa351a7764d36df3a5a3cffd7dbeddbcea6b1f77adc112629fdeffa0918b3242b3ccd5e7587e946 +813d2506a28a2b01cb60f49d6bd5e63c9b056aa56946faf2f33bd4f28a8d947569cfead3ae53166fc65285740b210f86 +924b265385e1646287d8c09f6c855b094daaee74b9e64a0dddcf9ad88c6979f8280ba30c8597b911ef58ddb6c67e9fe3 +8d531513c70c2d3566039f7ca47cd2352fd2d55b25675a65250bdb8b06c3843db7b2d29c626eed6391c238fc651cf350 +82b338181b62fdc81ceb558a6843df767b6a6e3ceedc5485664b4ea2f555904b1a45fbb35f6cf5d96f27da10df82a325 +92e62faaedea83a37f314e1d3cb4faaa200178371d917938e59ac35090be1db4b4f4e0edb78b9c991de202efe4f313d8 +99d645e1b642c2dc065bac9aaa0621bc648c9a8351efb6891559c3a41ba737bd155fb32d7731950514e3ecf4d75980e4 +b34a13968b9e414172fb5d5ece9a39cf2eb656128c3f2f6cc7a9f0c69c6bae34f555ecc8f8837dc34b5e470e29055c78 +a2a0bb7f3a0b23a2cbc6585d59f87cd7e56b2bbcb0ae48f828685edd9f7af0f5edb4c8e9718a0aaf6ef04553ba71f3b7 +8e1a94bec053ed378e524b6685152d2b52d428266f2b6eadd4bcb7c4e162ed21ab3e1364879673442ee2162635b7a4d8 +9944adaff14a85eab81c73f38f386701713b52513c4d4b838d58d4ffa1d17260a6d056b02334850ea9a31677c4b078bd +a450067c7eceb0854b3eca3db6cf38669d72cb7143c3a68787833cbca44f02c0be9bfbe082896f8a57debb13deb2afb1 +8be4ad3ac9ef02f7df09254d569939757101ee2eda8586fefcd8c847adc1efe5bdcb963a0cafa17651befaafb376a531 +90f6de91ea50255f148ac435e08cf2ac00c772a466e38155bd7e8acf9197af55662c7b5227f88589b71abe9dcf7ba343 +86e5a24f0748b106dee2d4d54e14a3b0af45a96cbee69cac811a4196403ebbee17fd24946d7e7e1b962ac7f66dbaf610 +afdd96fbcda7aa73bf9eeb2292e036c25753d249caee3b9c013009cc22e10d3ec29e2aa6ddbb21c4e949b0c0bccaa7f4 +b5a4e7436d5473647c002120a2cb436b9b28e27ad4ebdd7c5f122b91597c507d256d0cbd889d65b3a908531936e53053 +b632414c3da704d80ac2f3e5e0e9f18a3637cdc2ebeb613c29300745582427138819c4e7b0bec3099c1b8739dac1807b +a28df1464d3372ce9f37ef1db33cc010f752156afae6f76949d98cd799c0cf225c20228ae86a4da592d65f0cffe3951b +898b93d0a31f7d3f11f253cb7a102db54b669fd150da302d8354d8e02b1739a47cb9bd88015f3baf12b00b879442464e +96fb88d89a12049091070cb0048a381902965e67a8493e3991eaabe5d3b7ff7eecd5c94493a93b174df3d9b2c9511755 +b899cb2176f59a5cfba3e3d346813da7a82b03417cad6342f19cc8f12f28985b03bf031e856a4743fd7ebe16324805b0 +a60e2d31bc48e0c0579db15516718a03b73f5138f15037491f4dae336c904e312eda82d50862f4debd1622bb0e56d866 +979fc8b987b5cef7d4f4b58b53a2c278bd25a5c0ea6f41c715142ea5ff224c707de38451b0ad3aa5e749aa219256650a +b2a75bff18e1a6b9cf2a4079572e41205741979f57e7631654a3c0fcec57c876c6df44733c9da3d863db8dff392b44a3 +b7a0f0e811222c91e3df98ff7f286b750bc3b20d2083966d713a84a2281744199e664879401e77470d44e5a90f3e5181 +82b74ba21c9d147fbc338730e8f1f8a6e7fc847c3110944eb17a48bea5e06eecded84595d485506d15a3e675fd0e5e62 +a7f44eef817d5556f0d1abcf420301217d23c69dd2988f44d91ea1f1a16c322263cbacd0f190b9ba22b0f141b9267b4f +aadb68164ede84fc1cb3334b3194d84ba868d5a88e4c9a27519eef4923bc4abf81aab8114449496c073c2a6a0eb24114 +b5378605fabe9a8c12a5dc55ef2b1de7f51aedb61960735c08767a565793cea1922a603a6983dc25f7cea738d0f7c40d +a97a4a5cd8d51302e5e670aee78fe6b5723f6cc892902bbb4f131e82ca1dfd5de820731e7e3367fb0c4c1922a02196e3 +8bdfeb15c29244d4a28896f2b2cb211243cd6a1984a3f5e3b0ebe5341c419beeab3304b390a009ffb47588018034b0ea +a9af3022727f2aa2fca3b096968e97edad3f08edcbd0dbca107b892ae8f746a9c0485e0d6eb5f267999b23a845923ed0 +8e7594034feef412f055590fbb15b6322dc4c6ab7a4baef4685bd13d71a83f7d682b5781bdfa0d1c659489ce9c2b8000 +84977ca6c865ebee021c58106c1a4ad0c745949ecc5332948002fd09bd9b890524878d0c29da96fd11207621136421fe +8687551a79158e56b2375a271136756313122132a6670fa51f99a1b5c229ed8eea1655a734abae13228b3ebfd2a825dd +a0227d6708979d99edfc10f7d9d3719fd3fc68b0d815a7185b60307e4c9146ad2f9be2b8b4f242e320d4288ceeb9504c +89f75583a16735f9dd8b7782a130437805b34280ccea8dac6ecaee4b83fe96947e7b53598b06fecfffdf57ffc12cc445 +a0056c3353227f6dd9cfc8e3399aa5a8f1d71edf25d3d64c982910f50786b1e395c508d3e3727ac360e3e040c64b5298 +b070e61a6d813626144b312ded1788a6d0c7cec650a762b2f8df6e4743941dd82a2511cd956a3f141fc81e15f4e092da +b4e6db232e028a1f989bb5fc13416711f42d389f63564d60851f009dcffac01acfd54efa307aa6d4c0f932892d4e62b0 +89b5991a67db90024ddd844e5e1a03ef9b943ad54194ae0a97df775dde1addf31561874f4e40fbc37a896630f3bbda58 +ad0e8442cb8c77d891df49cdb9efcf2b0d15ac93ec9be1ad5c3b3cca1f4647b675e79c075335c1f681d56f14dc250d76 +b5d55a6ae65bb34dd8306806cb49b5ccb1c83a282ee47085cf26c4e648e19a52d9c422f65c1cd7e03ca63e926c5e92ea +b749501347e5ec07e13a79f0cb112f1b6534393458b3678a77f02ca89dca973fa7b30e55f0b25d8b92b97f6cb0120056 +94144b4a3ffc5eec6ba35ce9c245c148b39372d19a928e236a60e27d7bc227d18a8cac9983851071935d8ffb64b3a34f +92bb4f9f85bc8c028a3391306603151c6896673135f8a7aefedd27acb322c04ef5dac982fc47b455d6740023e0dd3ea3 +b9633a4a101461a782fc2aa092e9dbe4e2ad00987578f18cd7cf0021a909951d60fe79654eb7897806795f93c8ff4d1c +809f0196753024821b48a016eca5dbb449a7c55750f25981bb7a4b4c0e0846c09b8f6128137905055fc43a3f0deb4a74 +a27dc9cdd1e78737a443570194a03d89285576d3d7f3a3cf15cc55b3013e42635d4723e2e8fe1d0b274428604b630db9 +861f60f0462e04cd84924c36a28163def63e777318d00884ab8cb64c8df1df0bce5900342163edb60449296484a6c5bf +b7bc23fb4e14af4c4704a944253e760adefeca8caee0882b6bbd572c84434042236f39ae07a8f21a560f486b15d82819 +b9a6eb492d6dd448654214bd01d6dc5ff12067a11537ab82023fc16167507ee25eed2c91693912f4155d1c07ed9650b3 +97678af29c68f9a5e213bf0fb85c265303714482cfc4c2c00b4a1e8a76ed08834ee6af52357b143a1ca590fb0265ea5a +8a15b499e9eca5b6cac3070b5409e8296778222018ad8b53a5d1f6b70ad9bb10c68a015d105c941ed657bf3499299e33 +b487fefede2e8091f2c7bfe85770db2edff1db83d4effe7f7d87bff5ab1ace35e9b823a71adfec6737fede8d67b3c467 +8b51b916402aa2c437fce3bcad6dad3be8301a1a7eab9d163085b322ffb6c62abf28637636fe6114573950117fc92898 +b06a2106d031a45a494adec0881cb2f82275dff9dcdd2bc16807e76f3bec28a6734edd3d54f0be8199799a78cd6228ad +af0a185391bbe2315eb97feac98ad6dd2e5d931d012c621abd6e404a31cc188b286fef14871762190acf086482b2b5e2 +8e78ee8206506dd06eb7729e32fceda3bebd8924a64e4d8621c72e36758fda3d0001af42443851d6c0aea58562870b43 +a1ba52a569f0461aaf90b49b92be976c0e73ec4a2c884752ee52ffb62dd137770c985123d405dfb5de70692db454b54a +8d51b692fa1543c51f6b62b9acb8625ed94b746ef96c944ca02859a4133a5629da2e2ce84e111a7af8d9a5b836401c64 +a7a20d45044cf6492e0531d0b8b26ffbae6232fa05a96ed7f06bdb64c2b0f5ca7ec59d5477038096a02579e633c7a3ff +84df867b98c53c1fcd4620fef133ee18849c78d3809d6aca0fb6f50ff993a053a455993f216c42ab6090fa5356b8d564 +a7227c439f14c48e2577d5713c97a5205feb69acb0b449152842e278fa71e8046adfab468089c8b2288af1fc51fa945b +855189b3a105670779997690876dfaa512b4a25a24931a912c2f0f1936971d2882fb4d9f0b3d9daba77eaf660e9d05d5 +b5696bd6706de51c502f40385f87f43040a5abf99df705d6aac74d88c913b8ecf7a99a63d7a37d9bdf3a941b9e432ff5 +ab997beb0d6df9c98d5b49864ef0b41a2a2f407e1687dfd6089959757ba30ed02228940b0e841afe6911990c74d536c4 +b36b65f85546ebfdbe98823d5555144f96b4ab39279facd19c0de3b8919f105ba0315a0784dce4344b1bc62d8bb4a5a3 +b8371f0e4450788720ac5e0f6cd3ecc5413d33895083b2c168d961ec2b5c3de411a4cc0712481cbe8df8c2fa1a7af006 +98325d8026b810a8b7a114171ae59a57e8bbc9848e7c3df992efc523621729fd8c9f52114ce01d7730541a1ada6f1df1 +8d0e76dbd37806259486cd9a31bc8b2306c2b95452dc395546a1042d1d17863ef7a74c636b782e214d3aa0e8d717f94a +a4e15ead76da0214d702c859fb4a8accdcdad75ed08b865842bd203391ec4cba2dcc916455e685f662923b96ee0c023f +8618190972086ebb0c4c1b4a6c94421a13f378bc961cc8267a301de7390c5e73c3333864b3b7696d81148f9d4843fd02 +85369d6cc7342e1aa15b59141517d8db8baaaeb7ab9670f3ba3905353948d575923d283b7e5a05b13a30e7baf1208a86 +87c51ef42233c24a6da901f28c9a075d9ba3c625687c387ad6757b72ca6b5a8885e6902a3082da7281611728b1e45f26 +aa6348a4f71927a3106ad0ea8b02fc8d8c65531e4ab0bd0a17243e66f35afe252e40ab8eef9f13ae55a72566ffdaff5c +96a3bc976e9d03765cc3fee275fa05b4a84c94fed6b767e23ca689394501e96f56f7a97cffddc579a6abff632bf153be +97dbf96c6176379fdb2b888be4e757b2bca54e74124bd068d3fa1dbd82a011bbeb75079da38e0cd22a761fe208ecad9b +b70cf0a1d14089a4129ec4e295313863a59da8c7e26bf74cc0e704ed7f0ee4d7760090d0ddf7728180f1bf2c5ac64955 +882d664714cc0ffe53cbc9bef21f23f3649824f423c4dbad1f893d22c4687ab29583688699efc4d5101aa08b0c3e267a +80ecb7cc963e677ccaddbe3320831dd6ee41209acf4ed41b16dc4817121a3d86a1aac9c4db3d8c08a55d28257088af32 +a25ba667d832b145f9ce18c3f9b1bd00737aa36db020e1b99752c8ef7d27c6c448982bd8d352e1b6df266b8d8358a8d5 +83734841c13dee12759d40bdd209b277e743b0d08cc0dd1e0b7afd2d65bfa640400eefcf6be4a52e463e5b3d885eeac6 +848d16505b04804afc773aebabb51b36fd8aacfbb0e09b36c0d5d57df3c0a3b92f33e7d5ad0a7006ec46ebb91df42b8c +909a8d793f599e33bb9f1dc4792a507a97169c87cd5c087310bc05f30afcd247470b4b56dec59894c0fb1d48d39bb54e +8e558a8559df84a1ba8b244ece667f858095c50bb33a5381e60fcc6ba586b69693566d8819b4246a27287f16846c1dfa +84d6b69729f5aaa000cd710c2352087592cfbdf20d5e1166977e195818e593fa1a50d1e04566be23163a2523dc1612f1 +9536d262b7a42125d89f4f32b407d737ba8d9242acfc99d965913ab3e043dcac9f7072a43708553562cac4cba841df30 +9598548923ca119d6a15fd10861596601dd1dedbcccca97bb208cdc1153cf82991ea8cc17686fbaa867921065265970c +b87f2d4af6d026e4d2836bc3d390a4a18e98a6e386282ce96744603bab74974272e97ac2da281afa21885e2cbb3a8001 +991ece62bf07d1a348dd22191868372904b9f8cf065ae7aa4e44fd24a53faf6d851842e35fb472895963aa1992894918 +a8c53dea4c665b30e51d22ca6bc1bc78aaf172b0a48e64a1d4b93439b053877ec26cb5221c55efd64fa841bbf7d5aff4 +93487ec939ed8e740f15335b58617c3f917f72d07b7a369befd479ae2554d04deb240d4a14394b26192efae4d2f4f35d +a44793ab4035443f8f2968a40e043b4555960193ffa3358d22112093aadfe2c136587e4139ffd46d91ed4107f61ea5e0 +b13fe033da5f0d227c75927d3dacb06dbaf3e1322f9d5c7c009de75cdcba5e308232838785ab69a70f0bedea755e003f +970a29b075faccd0700fe60d1f726bdebf82d2cc8252f4a84543ebd3b16f91be42a75c9719a39c4096139f0f31393d58 +a4c3eb1f7160f8216fc176fb244df53008ff32f2892363d85254002e66e2de21ccfe1f3b1047589abee50f29b9d507e3 +8c552885eab04ba40922a8f0c3c38c96089c95ff1405258d3f1efe8d179e39e1295cbf67677894c607ae986e4e6b1fb0 +b3671746fa7f848c4e2ae6946894defadd815230b906b419143523cc0597bc1d6c0a4c1e09d49b66b4a2c11cde3a4de3 +937a249a95813a5e2ef428e355efd202e15a37d73e56cfb7e57ea9f943f2ce5ca8026f2f1fd25bf164ba89d07077d858 +83646bdf6053a04aa9e2f112499769e5bd5d0d10f2e13db3ca89bd45c0b3b7a2d752b7d137fb3909f9c62b78166c9339 +b4eac4b91e763666696811b7ed45e97fd78310377ebea1674b58a2250973f80492ac35110ed1240cd9bb2d17493d708c +82db43a99bc6573e9d92a3fd6635dbbb249ac66ba53099c3c0c8c8080b121dd8243cd5c6e36ba0a4d2525bae57f5c89c +a64d6a264a681b49d134c655d5fc7756127f1ee7c93d328820f32bca68869f53115c0d27fef35fe71f7bc4fdaed97348 +8739b7a9e2b4bc1831e7f04517771bc7cde683a5e74e052542517f8375a2f64e53e0d5ac925ef722327e7bb195b4d1d9 +8f337cdd29918a2493515ebb5cf702bbe8ecb23b53c6d18920cc22f519e276ca9b991d3313e2d38ae17ae8bdfa4f8b7e +b0edeab9850e193a61f138ef2739fc42ceec98f25e7e8403bfd5fa34a7bc956b9d0898250d18a69fa4625a9b3d6129da +a9920f26fe0a6d51044e623665d998745c9eca5bce12051198b88a77d728c8238f97d4196f26e43b24f8841500b998d0 +86e655d61502b979eeeeb6f9a7e1d0074f936451d0a1b0d2fa4fb3225b439a3770767b649256fe481361f481a8dbc276 +84d3b32fa62096831cc3bf013488a9f3f481dfe293ae209ed19585a03f7db8d961a7a9dd0db82bd7f62d612707575d9c +81c827826ec9346995ffccf62a241e3b2d32f7357acd1b1f8f7a7dbc97022d3eb51b8a1230e23ce0b401d2e535e8cd78 +94a1e40c151191c5b055b21e86f32e69cbc751dcbdf759a48580951834b96a1eed75914c0d19a38aefd21fb6c8d43d0c +ab890222b44bc21b71f7c75e15b6c6e16bb03371acce4f8d4353ff3b8fcd42a14026589c5ed19555a3e15e4d18bfc3a3 +accb0be851e93c6c8cc64724cdb86887eea284194b10e7a43c90528ed97e9ec71ca69c6fac13899530593756dd49eab2 +b630220aa9e1829c233331413ee28c5efe94ea8ea08d0c6bfd781955078b43a4f92915257187d8526873e6c919c6a1de +add389a4d358c585f1274b73f6c3c45b58ef8df11f9d11221f620e241bf3579fba07427b288c0c682885a700cc1fa28d +a9fe6ca8bf2961a3386e8b8dcecc29c0567b5c0b3bcf3b0f9169f88e372b80151af883871fc5229815f94f43a6f5b2b0 +ad839ae003b92b37ea431fa35998b46a0afc3f9c0dd54c3b3bf7a262467b13ff3c323ada1c1ae02ac7716528bdf39e3e +9356d3fd0edcbbb65713c0f2a214394f831b26f792124b08c5f26e7f734b8711a87b7c4623408da6a091c9aef1f6af3c +896b25b083c35ac67f0af3784a6a82435b0e27433d4d74cd6d1eafe11e6827827799490fb1c77c11de25f0d75f14e047 +8bfa019391c9627e8e5f05c213db625f0f1e51ec68816455f876c7e55b8f17a4f13e5aae9e3fb9e1cf920b1402ee2b40 +8ba3a6faa6a860a8f3ce1e884aa8769ceded86380a86520ab177ab83043d380a4f535fe13884346c5e51bee68da6ab41 +a8292d0844084e4e3bb7af92b1989f841a46640288c5b220fecfad063ee94e86e13d3d08038ec2ac82f41c96a3bfe14d +8229bb030b2fc566e11fd33c7eab7a1bb7b49fed872ea1f815004f7398cb03b85ea14e310ec19e1f23e0bdaf60f8f76c +8cfbf869ade3ec551562ff7f63c2745cc3a1f4d4dc853a0cd42dd5f6fe54228f86195ea8fe217643b32e9f513f34a545 +ac52a3c8d3270ddfe1b5630159da9290a5ccf9ccbdef43b58fc0a191a6c03b8a5974cf6e2bbc7bd98d4a40a3581482d7 +ab13decb9e2669e33a7049b8eca3ca327c40dea15ad6e0e7fa63ed506db1d258bc36ac88b35f65cae0984e937eb6575d +b5e748eb1a7a1e274ff0cc56311c198f2c076fe4b7e73e5f80396fe85358549df906584e6bb2c8195b3e2be7736850a5 +b5cb911325d8f963c41f691a60c37831c7d3bbd92736efa33d1f77a22b3fde7f283127256c2f47e197571e6fe0b46149 +8a01dc6ed1b55f26427a014faa347130738b191a06b800e32042a46c13f60b49534520214359d68eb2e170c31e2b8672 +a72fa874866e19b2efb8e069328362bf7921ec375e3bcd6b1619384c3f7ee980f6cf686f3544e9374ff54b4d17a1629c +8db21092f7c5f110fba63650b119e82f4b42a997095d65f08f8237b02dd66fdf959f788df2c35124db1dbd330a235671 +8c65d50433d9954fe28a09fa7ba91a70a590fe7ba6b3060f5e4be0f6cef860b9897fa935fb4ebc42133524eb071dd169 +b4614058e8fa21138fc5e4592623e78b8982ed72aa35ee4391b164f00c68d277fa9f9eba2eeefc890b4e86eba5124591 +ab2ad3a1bce2fbd55ca6b7c23786171fe1440a97d99d6df4d80d07dd56ac2d7203c294b32fc9e10a6c259381a73f24a1 +812ae3315fdc18774a8da3713a4679e8ed10b9405edc548c00cacbe25a587d32040566676f135e4723c5dc25df5a22e9 +a464b75f95d01e5655b54730334f443c8ff27c3cb79ec7af4b2f9da3c2039c609908cd128572e1fd0552eb597e8cef8d +a0db3172e93ca5138fe419e1c49a1925140999f6eff7c593e5681951ee0ec1c7e454c851782cbd2b8c9bc90d466e90e0 +806db23ba7d00b87d544eed926b3443f5f9c60da6b41b1c489fba8f73593b6e3b46ebfcab671ee009396cd77d5e68aa1 +8bfdf2c0044cc80260994e1c0374588b6653947b178e8b312be5c2a05e05767e98ea15077278506aee7df4fee1aaf89e +827f6558c16841b5592ff089c9c31e31eb03097623524394813a2e4093ad2d3f8f845504e2af92195aaa8a1679d8d692 +925c4f8eab2531135cd71a4ec88e7035b5eea34ba9d799c5898856080256b4a15ed1a746e002552e2a86c9c157e22e83 +a9f9a368f0e0b24d00a35b325964c85b69533013f9c2cfad9708be5fb87ff455210f8cb8d2ce3ba58ca3f27495552899 +8ac0d3bebc1cae534024187e7c71f8927ba8fcc6a1926cb61c2b6c8f26bb7831019e635a376146c29872a506784a4aaa +97c577be2cbbfdb37ad754fae9df2ada5fc5889869efc7e18a13f8e502fbf3f4067a509efbd46fd990ab47ce9a70f5a8 +935e7d82bca19f16614aa43b4a3474e4d20d064e4bfdf1cea2909e5c9ab72cfe3e54dc50030e41ee84f3588cebc524e9 +941aafc08f7c0d94cebfbb1f0aad5202c02e6e37f2c12614f57e727efa275f3926348f567107ee6d8914dd71e6060271 +af0fbc1ba05b4b5b63399686df3619968be5d40073de0313cbf5f913d3d4b518d4c249cdd2176468ccaa36040a484f58 +a0c414f23f46ca6d69ce74c6f8a00c036cb0edd098af0c1a7d39c802b52cfb2d5dbdf93fb0295453d4646e2af7954d45 +909cf39e11b3875bb63b39687ae1b5d1f5a15445e39bf164a0b14691b4ddb39a8e4363f584ef42213616abc4785b5d66 +a92bac085d1194fbd1c88299f07a061d0bdd3f980b663e81e6254dbb288bf11478c0ee880e28e01560f12c5ccb3c0103 +841705cd5cd76b943e2b7c5e845b9dd3c8defe8ef67e93078d6d5e67ade33ad4b0fd413bc196f93b0a4073c855cd97d4 +8e7eb8364f384a9161e81d3f1d52ceca9b65536ae49cc35b48c3e2236322ba4ae9973e0840802d9fa4f4d82ea833544f +aed3ab927548bc8bec31467ba80689c71a168e34f50dcb6892f19a33a099f5aa6b3f9cb79f5c0699e837b9a8c7f27efe +b8fbf7696210a36e20edabd77839f4dfdf50d6d015cdf81d587f90284a9bcef7d2a1ff520728d7cc69a4843d6c20dedd +a9d533769ce6830211c884ae50a82a7bf259b44ac71f9fb11f0296fdb3981e6b4c1753fe744647b247ebc433a5a61436 +8b4bdf90d33360b7f428c71cde0a49fb733badba8c726876945f58c620ce7768ae0e98fc8c31fa59d8955a4823336bb1 +808d42238e440e6571c59e52a35ae32547d502dc24fd1759d8ea70a7231a95859baf30b490a4ba55fa2f3aaa11204597 +85594701f1d2fee6dc1956bc44c7b31db93bdeec2f3a7d622c1a08b26994760773e3d57521a44cfd7e407ac3fd430429 +a66de045ce7173043a6825e9dc440ac957e2efb6df0a337f4f8003eb0c719d873a52e6eba3cb0d69d977ca37d9187674 +87a1c6a1fdff993fa51efa5c3ba034c079c0928a7d599b906336af7c2dcab9721ceaf3108c646490af9dff9a754f54b3 +926424223e462ceb75aed7c22ade8a7911a903b7e5dd4bc49746ddce8657f4616325cd12667d4393ac52cdd866396d0e +b5dc96106593b42b30f06f0b0a1e0c1aafc70432e31807252d3674f0b1ea5e58eac8424879d655c9488d85a879a3e572 +997ca0987735cc716507cb0124b1d266d218b40c9d8e0ecbf26a1d65719c82a637ce7e8be4b4815d307df717bde7c72a +92994d3f57a569b7760324bb5ae4e8e14e1633d175dab06aa57b8e391540e05f662fdc08b8830f489a063f59b689a688 +a8087fcc6aa4642cb998bea11facfe87eb33b90a9aa428ab86a4124ad032fc7d2e57795311a54ec9f55cc120ebe42df1 +a9bd7d1de6c0706052ca0b362e2e70e8c8f70f1f026ea189b4f87a08ce810297ebfe781cc8004430776c54c1a05ae90c +856d33282e8a8e33a3d237fb0a0cbabaf77ba9edf2fa35a831fdafcadf620561846aa6cbb6bdc5e681118e1245834165 +9524a7aa8e97a31a6958439c5f3339b19370f03e86b89b1d02d87e4887309dbbe9a3a8d2befd3b7ed5143c8da7e0a8ad +824fdf433e090f8acbd258ac7429b21f36f9f3b337c6d0b71d1416a5c88a767883e255b2888b7c906dd2e9560c4af24c +88c7fee662ca7844f42ed5527996b35723abffd0d22d4ca203b9452c639a5066031207a5ae763dbc0865b3299d19b1ec +919dca5c5595082c221d5ab3a5bc230f45da7f6dec4eb389371e142c1b9c6a2c919074842479c2844b72c0d806170c0c +b939be8175715e55a684578d8be3ceff3087f60fa875fff48e52a6e6e9979c955efef8ff67cfa2b79499ea23778e33b0 +873b6db725e7397d11bc9bed9ac4468e36619135be686790a79bc6ed4249058f1387c9a802ea86499f692cf635851066 +aeae06db3ec47e9e5647323fa02fac44e06e59b885ad8506bf71b184ab3895510c82f78b6b22a5d978e8218e7f761e9f +b99c0a8359c72ab88448bae45d4bf98797a26bca48b0d4460cd6cf65a4e8c3dd823970ac3eb774ae5d0cea4e7fadf33e +8f10c8ec41cdfb986a1647463076a533e6b0eec08520c1562401b36bb063ac972aa6b28a0b6ce717254e35940b900e3c +a106d9be199636d7add43b942290269351578500d8245d4aae4c083954e4f27f64740a3138a66230391f2d0e6043a8de +a469997908244578e8909ff57cffc070f1dbd86f0098df3cfeb46b7a085cfecc93dc69ee7cad90ff1dc5a34d50fe580c +a4ef087bea9c20eb0afc0ee4caba7a9d29dfa872137828c721391273e402fb6714afc80c40e98bbd8276d3836bffa080 +b07a013f73cd5b98dae0d0f9c1c0f35bff8a9f019975c4e1499e9bee736ca6fcd504f9bc32df1655ff333062382cff04 +b0a77188673e87cc83348c4cc5db1eecf6b5184e236220c8eeed7585e4b928db849944a76ec60ef7708ef6dac02d5592 +b1284b37e59b529f0084c0dacf0af6c0b91fc0f387bf649a8c74819debf606f7b07fc3e572500016fb145ec2b24e9f17 +97b20b5b4d6b9129da185adfbf0d3d0b0faeba5b9715f10299e48ea0521709a8296a9264ce77c275a59c012b50b6519a +b9d37e946fae5e4d65c1fbfacc8a62e445a1c9d0f882e60cca649125af303b3b23af53c81d7bac544fb7fcfc7a314665 +8e5acaac379f4bb0127efbef26180f91ff60e4c525bc9b798fc50dfaf4fe8a5aa84f18f3d3cfb8baead7d1e0499af753 +b0c0b8ab1235bf1cda43d4152e71efc1a06c548edb964eb4afceb201c8af24240bf8ab5cae30a08604e77432b0a5faf0 +8cc28d75d5c8d062d649cbc218e31c4d327e067e6dbd737ec0a35c91db44fbbd0d40ec424f5ed79814add16947417572 +95ae6219e9fd47efaa9cb088753df06bc101405ba50a179d7c9f7c85679e182d3033f35b00dbba71fdcd186cd775c52e +b5d28fa09f186ebc5aa37453c9b4d9474a7997b8ae92748ecb940c14868792292ac7d10ade01e2f8069242b308cf97e5 +8c922a0faa14cc6b7221f302df3342f38fc8521ec6c653f2587890192732c6da289777a6cd310747ea7b7d104af95995 +b9ad5f660b65230de54de535d4c0fcae5bc6b59db21dea5500fdc12eea4470fb8ea003690fdd16d052523418d5e01e8c +a39a9dd41a0ff78c82979483731f1cd68d3921c3e9965869662c22e02dde3877802e180ba93f06e7346f96d9fa9261d2 +8b32875977ec372c583b24234c27ed73aef00cdff61eb3c3776e073afbdeade548de9497c32ec6d703ff8ad0a5cb7fe4 +9644cbe755a5642fe9d26cfecf170d3164f1848c2c2e271d5b6574a01755f3980b3fc870b98cf8528fef6ecef4210c16 +81ea9d1fdd9dd66d60f40ce0712764b99da9448ae0b300f8324e1c52f154e472a086dda840cb2e0b9813dc8ce8afd4b5 +906aaa4a7a7cdf01909c5cfbc7ded2abc4b869213cbf7c922d4171a4f2e637e56f17020b852ad339d83b8ac92f111666 +939b5f11acbdeff998f2a080393033c9b9d8d5c70912ea651c53815c572d36ee822a98d6dfffb2e339f29201264f2cf4 +aba4898bf1ccea9b9e2df1ff19001e05891581659c1cbbde7ee76c349c7fc7857261d9785823c9463a8aea3f40e86b38 +83ca1a56b8a0be4820bdb5a9346357c68f9772e43f0b887729a50d2eb2a326bbcede676c8bf2e51d7c89bbd8fdb778a6 +94e86e9fe6addfe2c3ee3a547267ed921f4230d877a85bb4442c2d9350c2fa9a9c54e6fe662de82d1a2407e4ab1691c2 +a0cc3bdef671a59d77c6984338b023fa2b431b32e9ed2abe80484d73edc6540979d6f10812ecc06d4d0c5d4eaca7183c +b5343413c1b5776b55ea3c7cdd1f3af1f6bd802ea95effe3f2b91a523817719d2ecc3f8d5f3cc2623ace7e35f99ca967 +92085d1ed0ed28d8cabe3e7ff1905ed52c7ceb1eac5503760c52fb5ee3a726aba7c90b483c032acc3f166b083d7ec370 +8ec679520455275cd957fca8122724d287db5df7d29f1702a322879b127bff215e5b71d9c191901465d19c86c8d8d404 +b65eb2c63d8a30332eb24ee8a0c70156fc89325ebbb38bacac7cf3f8636ad8a472d81ccca80423772abc00192d886d8a +a9fe1c060b974bee4d590f2873b28635b61bfcf614e61ff88b1be3eee4320f4874e21e8d666d8ac8c9aba672efc6ecae +b3fe2a9a389c006a831dea7e777062df84b5c2803f9574d7fbe10b7e1c125817986af8b6454d6be9d931a5ac94cfe963 +95418ad13b734b6f0d33822d9912c4c49b558f68d08c1b34a0127fcfa666bcae8e6fda8832d2c75bb9170794a20e4d7c +a9a7df761e7f18b79494bf429572140c8c6e9d456c4d4e336184f3f51525a65eb9582bea1e601bdb6ef8150b7ca736a5 +a0de03b1e75edf7998c8c1ac69b4a1544a6fa675a1941950297917366682e5644a4bda9cdeedfaf9473d7fccd9080b0c +a61838af8d95c95edf32663a68f007d95167bf6e41b0c784a30b22d8300cfdd5703bd6d16e86396638f6db6ae7e42a85 +8866d62084d905c145ff2d41025299d8b702ac1814a7dec4e277412c161bc9a62fed735536789cb43c88693c6b423882 +91da22c378c81497fe363e7f695c0268443abee50f8a6625b8a41e865638a643f07b157ee566de09ba09846934b4e2d7 +941d21dd57c9496aa68f0c0c05507405fdd413acb59bc668ce7e92e1936c68ec4b065c3c30123319884149e88228f0b2 +a77af9b094bc26966ddf2bf9e1520c898194a5ccb694915950dadc204facbe3066d3d89f50972642d76b14884cfbaa21 +8e76162932346869f4618bde744647f7ab52ab498ad654bdf2a4feeb986ac6e51370841e5acbb589e38b6e7142bb3049 +b60979ace17d6937ece72e4f015da4657a443dd01cebc7143ef11c09e42d4aa8855999a65a79e2ea0067f31c9fc2ab0f +b3e2ffdd5ee6fd110b982fd4fad4b93d0fca65478f986d086eeccb0804960bfaa1919afa743c2239973ea65091fe57d2 +8ce0ce05e7d7160d44574011da687454dbd3c8b8290aa671731b066e2c82f8cf2d63cb8e932d78c6122ec610e44660e6 +ab005dd8d297045c39e2f72fb1c48edb501ccf3575d3d04b9817b3afee3f0bb0f3f53f64bda37d1d9cde545aae999bae +95bd7edb4c4cd60e3cb8a72558845a3cce6bb7032ccdf33d5a49ebb6ddf203bc3c79e7b7e550735d2d75b04c8b2441e8 +889953ee256206284094e4735dbbb17975bafc7c3cb94c9fbfee4c3e653857bfd49e818f64a47567f721b98411a3b454 +b188423e707640ab0e75a061e0b62830cde8afab8e1ad3dae30db69ffae4e2fc005bababbdcbd7213b918ed4f70e0c14 +a97e0fafe011abd70d4f99a0b36638b3d6e7354284588f17a88970ed48f348f88392779e9a038c6cbc9208d998485072 +87db11014a91cb9b63e8dfaa82cdebca98272d89eb445ee1e3ff9dbaf2b3fad1a03b888cffc128e4fe208ed0dddece0f +aad2e40364edd905d66ea4ac9d51f9640d6fda9a54957d26ba233809851529b32c85660fa401dbee3679ec54fa6dd966 +863e99336ca6edf03a5a259e59a2d0f308206e8a2fb320cfc0be06057366df8e0f94b33a28f574092736b3c5ada84270 +b34bcc56a057589f34939a1adc51de4ff6a9f4fee9c7fa9aa131e28d0cf0759a0c871b640162acdfbf91f3f1b59a3703 +935dd28f2896092995c5eff1618e5b6efe7a40178888d7826da9b0503c2d6e68a28e7fac1a334e166d0205f0695ef614 +b842cd5f8f5de5ca6c68cb4a5c1d7b451984930eb4cc18fd0934d52fdc9c3d2d451b1c395594d73bc3451432bfba653f +9014537885ce2debad736bc1926b25fdab9f69b216bf024f589c49dc7e6478c71d595c3647c9f65ff980b14f4bb2283b +8e827ccca1dd4cd21707140d10703177d722be0bbe5cac578db26f1ef8ad2909103af3c601a53795435b27bf95d0c9ed +8a0b8ad4d466c09d4f1e9167410dbe2edc6e0e6229d4b3036d30f85eb6a333a18b1c968f6ca6d6889bb08fecde017ef4 +9241ee66c0191b06266332dc9161dede384c4bb4e116dbd0890f3c3790ec5566da4568243665c4725b718ac0f6b5c179 +aeb4d5fad81d2b505d47958a08262b6f1b1de9373c2c9ba6362594194dea3e002ab03b8cbb43f867be83065d3d370f19 +8781bc83bb73f7760628629fe19e4714b494dbed444c4e4e4729b7f6a8d12ee347841a199888794c2234f51fa26fc2b9 +b58864f0acd1c2afa29367e637cbde1968d18589245d9936c9a489c6c495f54f0113ecdcbe4680ac085dd3c397c4d0c3 +94a24284afaeead61e70f3e30f87248d76e9726759445ca18cdb9360586c60cc9f0ec1c397f9675083e0b56459784e2e +aed358853f2b54dcbddf865e1816c2e89be12e940e1abfa661e2ee63ffc24a8c8096be2072fa83556482c0d89e975124 +b95374e6b4fc0765708e370bc881e271abf2e35c08b056a03b847e089831ef4fe3124b9c5849d9c276eb2e35b3daf264 +b834cdbcfb24c8f84bfa4c552e7fadc0028a140952fd69ed13a516e1314a4cd35d4b954a77d51a1b93e1f5d657d0315d +8fb6d09d23bfa90e7443753d45a918d91d75d8e12ec7d016c0dfe94e5c592ba6aaf483d2f16108d190822d955ad9cdc3 +aa315cd3c60247a6ad4b04f26c5404c2713b95972843e4b87b5a36a89f201667d70f0adf20757ebe1de1b29ae27dda50 +a116862dca409db8beff5b1ccd6301cdd0c92ca29a3d6d20eb8b87f25965f42699ca66974dd1a355200157476b998f3b +b4c2f5fe173c4dc8311b60d04a65ce1be87f070ac42e13cd19c6559a2931c6ee104859cc2520edebbc66a13dc7d30693 +8d4a02bf99b2260c334e7d81775c5cf582b00b0c982ce7745e5a90624919028278f5e9b098573bad5515ce7fa92a80c8 +8543493bf564ce6d97bd23be9bff1aba08bd5821ca834f311a26c9139c92a48f0c2d9dfe645afa95fec07d675d1fd53b +9344239d13fde08f98cb48f1f87d34cf6abe8faecd0b682955382a975e6eed64e863fa19043290c0736261622e00045c +aa49d0518f343005ca72b9e6c7dcaa97225ce6bb8b908ebbe7b1a22884ff8bfb090890364e325a0d414ad180b8f161d1 +907d7fd3e009355ab326847c4a2431f688627faa698c13c03ffdd476ecf988678407f029b8543a475dcb3dafdf2e7a9c +845f1f10c6c5dad2adc7935f5cd2e2b32f169a99091d4f1b05babe7317b9b1cdce29b5e62f947dc621b9acbfe517a258 +8f3be8e3b380ea6cdf9e9c237f5e88fd5a357e5ded80ea1fc2019810814de82501273b4da38916881125b6fa0cfd4459 +b9c7f487c089bf1d20c822e579628db91ed9c82d6ca652983aa16d98b4270c4da19757f216a71b9c13ddee3e6e43705f +8ba2d8c88ad2b872db104ea8ddbb006ec2f3749fd0e19298a804bb3a5d94de19285cc7fb19fee58a66f7851d1a66c39f +9375ecd3ed16786fe161af5d5c908f56eeb467a144d3bbddfc767e90065b7c94fc53431adebecba2b6c9b5821184d36e +a49e069bfadb1e2e8bff6a4286872e2a9765d62f0eaa4fcb0e5af4bbbed8be3510fb19849125a40a8a81d1e33e81c3eb +9522cc66757b386aa6b88619525c8ce47a5c346d590bb3647d12f991e6c65c3ab3c0cfc28f0726b6756c892eae1672be +a9a0f1f51ff877406fa83a807aeb17b92a283879f447b8a2159653db577848cc451cbadd01f70441e351e9ed433c18bc +8ff7533dcff6be8714df573e33f82cf8e9f2bcaaa43e939c4759d52b754e502717950de4b4252fb904560fc31dce94a4 +959724671e265a28d67c29d95210e97b894b360da55e4cf16e6682e7912491ed8ca14bfaa4dce9c25a25b16af580494f +92566730c3002f4046c737032487d0833c971e775de59fe02d9835c9858e2e3bc37f157424a69764596c625c482a2219 +a84b47ceff13ed9c3e5e9cdf6739a66d3e7c2bd8a6ba318fefb1a9aecf653bb2981da6733ddb33c4b0a4523acc429d23 +b4ddf571317e44f859386d6140828a42cf94994e2f1dcbcc9777f4eebbfc64fc1e160b49379acc27c4672b8e41835c5d +8ab95c94072b853d1603fdd0a43b30db617d13c1d1255b99075198e1947bfa5f59aed2b1147548a1b5e986cd9173d15c +89511f2eab33894fd4b3753d24249f410ff7263052c1fef6166fc63a79816656b0d24c529e45ccce6be28de6e375d916 +a0866160ca63d4f2be1b4ea050dac6b59db554e2ebb4e5b592859d8df339b46fd7cb89aaed0951c3ee540aee982c238a +8fcc5cbba1b94970f5ff2eb1922322f5b0aa7d918d4b380c9e7abfd57afd8b247c346bff7b87af82efbce3052511cd1b +99aeb2a5e846b0a2874cca02c66ed40d5569eb65ab2495bc3f964a092e91e1517941f2688e79f8cca49cd3674c4e06dc +b7a096dc3bad5ca49bee94efd884aa3ff5615cf3825cf95fbe0ce132e35f46581d6482fa82666c7ef5f1643eaee8f1ca +94393b1da6eaac2ffd186b7725eca582f1ddc8cdd916004657f8a564a7c588175cb443fc6943b39029f5bbe0add3fad8 +884b85fe012ccbcd849cb68c3ad832d83b3ef1c40c3954ffdc97f103b1ed582c801e1a41d9950f6bddc1d11f19d5ec76 +b00061c00131eded8305a7ce76362163deb33596569afb46fe499a7c9d7a0734c084d336b38d168024c2bb42b58e7660 +a439153ac8e6ca037381e3240e7ba08d056c83d7090f16ed538df25901835e09e27de2073646e7d7f3c65056af6e4ce7 +830fc9ca099097d1f38b90e6843dc86f702be9d20bdacc3e52cae659dc41df5b8d2c970effa6f83a5229b0244a86fe22 +b81ea2ffaaff2bb00dd59a9ab825ba5eed4db0d8ac9c8ed1a632ce8f086328a1cddd045fbe1ace289083c1325881b7e7 +b51ea03c58daf2db32c99b9c4789b183365168cb5019c72c4cc91ac30b5fb7311d3db76e6fa41b7cd4a8c81e2f6cdc94 +a4170b2c6d09ca5beb08318730419b6f19215ce6c631c854116f904be3bc30dd85a80c946a8ab054d3e307afaa3f8fbc +897cc42ff28971ff54d2a55dd6b35cfb8610ac902f3c06e3a5cea0e0a257e870c471236a8e84709211c742a09c5601a6 +a18f2e98d389dace36641621488664ecbb422088ab03b74e67009b8b8acacaaa24fdcf42093935f355207d934adc52a8 +92adcfb678cc2ba19c866f3f2b988fdcb4610567f3ab436cc0cb9acaf5a88414848d71133ebdbec1983e38e6190f1b5f +a86d43c2ce01b366330d3b36b3ca85f000c3548b8297e48478da1ee7d70d8576d4650cba7852ed125c0d7cb6109aa7f3 +8ed31ceed9445437d7732dce78a762d72ff32a7636bfb3fd7974b7ae15db414d8184a1766915244355deb354fbc5803b +9268f70032584f416e92225d65af9ea18c466ebc7ae30952d56a4e36fd9ea811dde0a126da9220ba3c596ec54d8a335e +9433b99ee94f2d3fbdd63b163a2bdf440379334c52308bd24537f7defd807145a062ff255a50d119a7f29f4b85d250e3 +90ce664f5e4628a02278f5cf5060d1a34f123854634b1870906e5723ac9afd044d48289be283b267d45fcbf3f4656aaf +aaf21c4d59378bb835d42ae5c5e5ab7a3c8c36a59e75997989313197752b79a472d866a23683b329ea69b048b87fa13e +b83c0589b304cec9ede549fde54f8a7c2a468c6657da8c02169a6351605261202610b2055c639b9ed2d5b8c401fb8f56 +9370f326ea0f170c2c05fe2c5a49189f20aec93b6b18a5572a818cd4c2a6adb359e68975557b349fb54f065d572f4c92 +ac3232fa5ce6f03fca238bef1ce902432a90b8afce1c85457a6bee5571c033d4bceefafc863af04d4e85ac72a4d94d51 +80d9ea168ff821b22c30e93e4c7960ce3ad3c1e6deeebedd342a36d01bd942419b187e2f382dbfd8caa34cca08d06a48 +a387a3c61676fb3381eefa2a45d82625635a666e999aba30e3b037ec9e040f414f9e1ad9652abd3bcad63f95d85038db +a1b229fe32121e0b391b0f6e0180670b9dc89d79f7337de4c77ea7ad0073e9593846f06797c20e923092a08263204416 +92164a9d841a2b828cedf2511213268b698520f8d1285852186644e9a0c97512cafa4bfbe29af892c929ebccd102e998 +82ee2fa56308a67c7db4fd7ef539b5a9f26a1c2cc36da8c3206ba4b08258fbb3cec6fe5cdbd111433fb1ba2a1e275927 +8c77bfe9e191f190a49d46f05600603fa42345592539b82923388d72392404e0b29a493a15e75e8b068dddcd444c2928 +80b927f93ccf79dcf5c5b20bcf5a7d91d7a17bc0401bb7cc9b53a6797feac31026eb114257621f5a64a52876e4474cc1 +b6b68b6501c37804d4833d5a063dd108a46310b1400549074e3cac84acc6d88f73948b7ad48d686de89c1ec043ae8c1a +ab3da00f9bdc13e3f77624f58a3a18fc3728956f84b5b549d62f1033ae4b300538e53896e2d943f160618e05af265117 +b6830e87233b8eace65327fdc764159645b75d2fd4024bf8f313b2dd5f45617d7ecfb4a0b53ccafb5429815a9a1adde6 +b9251cfe32a6dc0440615aadcd98b6b1b46e3f4e44324e8f5142912b597ee3526bea2431e2b0282bb58f71be5b63f65e +af8d70711e81cdddfb39e67a1b76643292652584c1ce7ce4feb1641431ad596e75c9120e85f1a341e7a4da920a9cdd94 +98cd4e996594e89495c078bfd52a4586b932c50a449a7c8dfdd16043ca4cda94dafbaa8ad1b44249c99bbcc52152506e +b9fc6d1c24f48404a4a64fbe3e43342738797905db46e4132aee5f086aaa4c704918ad508aaefa455cfe1b36572e6242 +a365e871d30ba9291cedaba1be7b04e968905d003e9e1af7e3b55c5eb048818ae5b913514fb08b24fb4fbdccbb35d0b8 +93bf99510971ea9af9f1e364f1234c898380677c8e8de9b0dd24432760164e46c787bc9ec42a7ad450500706cf247b2d +b872f825a5b6e7b9c7a9ddfeded3516f0b1449acc9b4fd29fc6eba162051c17416a31e5be6d3563f424d28e65bab8b8f +b06b780e5a5e8eb4f4c9dc040f749cf9709c8a4c9ef15e925f442b696e41e5095db0778a6c73bcd329b265f2c6955c8b +848f1a981f5fc6cd9180cdddb8d032ad32cdfa614fc750d690dbae36cc0cd355cbf1574af9b3ffc8b878f1b2fafb9544 +a03f48cbff3e9e8a3a655578051a5ae37567433093ac500ed0021c6250a51b767afac9bdb194ee1e3eac38a08c0eaf45 +b5be78ce638ff8c4aa84352b536628231d3f7558c5be3bf010b28feac3022e64691fa672f358c8b663904aebe24a54ed +a9d4da70ff676fa55d1728ba6ab03b471fa38b08854d99e985d88c2d050102d8ccffbe1c90249a5607fa7520b15fe791 +8fe9f7092ffb0b69862c8e972fb1ecf54308c96d41354ed0569638bb0364f1749838d6d32051fff1599112978c6e229c +ae6083e95f37770ecae0df1e010456f165d96cfe9a7278c85c15cffd61034081ce5723e25e2bede719dc9341ec8ed481 +a260891891103089a7afbd9081ea116cfd596fd1015f5b65e10b0961eb37fab7d09c69b7ce4be8bf35e4131848fb3fe4 +8d729fa32f6eb9fd2f6a140bef34e8299a2f3111bffd0fe463aa8622c9d98bfd31a1df3f3e87cd5abc52a595f96b970e +a30ec6047ae4bc7da4daa7f4c28c93aedb1112cfe240e681d07e1a183782c9ff6783ac077c155af23c69643b712a533f +ac830726544bfe7b5467339e5114c1a75f2a2a8d89453ce86115e6a789387e23551cd64620ead6283dfa4538eb313d86 +8445c135b7a48068d8ed3e011c6d818cfe462b445095e2fbf940301e50ded23f272d799eea47683fc027430ce14613ef +95785411715c9ae9d8293ce16a693a2aa83e3cb1b4aa9f76333d0da2bf00c55f65e21e42e50e6c5772ce213dd7b4f7a0 +b273b024fa18b7568c0d1c4d2f0c4e79ec509dafac8c5951f14192d63ddbcf2d8a7512c1c1b615cc38fa3e336618e0c5 +a78b9d3ea4b6a90572eb27956f411f1d105fdb577ee2ffeec9f221da9b45db84bfe866af1f29597220c75e0c37a628d8 +a4be2bf058c36699c41513c4d667681ce161a437c09d81383244fc55e1c44e8b1363439d0cce90a3e44581fb31d49493 +b6eef13040f17dd4eba22aaf284d2f988a4a0c4605db44b8d2f4bf9567ac794550b543cc513c5f3e2820242dd704152e +87eb00489071fa95d008c5244b88e317a3454652dcb1c441213aa16b28cd3ecaa9b22fec0bdd483c1df71c37119100b1 +92d388acdcb49793afca329cd06e645544d2269234e8b0b27d2818c809c21726bc9cf725651b951e358a63c83dedee24 +ae27e219277a73030da27ab5603c72c8bd81b6224b7e488d7193806a41343dff2456132274991a4722fdb0ef265d04cd +97583e08ecb82bbc27c0c8476d710389fa9ffbead5c43001bd36c1b018f29faa98de778644883e51870b69c5ffb558b5 +90a799a8ce73387599babf6b7da12767c0591cadd36c20a7990e7c05ea1aa2b9645654ec65308ee008816623a2757a6a +a1b47841a0a2b06efd9ab8c111309cc5fc9e1d5896b3e42ed531f6057e5ade8977c29831ce08dbda40348386b1dcc06d +b92b8ef59bbddb50c9457691bc023d63dfcc54e0fd88bd5d27a09e0d98ac290fc90e6a8f6b88492043bf7c87fac8f3e4 +a9d6240b07d62e22ec8ab9b1f6007c975a77b7320f02504fc7c468b4ee9cfcfd945456ff0128bc0ef2174d9e09333f8d +8e96534c94693226dc32bca79a595ca6de503af635f802e86442c67e77564829756961d9b701187fe91318da515bf0e6 +b6ba290623cd8dd5c2f50931c0045d1cfb0c30877bc8fe58cbc3ff61ee8da100045a39153916efa1936f4aee0892b473 +b43baa7717fac02d4294f5b3bb5e58a65b3557747e3188b482410388daac7a9c177f762d943fd5dcf871273921213da8 +b9cf00f8fb5e2ef2b836659fece15e735060b2ea39b8e901d3dcbdcf612be8bf82d013833718c04cd46ffaa70b85f42e +8017d0c57419e414cbba504368723e751ef990cc6f05dad7b3c2de6360adc774ad95512875ab8337d110bf39a42026fa +ae7401048b838c0dcd4b26bb6c56d79d51964a0daba780970b6c97daee4ea45854ea0ac0e4139b3fe60dac189f84df65 +887b237b0cd0f816b749b21db0b40072f9145f7896c36916296973f9e6990ede110f14e5976c906d08987c9836cca57f +a88c3d5770148aee59930561ca1223aceb2c832fb5417e188dca935905301fc4c6c2c9270bc1dff7add490a125eb81c6 +b6cf9b02c0cd91895ad209e38c54039523f137b5848b9d3ad33ae43af6c20c98434952db375fe378de7866f2d0e8b18a +84ef3d322ff580c8ad584b1fe4fe346c60866eb6a56e982ba2cf3b021ecb1fdb75ecc6c29747adda86d9264430b3f816 +a0561c27224baf0927ad144cb71e31e54a064c598373fcf0d66aebf98ab7af1d8e2f343f77baefff69a6da750a219e11 +aa5cc43f5b8162b016f5e1b61214c0c9d15b1078911c650b75e6cdfb49b85ee04c6739f5b1687d15908444f691f732de +ad4ac099b935589c7b8fdfdf3db332b7b82bb948e13a5beb121ebd7db81a87d278024a1434bcf0115c54ca5109585c3d +8a00466abf3f109a1dcd19e643b603d3af23d42794ef8ca2514dd507ecea44a031ac6dbc18bd02f99701168b25c1791e +b00b5900dfad79645f8bee4e5adc7b84eb22e5b1e67df77ccb505b7fc044a6c08a8ea5faca662414eb945f874f884cea +950e204e5f17112250b22ea6bb8423baf522fc0af494366f18fe0f949f51d6e6812074a80875cf1ed9c8e7420058d541 +91e5cbf8bb1a1d50c81608c9727b414d0dd2fb467ebc92f100882a3772e54f94979cfdf8e373fdef7c7fcdd60fec9e00 +a093f6a857b8caaff80599c2e89c962b415ecbaa70d8fd973155fa976a284c6b29a855f5f7a3521134d00d2972755188 +b4d55a3551b00da54cc010f80d99ddd2544bde9219a3173dfaadf3848edc7e4056ab532fb75ac26f5f7141e724267663 +a03ea050fc9b011d1b04041b5765d6f6453a93a1819cd9bd6328637d0b428f08526466912895dcc2e3008ee58822e9a7 +99b12b3665e473d01bc6985844f8994fb65cb15745024fb7af518398c4a37ff215da8f054e8fdf3286984ae36a73ca5e +9972c7e7a7fb12e15f78d55abcaf322c11249cd44a08f62c95288f34f66b51f146302bce750ff4d591707075d9123bd2 +a64b4a6d72354e596d87cda213c4fc2814009461570ccb27d455bbe131f8d948421a71925425b546d8cf63d5458cd64b +91c215c73b195795ede2228b7ed1f6e37892e0c6b0f4a0b5a16c57aa1100c84df9239054a173b6110d6c2b7f4bf1ce52 +88807198910ec1303480f76a3683870246a995e36adaeadc29c22f0bdba8152fe705bd070b75de657b04934f7d0ccf80 +b37c0026c7b32eb02cacac5b55cb5fe784b8e48b2945c64d3037af83ece556a117f0ff053a5968c2f5fa230e291c1238 +94c768384ce212bc2387e91ce8b45e4ff120987e42472888a317abc9dcdf3563b62e7a61c8e98d7cdcbe272167d91fc6 +a10c2564936e967a390cb14ef6e8f8b04ea9ece5214a38837eda09e79e0c7970b1f83adf017c10efd6faa8b7ffa2c567 +a5085eed3a95f9d4b1269182ea1e0d719b7809bf5009096557a0674bde4201b0ddc1f0f16a908fc468846b3721748ce3 +87468eb620b79a0a455a259a6b4dfbc297d0d53336537b771254dd956b145dc816b195b7002647ea218552e345818a3f +ace2b77ffb87366af0a9cb5d27d6fc4a14323dbbf1643f5f3c4559306330d86461bb008894054394cbfaefeaa0bc2745 +b27f56e840a54fbd793f0b7a7631aa4cee64b5947e4382b2dfb5eb1790270288884c2a19afebe5dc0c6ef335d4531c1c +876e438633931f7f895062ee16c4b9d10428875f7bc79a8e156a64d379a77a2c45bf5430c5ab94330f03da352f1e9006 +a2512a252587d200d2092b44c914df54e04ff8bcef36bf631f84bde0cf5a732e3dc7f00f662842cfd74b0b0f7f24180e +827f1bc8f54a35b7a4bd8154f79bcc055e45faed2e74adf7cf21cca95df44d96899e847bd70ead6bb27b9c0ed97bbd8b +a0c92cf5a9ed843714f3aea9fe7b880f622d0b4a3bf66de291d1b745279accf6ba35097849691370f41732ba64b5966b +a63f5c1e222775658421c487b1256b52626c6f79cb55a9b7deb2352622cedffb08502042d622eb3b02c97f9c09f9c957 +8cc093d52651e65fb390e186db6cc4de559176af4624d1c44cb9b0e836832419dacac7b8db0627b96288977b738d785d +aa7b6a17dfcec146134562d32a12f7bd7fe9522e300859202a02939e69dbd345ed7ff164a184296268f9984f9312e8fc +8ac76721f0d2b679f023d06cbd28c85ae5f4b43c614867ccee88651d4101d4fd352dbdb65bf36bfc3ebc0109e4b0c6f9 +8d350f7c05fc0dcd9a1170748846fb1f5d39453e4cb31e6d1457bed287d96fc393b2ecc53793ca729906a33e59c6834a +b9913510dfc5056d7ec5309f0b631d1ec53e3a776412ada9aefdaf033c90da9a49fdde6719e7c76340e86599b1f0eec2 +94955626bf4ce87612c5cfffcf73bf1c46a4c11a736602b9ba066328dc52ad6d51e6d4f53453d4ed55a51e0aad810271 +b0fcab384fd4016b2f1e53f1aafd160ae3b1a8865cd6c155d7073ecc1664e05b1d8bca1def39c158c7086c4e1103345e +827de3f03edfbde08570b72de6662c8bfa499b066a0a27ebad9b481c273097d17a5a0a67f01553da5392ec3f149b2a78 +ab7940384c25e9027c55c40df20bd2a0d479a165ced9b1046958353cd69015eeb1e44ed2fd64e407805ba42df10fc7bf +8ad456f6ff8cd58bd57567d931f923d0c99141978511b17e03cab7390a72b9f62498b2893e1b05c7c22dd274e9a31919 +ac75399e999effe564672db426faa17a839e57c5ef735985c70cd559a377adec23928382767b55ed5a52f7b11b54b756 +b17f975a00b817299ac7af5f2024ea820351805df58b43724393bfb3920a8cd747a3bbd4b8286e795521489db3657168 +a2bed800a6d95501674d9ee866e7314063407231491d794f8cf57d5be020452729c1c7cefd8c50dc1540181f5caab248 +9743f5473171271ffdd3cc59a3ae50545901a7b45cd4bc3570db487865f3b73c0595bebabbfe79268809ee1862e86e4a +b7eab77c2d4687b60d9d7b04e842b3880c7940140012583898d39fcc22d9b9b0a9be2c2e3788b3e6f30319b39c338f09 +8e2b8f797a436a1b661140e9569dcf3e1eea0a77c7ff2bc4ff0f3e49af04ed2de95e255df8765f1d0927fb456a9926b1 +8aefea201d4a1f4ff98ffce94e540bb313f2d4dfe7e9db484a41f13fc316ed02b282e1acc9bc6f56cad2dc2e393a44c9 +b950c17c0e5ca6607d182144aa7556bb0efe24c68f06d79d6413a973b493bfdf04fd147a4f1ab03033a32004cc3ea66f +b7b8dcbb179a07165f2dc6aa829fad09f582a71b05c3e3ea0396bf9e6fe73076f47035c031c2101e8e38e0d597eadd30 +a9d77ed89c77ec1bf8335d08d41c3c94dcca9fd1c54f22837b4e54506b212aa38d7440126c80648ab7723ff18e65ed72 +a819d6dfd4aef70e52b8402fe5d135f8082d40eb7d3bb5c4d7997395b621e2bb10682a1bad2c9caa33dd818550fc3ec6 +8f6ee34128fac8bbf13ce2d68b2bb363eb4fd65b297075f88e1446ddeac242500eeb4ef0735e105882ff5ba8c44c139b +b4440e48255c1644bcecf3a1e9958f1ec4901cb5b1122ee5b56ffd02cad1c29c4266999dbb85aa2605c1b125490074d4 +a43304a067bede5f347775d5811cf65a6380a8d552a652a0063580b5c5ef12a0867a39c7912fa219e184f4538eba1251 +a891ad67a790089ffc9f6d53e6a3d63d3556f5f693e0cd8a7d0131db06fd4520e719cfcc3934f0a8f62a95f90840f1d4 +aea6df8e9bb871081aa0fc5a9bafb00be7d54012c5baf653791907d5042a326aeee966fd9012a582cc16695f5baf7042 +8ffa2660dc52ed1cd4eff67d6a84a8404f358a5f713d04328922269bee1e75e9d49afeec0c8ad751620f22352a438e25 +87ec6108e2d63b06abed350f8b363b7489d642486f879a6c3aa90e5b0f335efc2ff2834eef9353951a42136f8e6a1b32 +865619436076c2760d9e87ddc905023c6de0a8d56eef12c98a98c87837f2ca3f27fd26a2ad752252dbcbe2b9f1d5a032 +980437dce55964293cb315c650c5586ffd97e7a944a83f6618af31c9d92c37b53ca7a21bb5bc557c151b9a9e217e7098 +95d128fc369df4ad8316b72aea0ca363cbc7b0620d6d7bb18f7076a8717a6a46956ff140948b0cc4f6d2ce33b5c10054 +8c7212d4a67b9ec70ebbca04358ad2d36494618d2859609163526d7b3acc2fc935ca98519380f55e6550f70a9bc76862 +893a2968819401bf355e85eee0f0ed0406a6d4a7d7f172d0017420f71e00bb0ba984f6020999a3cdf874d3cd8ebcd371 +9103c1af82dece25d87274e89ea0acd7e68c2921c4af3d8d7c82ab0ed9990a5811231b5b06113e7fa43a6bd492b4564f +99cfd87a94eab7d35466caa4ed7d7bb45e5c932b2ec094258fb14bf205659f83c209b83b2f2c9ccb175974b2a33e7746 +874b6b93e4ee61be3f00c32dd84c897ccd6855c4b6251eb0953b4023634490ed17753cd3223472873cbc6095b2945075 +84a32c0dc4ea60d33aac3e03e70d6d639cc9c4cc435c539eff915017be3b7bdaba33349562a87746291ebe9bc5671f24 +a7057b24208928ad67914e653f5ac1792c417f413d9176ba635502c3f9c688f7e2ee81800d7e3dc0a340c464da2fd9c5 +a03fb9ed8286aacfa69fbd5d953bec591c2ae4153400983d5dbb6cd9ea37fff46ca9e5cceb9d117f73e9992a6c055ad2 +863b2de04e89936c9a4a2b40380f42f20aefbae18d03750fd816c658aee9c4a03df7b12121f795c85d01f415baaeaa59 +8526eb9bd31790fe8292360d7a4c3eed23be23dd6b8b8f01d2309dbfdc0cfd33ad1568ddd7f8a610f3f85a9dfafc6a92 +b46ab8c5091a493d6d4d60490c40aa27950574a338ea5bbc045be3a114af87bdcb160a8c80435a9b7ad815f3cb56a3f3 +aeadc47b41a8d8b4176629557646202f868b1d728b2dda58a347d937e7ffc8303f20d26d6c00b34c851b8aeec547885d +aebb19fc424d72c1f1822aa7adc744cd0ef7e55727186f8df8771c784925058c248406ebeeaf3c1a9ee005a26e9a10c6 +8ff96e81c1a4a2ab1b4476c21018fae0a67e92129ee36120cae8699f2d7e57e891f5c624902cb1b845b944926a605cc3 +8251b8d2c43fadcaa049a9e7aff838dae4fb32884018d58d46403ac5f3beb5c518bfd45f03b8abb710369186075eb71c +a8b2a64f865f51a5e5e86a66455c093407933d9d255d6b61e1fd81ffafc9538d73caaf342338a66ba8ee166372a3d105 +aad915f31c6ba7fdc04e2aaac62e84ef434b7ee76a325f07dc430d12c84081999720181067b87d792efd0117d7ee1eab +a13db3bb60389883fd41d565c54fb5180d9c47ce2fe7a169ae96e01d17495f7f4fa928d7e556e7c74319c4c25d653eb2 +a4491b0198459b3f552855d680a59214eb74e6a4d6c5fa3b309887dc50ebea2ecf6d26c040550f7dc478b452481466fb +8f017f13d4b1e3f0c087843582b52d5f8d13240912254d826dd11f8703a99a2f3166dfbdfdffd9a3492979d77524276b +96c3d5dcd032660d50d7cd9db2914f117240a63439966162b10c8f1f3cf74bc83b0f15451a43b31dbd85e4a7ce0e4bb1 +b479ec4bb79573d32e0ec93b92bdd7ec8c26ddb5a2d3865e7d4209d119fd3499eaac527615ffac78c440e60ef3867ae0 +b2c49c4a33aa94b52b6410b599e81ff15490aafa7e43c8031c865a84e4676354a9c81eb4e7b8be6825fdcefd1e317d44 +906dc51d6a90c089b6704b47592805578a6eed106608eeb276832f127e1b8e858b72e448edcbefb497d152447e0e68ff +b0e81c63b764d7dfbe3f3fddc9905aef50f3633e5d6a4af6b340495124abedcff5700dfd1577bbbed7b6bf97d02719cb +9304c64701e3b4ed6d146e48a881f7d83a17f58357cca0c073b2bb593afd2d94f6e2a7a1ec511d0a67ad6ff4c3be5937 +b6fdbd12ba05aa598d80b83f70a15ef90e5cba7e6e75fa038540ee741b644cd1f408a6cecfd2a891ef8d902de586c6b5 +b80557871a6521b1b3c74a1ba083ae055b575df607f1f7b04c867ba8c8c181ea68f8d90be6031f4d25002cca27c44da2 +aa7285b8e9712e06b091f64163f1266926a36607f9d624af9996856ed2aaf03a580cb22ce407d1ade436c28b44ca173f +8148d72b975238b51e6ea389e5486940d22641b48637d7dfadfa603a605bfc6d74a016480023945d0b85935e396aea5d +8a014933a6aea2684b5762af43dcf4bdbb633cd0428d42d71167a2b6fc563ece5e618bff22f1db2ddb69b845b9a2db19 +990d91740041db770d0e0eb9d9d97d826f09fd354b91c41e0716c29f8420e0e8aac0d575231efba12fe831091ec38d5a +9454d0d32e7e308ddec57cf2522fb1b67a2706e33fb3895e9e1f18284129ab4f4c0b7e51af25681d248d7832c05eb698 +a5bd434e75bac105cb3e329665a35bce6a12f71dd90c15165777d64d4c13a82bceedb9b48e762bd24034e0fc9fbe45f4 +b09e3b95e41800d4dc29c6ffdaab2cd611a0050347f6414f154a47ee20ee59bf8cf7181454169d479ebce1eb5c777c46 +b193e341d6a047d15eea33766d656d807b89393665a783a316e9ba10518e5515c8e0ade3d6e15641d917a8a172a5a635 +ade435ec0671b3621dde69e07ead596014f6e1daa1152707a8c18877a8b067bde2895dd47444ffa69db2bbef1f1d8816 +a7fd3d6d87522dfc56fb47aef9ce781a1597c56a8bbfd796baba907afdc872f753d732bfda1d3402aee6c4e0c189f52d +a298cb4f4218d0464b2fab393e512bbc477c3225aa449743299b2c3572f065bc3a42d07e29546167ed9e1b6b3b3a3af3 +a9ee57540e1fd9c27f4f0430d194b91401d0c642456c18527127d1f95e2dba41c2c86d1990432eb38a692fda058fafde +81d6c1a5f93c04e6d8e5a7e0678c1fc89a1c47a5c920bcd36180125c49fcf7c114866b90e90a165823560b19898a7c16 +a4b7a1ec9e93c899b9fd9aaf264c50e42c36c0788d68296a471f7a3447af4dbc81e4fa96070139941564083ec5b5b5a1 +b3364e327d381f46940c0e11e29f9d994efc6978bf37a32586636c0070b03e4e23d00650c1440f448809e1018ef9f6d8 +8056e0913a60155348300e3a62e28b5e30629a90f7dd4fe11289097076708110a1d70f7855601782a3cdc5bdb1ca9626 +b4980fd3ea17bac0ba9ee1c470b17e575bb52e83ebdd7d40c93f4f87bebeaff1c8a679f9d3d09d635f068d37d5bd28bd +905a9299e7e1853648e398901dfcd437aa575c826551f83520df62984f5679cb5f0ea86aa45ed3e18b67ddc0dfafe809 +ab99553bf31a84f2e0264eb34a08e13d8d15e2484aa9352354becf9a15999c76cc568d68274b70a65e49703fc23540d0 +a43681597bc574d2dae8964c9a8dc1a07613d7a1272bdcb818d98c85d44e16d744250c33f3b5e4d552d97396b55e601f +a54e5a31716fccb50245898c99865644405b8dc920ded7a11f3d19bdc255996054b268e16f2e40273f11480e7145f41e +8134f3ad5ef2ad4ba12a8a4e4d8508d91394d2bcdc38b7c8c8c0b0a820357ac9f79d286c65220f471eb1adca1d98fc68 +94e2f755e60471578ab2c1adb9e9cea28d4eec9b0e92e0140770bca7002c365fcabfe1e5fb4fe6cfe79a0413712aa3ef +ad48f8d0ce7eb3cc6e2a3086ad96f562e5bed98a360721492ae2e74dc158586e77ec8c35d5fd5927376301b7741bad2b +8614f0630bdd7fbad3a31f55afd9789f1c605dc85e7dc67e2edfd77f5105f878bb79beded6e9f0b109e38ea7da67e8d5 +9804c284c4c5e77dabb73f655b12181534ca877c3e1e134aa3f47c23b7ec92277db34d2b0a5d38d2b69e5d1c3008a3e3 +a51b99c3088e473afdaa9e0a9f7e75a373530d3b04e44e1148da0726b95e9f5f0c7e571b2da000310817c36f84b19f7f +ac4ff909933b3b76c726b0a382157cdc74ab851a1ac6cef76953c6444441804cc43abb883363f416592e8f6cfbc4550b +ae7d915eb9fc928b65a29d6edbc75682d08584d0014f7bcf17d59118421ae07d26a02137d1e4de6938bcd1ab8ef48fad +852f7e453b1af89b754df6d11a40d5d41ea057376e8ecacd705aacd2f917457f4a093d6b9a8801837fa0f62986ad7149 +92c6bf5ada5d0c3d4dd8058483de36c215fa98edab9d75242f3eff9db07c734ad67337da6f0eefe23a487bf75a600dee +a2b42c09d0db615853763552a48d2e704542bbd786aae016eb58acbf6c0226c844f5fb31e428cb6450b9db855f8f2a6f +880cc07968266dbfdcfbc21815cd69e0eddfee239167ac693fb0413912d816f2578a74f7716eecd6deefa68c6eccd394 +b885b3ace736cd373e8098bf75ba66fa1c6943ca1bc4408cd98ac7074775c4478594f91154b8a743d9c697e1b29f5840 +a51ce78de512bd87bfa0835de819941dffbf18bec23221b61d8096fc9436af64e0693c335b54e7bfc763f287bdca2db6 +a3c76166a3bdb9b06ef696e57603b58871bc72883ee9d45171a30fe6e1d50e30bc9c51b4a0f5a7270e19a77b89733850 +acefc5c6f8a1e7c24d7b41e0fc7f6f3dc0ede6cf3115ffb9a6e54b1d954cbca9bda8ad7a084be9be245a1b8e9770d141 +b420ed079941842510e31cfad117fa11fb6b4f97dfbc6298cb840f27ebaceba23eeaf3f513bcffbf5e4aae946310182d +95c3bb5ef26c5ed2f035aa5d389c6b3c15a6705b9818a3fefaed28922158b35642b2e8e5a1a620fdad07e75ad4b43af4 +825149f9081ecf07a2a4e3e8b5d21bade86c1a882475d51c55ee909330b70c5a2ac63771c8600c6f38df716af61a3ea1 +873b935aae16d9f08adbc25353cee18af2f1b8d5f26dec6538d6bbddc515f2217ed7d235dcfea59ae61b428798b28637 +9294150843a2bedcedb3bb74c43eb28e759cf9499582c5430bccefb574a8ddd4f11f9929257ff4c153990f9970a2558f +b619563a811cc531da07f4f04e5c4c6423010ff9f8ed7e6ec9449162e3d501b269fb1c564c09c0429431879b0f45df02 +91b509b87eb09f007d839627514658c7341bc76d468920fe8a740a8cb96a7e7e631e0ea584a7e3dc1172266f641d0f5c +8b8aceace9a7b9b4317f1f01308c3904d7663856946afbcea141a1c615e21ccad06b71217413e832166e9dd915fbe098 +87b3b36e725833ea0b0f54753c3728c0dbc87c52d44d705ffc709f2d2394414c652d3283bab28dcce09799504996cee0 +b2670aad5691cbf308e4a6a77a075c4422e6cbe86fdba24e9f84a313e90b0696afb6a067eebb42ba2d10340d6a2f6e51 +876784a9aff3d54faa89b2bacd3ff5862f70195d0b2edc58e8d1068b3c9074c0da1cfa23671fe12f35e33b8a329c0ccd +8b48b9e758e8a8eae182f5cbec96f67d20cca6d3eee80a2d09208eb1d5d872e09ef23d0df8ebbb9b01c7449d0e3e3650 +b79303453100654c04a487bdcadc9e3578bc80930c489a7069a52e8ca1dba36c492c8c899ce025f8364599899baa287d +961b35a6111da54ece6494f24dacd5ea46181f55775b5f03df0e370c34a5046ac2b4082925855325bb42bc2a2c98381d +a31feb1be3f5a0247a1f7d487987eb622e34fca817832904c6ee3ee60277e5847945a6f6ea1ac24542c72e47bdf647df +a12a2aa3e7327e457e1aae30e9612715dd2cfed32892c1cd6dcda4e9a18203af8a44afb46d03b2eed89f6b9c5a2c0c23 +a08265a838e69a2ca2f80fead6ccf16f6366415b920c0b22ee359bcd8d4464ecf156f400a16a7918d52e6d733dd64211 +b723d6344e938d801cca1a00032af200e541d4471fd6cbd38fb9130daa83f6a1dffbbe7e67fc20f9577f884acd7594b2 +a6733d83ec78ba98e72ddd1e7ff79b7adb0e559e256760d0c590a986e742445e8cdf560d44b29439c26d87edd0b07c8c +a61c2c27d3f7b9ff4695a17afedf63818d4bfba390507e1f4d0d806ce8778d9418784430ce3d4199fd3bdbc2504d2af3 +8332f3b63a6dc985376e8b1b25eeae68be6160fbe40053ba7bcf6f073204f682da72321786e422d3482fd60c9e5aa034 +a280f44877583fbb6b860d500b1a3f572e3ee833ec8f06476b3d8002058e25964062feaa1e5bec1536d734a5cfa09145 +a4026a52d277fcea512440d2204f53047718ebfcae7b48ac57ea7f6bfbc5de9d7304db9a9a6cbb273612281049ddaec5 +95cdf69c831ab2fad6c2535ede9c07e663d2ddccc936b64e0843d2df2a7b1c31f1759c3c20f1e7a57b1c8f0dbb21b540 +95c96cec88806469c277ab567863c5209027cecc06c7012358e5f555689c0d9a5ffb219a464f086b45817e8536b86d2f +afe38d4684132a0f03d806a4c8df556bf589b25271fbc6fe2e1ed16de7962b341c5003755da758d0959d2e6499b06c68 +a9b77784fda64987f97c3a23c5e8f61b918be0f7c59ba285084116d60465c4a2aaafc8857eb16823282cc83143eb9126 +a830f05881ad3ce532a55685877f529d32a5dbe56cea57ffad52c4128ee0fad0eeaf0da4362b55075e77eda7babe70e5 +992b3ad190d6578033c13ed5abfee4ef49cbc492babb90061e3c51ee4b5790cdd4c8fc1abff1fa2c00183b6b64f0bbbe +b1015424d9364aeff75de191652dc66484fdbec3e98199a9eb9671ec57bec6a13ff4b38446e28e4d8aedb58dd619cd90 +a745304604075d60c9db36cada4063ac7558e7ec2835d7da8485e58d8422e817457b8da069f56511b02601289fbb8981 +a5ba4330bc5cb3dbe0486ddf995632a7260a46180a08f42ae51a2e47778142132463cc9f10021a9ad36986108fefa1a9 +b419e9fd4babcaf8180d5479db188bb3da232ae77a1c4ed65687c306e6262f8083070a9ac32220cddb3af2ec73114092 +a49e23dc5f3468f3bf3a0bb7e4a114a788b951ff6f23a3396ae9e12cbff0abd1240878a3d1892105413dbc38818e807c +b7ecc7b4831f650202987e85b86bc0053f40d983f252e9832ef503aea81c51221ce93279da4aa7466c026b2d2070e55d +96a8c35cb87f84fa84dcd6399cc2a0fd79cc9158ef4bdde4bae31a129616c8a9f2576cd19baa3f497ca34060979aed7d +8681b2c00aa62c2b519f664a95dcb8faef601a3b961bb4ce5d85a75030f40965e2983871d41ea394aee934e859581548 +85c229a07efa54a713d0790963a392400f55fbb1a43995a535dc6c929f20d6a65cf4efb434e0ad1cb61f689b8011a3bc +90856f7f3444e5ad44651c28e24cc085a5db4d2ffe79aa53228c26718cf53a6e44615f3c5cda5aa752d5f762c4623c66 +978999b7d8aa3f28a04076f74d11c41ef9c89fdfe514936c4238e0f13c38ec97e51a5c078ebc6409e517bfe7ccb42630 +a099914dd7ed934d8e0d363a648e9038eb7c1ec03fa04dbcaa40f7721c618c3ef947afef7a16b4d7ac8c12aa46637f03 +ab2a104fed3c83d16f2cda06878fa5f30c8c9411de71bfb67fd2fc9aa454dcbcf3d299d72f8cc12e919466a50fcf7426 +a4471d111db4418f56915689482f6144efc4664cfb0311727f36c864648d35734351becc48875df96f4abd3cfcf820f9 +83be11727cd30ea94ccc8fa31b09b81c9d6a9a5d3a4686af9da99587332fe78c1f94282f9755854bafd6033549afec91 +88020ff971dc1a01a9e993cd50a5d2131ffdcbb990c1a6aaa54b20d8f23f9546a70918ea57a21530dcc440c1509c24ad +ae24547623465e87905eaffa1fa5d52bb7c453a8dbd89614fa8819a2abcedaf455c2345099b7324ae36eb0ad7c8ef977 +b59b0c60997de1ee00b7c388bc7101d136c9803bf5437b1d589ba57c213f4f835a3e4125b54738e78abbc21b000f2016 +a584c434dfe194546526691b68fa968c831c31da42303a1d735d960901c74011d522246f37f299555416b8cf25c5a548 +80408ce3724f4837d4d52376d255e10f69eb8558399ae5ca6c11b78b98fe67d4b93157d2b9b639f1b5b64198bfe87713 +abb941e8d406c2606e0ddc35c113604fdd9d249eacc51cb64e2991e551b8639ce44d288cc92afa7a1e7fc599cfc84b22 +b223173f560cacb1c21dba0f1713839e348ad02cbfdef0626748604c86f89e0f4c919ed40b583343795bdd519ba952c8 +af1c70512ec3a19d98b8a1fc3ff7f7f5048a27d17d438d43f561974bbdd116fcd5d5c21040f3447af3f0266848d47a15 +8a44809568ebe50405bede19b4d2607199159b26a1b33e03d180e6840c5cf59d991a4fb150d111443235d75ecad085b7 +b06207cdca46b125a27b3221b5b50cf27af4c527dd7c80e2dbcebbb09778a96df3af67e50f07725239ce3583dad60660 +993352d9278814ec89b26a11c4a7c4941bf8f0e6781ae79559d14749ee5def672259792db4587f85f0100c7bb812f933 +9180b8a718b971fd27bc82c8582d19c4b4f012453e8c0ffeeeffe745581fc6c07875ab28be3af3fa3896d19f0c89ac5b +8b8e1263eb48d0fe304032dd5ea1f30e73f0121265f7458ba9054d3626894e8a5fef665340abd2ede9653045c2665938 +99a2beee4a10b7941c24b2092192faf52b819afd033e4a2de050fd6c7f56d364d0cf5f99764c3357cf32399e60fc5d74 +946a4aad7f8647ea60bee2c5fcdeb6f9a58fb2cfca70c4d10e458027a04846e13798c66506151be3df9454b1e417893f +a672a88847652d260b5472d6908d1d57e200f1e492d30dd1cecc441cdfc9b76e016d9bab560efd4d7f3c30801de884a9 +9414e1959c156cde1eb24e628395744db75fc24b9df4595350aaad0bc38e0246c9b4148f6443ef68b8e253a4a6bcf11c +9316e9e4ec5fab4f80d6540df0e3a4774db52f1d759d2e5b5bcd3d7b53597bb007eb1887cb7dc61f62497d51ffc8d996 +902d6d77bb49492c7a00bc4b70277bc28c8bf9888f4307bb017ac75a962decdedf3a4e2cf6c1ea9f9ba551f4610cbbd7 +b07025a18b0e32dd5e12ec6a85781aa3554329ea12c4cd0d3b2c22e43d777ef6f89876dd90a9c8fb097ddf61cf18adc5 +b355a849ad3227caa4476759137e813505ec523cbc2d4105bc7148a4630f9e81918d110479a2d5f5e4cd9ccec9d9d3e3 +b49532cfdf02ee760109881ad030b89c48ee3bb7f219ccafc13c93aead754d29bdafe345be54c482e9d5672bd4505080 +9477802410e263e4f938d57fa8f2a6cac7754c5d38505b73ee35ea3f057aad958cb9722ba6b7b3cfc4524e9ca93f9cdc +9148ea83b4436339580f3dbc9ba51509e9ab13c03063587a57e125432dd0915f5d2a8f456a68f8fff57d5f08c8f34d6e +b00b6b5392b1930b54352c02b1b3b4f6186d20bf21698689bbfc7d13e86538a4397b90e9d5c93fd2054640c4dbe52a4f +926a9702500441243cd446e7cbf15dde16400259726794694b1d9a40263a9fc9e12f7bcbf12a27cb9aaba9e2d5848ddc +a0c6155f42686cbe7684a1dc327100962e13bafcf3db97971fc116d9f5c0c8355377e3d70979cdbd58fd3ea52440901c +a277f899f99edb8791889d0817ea6a96c24a61acfda3ad8c3379e7c62b9d4facc4b965020b588651672fd261a77f1bfc +8f528cebb866b501f91afa50e995234bef5bf20bff13005de99cb51eaac7b4f0bf38580cfd0470de40f577ead5d9ba0f +963fc03a44e9d502cc1d23250efef44d299befd03b898d07ce63ca607bb474b5cf7c965a7b9b0f32198b04a8393821f7 +ab087438d0a51078c378bf4a93bd48ef933ff0f1fa68d02d4460820df564e6642a663b5e50a5fe509527d55cb510ae04 +b0592e1f2c54746bb076be0fa480e1c4bebc4225e1236bcda3b299aa3853e3afb401233bdbcfc4a007b0523a720fbf62 +851613517966de76c1c55a94dc4595f299398a9808f2d2f0a84330ba657ab1f357701d0895f658c18a44cb00547f6f57 +a2fe9a1dd251e72b0fe4db27be508bb55208f8f1616b13d8be288363ec722826b1a1fd729fc561c3369bf13950bf1fd6 +b896cb2bc2d0c77739853bc59b0f89b2e008ba1f701c9cbe3bef035f499e1baee8f0ff1e794854a48c320586a2dfc81a +a1b60f98e5e5106785a9b81a85423452ee9ef980fa7fa8464f4366e73f89c50435a0c37b2906052b8e58e212ebd366cf +a853b0ebd9609656636df2e6acd5d8839c0fda56f7bf9288a943b06f0b67901a32b95e016ca8bc99bd7b5eab31347e72 +b290fa4c1346963bd5225235e6bdf7c542174dab4c908ab483d1745b9b3a6015525e398e1761c90e4b49968d05e30eea +b0f65a33ad18f154f1351f07879a183ad62e5144ad9f3241c2d06533dad09cbb2253949daff1bb02d24d16a3569f7ef0 +a00db59b8d4218faf5aeafcd39231027324408f208ec1f54d55a1c41228b463b88304d909d16b718cfc784213917b71e +b8d695dd33dc2c3bc73d98248c535b2770ad7fa31aa726f0aa4b3299efb0295ba9b4a51c71d314a4a1bd5872307534d1 +b848057cca2ca837ee49c42b88422303e58ea7d2fc76535260eb5bd609255e430514e927cc188324faa8e657396d63ec +92677836061364685c2aaf0313fa32322746074ed5666fd5f142a7e8f87135f45cd10e78a17557a4067a51dfde890371 +a854b22c9056a3a24ab164a53e5c5cf388616c33e67d8ebb4590cb16b2e7d88b54b1393c93760d154208b5ca822dc68f +86fff174920388bfab841118fb076b2b0cdec3fdb6c3d9a476262f82689fb0ed3f1897f7be9dbf0932bb14d346815c63 +99661cf4c94a74e182752bcc4b98a8c2218a8f2765642025048e12e88ba776f14f7be73a2d79bd21a61def757f47f904 +8a8893144d771dca28760cba0f950a5d634195fd401ec8cf1145146286caffb0b1a6ba0c4c1828d0a5480ce49073c64c +938a59ae761359ee2688571e7b7d54692848eb5dde57ffc572b473001ea199786886f8c6346a226209484afb61d2e526 +923f68a6aa6616714cf077cf548aeb845bfdd78f2f6851d8148cba9e33a374017f2f3da186c39b82d14785a093313222 +ac923a93d7da7013e73ce8b4a2b14b8fd0cc93dc29d5de941a70285bdd19be4740fedfe0c56b046689252a3696e9c5bc +b49b32c76d4ec1a2c68d4989285a920a805993bc6fcce6dacd3d2ddae73373050a5c44ba8422a3781050682fa0ef6ba2 +8a367941c07c3bdca5712524a1411bad7945c7c48ffc7103b1d4dff2c25751b0624219d1ccde8c3f70c465f954be5445 +b838f029df455efb6c530d0e370bbbf7d87d61a9aea3d2fe5474c5fe0a39cf235ceecf9693c5c6c5820b1ba8f820bd31 +a8983b7c715eaac7f13a001d2abc462dfc1559dab4a6b554119c271aa8fe00ffcf6b6949a1121f324d6d26cb877bcbae +a2afb24ad95a6f14a6796315fbe0d8d7700d08f0cfaf7a2abe841f5f18d4fecf094406cbd54da7232a159f9c5b6e805e +87e8e95ad2d62f947b2766ff405a23f7a8afba14e7f718a691d95369c79955cdebe24c54662553c60a3f55e6322c0f6f +87c2cbcecb754e0cc96128e707e5c5005c9de07ffd899efa3437cadc23362f5a1d3fcdd30a1f5bdc72af3fb594398c2a +91afd6ee04f0496dc633db88b9370d41c428b04fd991002502da2e9a0ef051bcd7b760e860829a44fbe5539fa65f8525 +8c50e5d1a24515a9dd624fe08b12223a75ca55196f769f24748686315329b337efadca1c63f88bee0ac292dd0a587440 +8a07e8f912a38d94309f317c32068e87f68f51bdfa082d96026f5f5f8a2211621f8a3856dda8069386bf15fb2d28c18f +94ad1dbe341c44eeaf4dc133eed47d8dbfe752575e836c075745770a6679ff1f0e7883b6aa917462993a7f469d74cab5 +8745f8bd86c2bb30efa7efb7725489f2654f3e1ac4ea95bd7ad0f3cfa223055d06c187a16192d9d7bdaea7b050c6a324 +900d149c8d79418cda5955974c450a70845e02e5a4ecbcc584a3ca64d237df73987c303e3eeb79da1af83bf62d9e579f +8f652ab565f677fb1a7ba03b08004e3cda06b86c6f1b0b9ab932e0834acf1370abb2914c15b0d08327b5504e5990681c +9103097d088be1f75ab9d3da879106c2f597e2cc91ec31e73430647bdd5c33bcfd771530d5521e7e14df6acda44f38a6 +b0fec7791cfb0f96e60601e1aeced9a92446b61fedab832539d1d1037558612d78419efa87ff5f6b7aab8fd697d4d9de +b9d2945bdb188b98958854ba287eb0480ef614199c4235ce5f15fc670b8c5ffe8eeb120c09c53ea8a543a022e6a321ac +a9461bb7d5490973ebaa51afc0bb4a5e42acdccb80e2f939e88b77ac28a98870e103e1042899750f8667a8cc9123bae9 +a37fdf11d4bcb2aed74b9f460a30aa34afea93386fa4cdb690f0a71bc58f0b8df60bec56e7a24f225978b862626fa00e +a214420e183e03d531cf91661466ea2187d84b6e814b8b20b3730a9400a7d25cf23181bb85589ebc982cec414f5c2923 +ad09a45a698a6beb3e0915f540ef16e9af7087f53328972532d6b5dfe98ce4020555ece65c6cbad8bd6be8a4dfefe6fd +ab6742800b02728c92d806976764cb027413d6f86edd08ad8bb5922a2969ee9836878cd39db70db0bd9a2646862acc4f +974ca9305bd5ea1dc1755dff3b63e8bfe9f744321046c1395659bcea2a987b528e64d5aa96ac7b015650b2253b37888d +84eee9d6bce039c52c2ebc4fccc0ad70e20c82f47c558098da4be2f386a493cbc76adc795b5488c8d11b6518c2c4fab8 +875d7bda46efcb63944e1ccf760a20144df3b00d53282b781e95f12bfc8f8316dfe6492c2efbf796f1150e36e436e9df +b68a2208e0c587b5c31b5f6cb32d3e6058a9642e2d9855da4f85566e1412db528475892060bb932c55b3a80877ad7b4a +ba006368ecab5febb6ab348644d9b63de202293085ed468df8bc24d992ae8ce468470aa37f36a73630c789fb9c819b30 +90a196035150846cd2b482c7b17027471372a8ce7d914c4d82b6ea7fa705d8ed5817bd42d63886242585baf7d1397a1c +a223b4c85e0daa8434b015fd9170b5561fe676664b67064974a1e9325066ecf88fc81f97ab5011c59fad28cedd04b240 +82e8ec43139cf15c6bbeed484b62e06cded8a39b5ce0389e4cbe9c9e9c02f2f0275d8d8d4e8dfec8f69a191bef220408 +81a3fc07a7b68d92c6ee4b6d28f5653ee9ec85f7e2ee1c51c075c1b130a8c5097dc661cf10c5aff1c7114b1a6a19f11a +8ed2ef8331546d98819a5dd0e6c9f8cb2630d0847671314a28f277faf68da080b53891dd75c82cbcf7788b255490785d +acecabf84a6f9bbed6b2fc2e7e4b48f02ef2f15e597538a73aea8f98addc6badda15e4695a67ecdb505c1554e8f345ec +b8f51019b2aa575f8476e03dcadf86cc8391f007e5f922c2a36b2daa63f5a503646a468990cd5c65148d323942193051 +aaa595a84b403ec65729bc1c8055a94f874bf9adddc6c507b3e1f24f79d3ad359595a672b93aab3394db4e2d4a7d8970 +895144c55fcbd0f64d7dd69e6855cfb956e02b5658eadf0f026a70703f3643037268fdd673b0d21b288578a83c6338dd +a2e92ae6d0d237d1274259a8f99d4ea4912a299816350b876fba5ebc60b714490e198a916e1c38c6e020a792496fa23c +a45795fda3b5bb0ad1d3c628f6add5b2a4473a1414c1a232e80e70d1cfffd7f8a8d9861f8df2946999d7dbb56bf60113 +b6659bf7f6f2fef61c39923e8c23b8c70e9c903028d8f62516d16755cd3fba2fe41c285aa9432dc75ab08f8a1d8a81fc +a735609a6bc5bfd85e58234fc439ff1f58f1ff1dd966c5921d8b649e21f006bf2b8642ad8a75063c159aaf6935789293 +a3c622eb387c9d15e7bda2e3e84d007cb13a6d50d655c3f2f289758e49d3b37b9a35e4535d3cc53d8efd51f407281f19 +8afe147b53ad99220f5ef9d763bfc91f9c20caecbcf823564236fb0e6ede49414c57d71eec4772c8715cc65a81af0047 +b5f0203233cf71913951e9c9c4e10d9243e3e4a1f2cb235bf3f42009120ba96e04aa414c9938ea8873b63148478927e8 +93c52493361b458d196172d7ba982a90a4f79f03aa8008edc322950de3ce6acf4c3977807a2ffa9e924047e02072b229 +b9e72b805c8ac56503f4a86c82720afbd5c73654408a22a2ac0b2e5caccdfb0e20b59807433a6233bc97ae58cf14c70a +af0475779b5cee278cca14c82da2a9f9c8ef222eb885e8c50cca2315fea420de6e04146590ed0dd5a29c0e0812964df5 +b430ccab85690db02c2d0eb610f3197884ca12bc5f23c51e282bf3a6aa7e4a79222c3d8761454caf55d6c01a327595f9 +830032937418b26ee6da9b5206f3e24dc76acd98589e37937e963a8333e5430abd6ce3dd93ef4b8997bd41440eed75d6 +8820a6d73180f3fe255199f3f175c5eb770461ad5cfdde2fb11508041ed19b8c4ce66ad6ecebf7d7e836cc2318df47ca +aef1393e7d97278e77bbf52ef6e1c1d5db721ccf75fe753cf47a881fa034ca61eaa5098ee5a344c156d2b14ff9e284ad +8a4a26c07218948c1196c45d927ef4d2c42ade5e29fe7a91eaebe34a29900072ce5194cf28d51f746f4c4c649daf4396 +84011dc150b7177abdcb715efbd8c201f9cb39c36e6069af5c50a096021768ba40cef45b659c70915af209f904ede3b6 +b1bd90675411389bb66910b21a4bbb50edce5330850c5ab0b682393950124252766fc81f5ecfc72fb7184387238c402e +8dfdcd30583b696d2c7744655f79809f451a60c9ad5bf1226dc078b19f4585d7b3ef7fa9d54e1ac09520d95cbfd20928 +b351b4dc6d98f75b8e5a48eb7c6f6e4b78451991c9ba630e5a1b9874c15ac450cd409c1a024713bf2cf82dc400e025ef +a462b8bc97ac668b97b28b3ae24b9f5de60e098d7b23ecb600d2194cd35827fb79f77c3e50d358f5bd72ee83fef18fa0 +a183753265c5f7890270821880cce5f9b2965b115ba783c6dba9769536f57a04465d7da5049c7cf8b3fcf48146173c18 +a8a771b81ed0d09e0da4d79f990e58eabcd2be3a2680419502dd592783fe52f657fe55125b385c41d0ba3b9b9cf54a83 +a71ec577db46011689d073245e3b1c3222a9b1fe6aa5b83629adec5733dd48617ebea91346f0dd0e6cdaa86e4931b168 +a334b8b244f0d598a02da6ae0f918a7857a54dce928376c4c85df15f3b0f2ba3ac321296b8b7c9dd47d770daf16c8f8c +a29037f8ef925c417c90c4df4f9fb27fb977d04e2b3dd5e8547d33e92ab72e7a00f5461de21e28835319eae5db145eb7 +b91054108ae78b00e3298d667b913ebc44d8f26e531eae78a8fe26fdfb60271c97efb2dee5f47ef5a3c15c8228138927 +926c13efbe90604f6244be9315a34f72a1f8d1aab7572df431998949c378cddbf2fe393502c930fff614ff06ae98a0ce +995c758fd5600e6537089b1baa4fbe0376ab274ff3e82a17768b40df6f91c2e443411de9cafa1e65ea88fb8b87d504f4 +9245ba307a7a90847da75fca8d77ec03fdfc812c871e7a2529c56a0a79a6de16084258e7a9ac4ae8a3756f394336e21c +99e0cfa2bb57a7e624231317044c15e52196ecce020db567c8e8cb960354a0be9862ee0c128c60b44777e65ac315e59f +ad4f6b3d27bbbb744126601053c3dc98c07ff0eb0b38a898bd80dce778372846d67e5ab8fb34fb3ad0ef3f235d77ba7f +a0f12cae3722bbbca2e539eb9cc7614632a2aefe51410430070a12b5bc5314ecec5857b7ff8f41e9980cac23064f7c56 +b487f1bc59485848c98222fd3bc36c8c9bb3d2912e2911f4ceca32c840a7921477f9b1fe00877e05c96c75d3eecae061 +a6033db53925654e18ecb3ce715715c36165d7035db9397087ac3a0585e587998a53973d011ac6d48af439493029cee6 +a6b4d09cd01c70a3311fd131d3710ccf97bde3e7b80efd5a8c0eaeffeb48cca0f951ced905290267b115b06d46f2693b +a9dff1df0a8f4f218a98b6f818a693fb0d611fed0fc3143537cbd6578d479af13a653a8155e535548a2a0628ae24fa58 +a58e469f65d366b519f9a394cacb7edaddac214463b7b6d62c2dbc1316e11c6c5184ce45c16de2d77f990dcdd8b55430 +989e71734f8119103586dc9a3c5f5033ddc815a21018b34c1f876cdfc112efa868d5751bf6419323e4e59fa6a03ece1c +a2da00e05036c884369e04cf55f3de7d659cd5fa3f849092b2519dd263694efe0f051953d9d94b7e121f0aee8b6174d7 +968f3c029f57ee31c4e1adea89a7f92e28483af9a74f30fbdb995dc2d40e8e657dff8f8d340d4a92bf65f54440f2859f +932778df6f60ac1639c1453ef0cbd2bf67592759dcccb3e96dcc743ff01679e4c7dd0ef2b0833dda548d32cb4eba49e2 +a805a31139f8e0d6dae1ac87d454b23a3dc9fc653d4ca18d4f8ebab30fc189c16e73981c2cb7dd6f8c30454a5208109d +a9ba0991296caa2aaa4a1ceacfb205544c2a2ec97088eace1d84ee5e2767656a172f75d2f0c4e16a3640a0e0dec316e0 +b1e49055c968dced47ec95ae934cf45023836d180702e20e2df57e0f62fb85d7ac60d657ba3ae13b8560b67210449459 +a94e1da570a38809c71e37571066acabff7bf5632737c9ab6e4a32856924bf6211139ab3cedbf083850ff2d0e0c0fcfc +88ef1bb322000c5a5515b310c838c9af4c1cdbb32eab1c83ac3b2283191cd40e9573747d663763a28dad0d64adc13840 +a987ce205f923100df0fbd5a85f22c9b99b9b9cbe6ddfa8dfda1b8fe95b4f71ff01d6c5b64ca02eb24edb2b255a14ef0 +84fe8221a9e95d9178359918a108de4763ebfa7a6487facb9c963406882a08a9a93f492f8e77cf9e7ea41ae079c45993 +aa1cf3dc7c5dcfa15bbbc811a4bb6dbac4fba4f97fb1ed344ab60264d7051f6eef19ea9773441d89929ee942ed089319 +8f6a7d610d59d9f54689bbe6a41f92d9f6096cde919c1ab94c3c7fcecf0851423bc191e5612349e10f855121c0570f56 +b5af1fa7894428a53ea520f260f3dc3726da245026b6d5d240625380bfb9c7c186df0204bb604efac5e613a70af5106e +a5bce6055ff812e72ce105f147147c7d48d7a2313884dd1f488b1240ee320f13e8a33f5441953a8e7a3209f65b673ce1 +b9b55b4a1422677d95821e1d042ab81bbf0bf087496504021ec2e17e238c2ca6b44fb3b635a5c9eac0871a724b8d47c3 +941c38e533ce4a673a3830845b56786585e5fe49c427f2e5c279fc6db08530c8f91db3e6c7822ec6bb4f956940052d18 +a38e191d66c625f975313c7007bbe7431b5a06ed2da1290a7d5d0f2ec73770d476efd07b8e632de64597d47df175cbb0 +94ba76b667abf055621db4c4145d18743a368d951565632ed4e743dd50dd3333507c0c34f286a5c5fdbf38191a2255cd +a5ca38c60be5602f2bfa6e00c687ac96ac36d517145018ddbee6f12eb0faa63dd57909b9eeed26085fe5ac44e55d10ab +b00fea3b825e60c1ed1c5deb4b551aa65a340e5af36b17d5262c9cd2c508711e4dc50dc2521a2c16c7c901902266e64a +971b86fc4033485e235ccb0997a236206ba25c6859075edbcdf3c943116a5030b7f75ebca9753d863a522ba21a215a90 +b3b31f52370de246ee215400975b674f6da39b2f32514fe6bd54e747752eedca22bb840493b44a67df42a3639c5f901f +affbbfac9c1ba7cbfa1839d2ae271dd6149869b75790bf103230637da41857fc326ef3552ff31c15bda0694080198143 +a95d42aa7ef1962520845aa3688f2752d291926f7b0d73ea2ee24f0612c03b43f2b0fe3c9a9a99620ffc8d487b981bc2 +914a266065caf64985e8c5b1cb2e3f4e3fe94d7d085a1881b1fefa435afef4e1b39a98551d096a62e4f5cc1a7f0fdc2e +81a0b4a96e2b75bc1bf2dbd165d58d55cfd259000a35504d1ffb18bc346a3e6f07602c683723864ffb980f840836fd8d +91c1556631cddd4c00b65b67962b39e4a33429029d311c8acf73a18600e362304fb68bccb56fde40f49e95b7829e0b87 +8befbacc19e57f7c885d1b7a6028359eb3d80792fe13b92a8400df21ce48deb0bb60f2ddb50e3d74f39f85d7eab23adc +92f9458d674df6e990789690ec9ca73dacb67fc9255b58c417c555a8cc1208ace56e8e538f86ba0f3615573a0fbac00d +b4b1b3062512d6ae7417850c08c13f707d5838e43d48eb98dd4621baf62eee9e82348f80fe9b888a12874bfa538771f8 +a13c4a3ac642ede37d9c883f5319e748d2b938f708c9d779714108a449b343f7b71a6e3ef4080fee125b416762920273 +af44983d5fc8cceee0551ef934e6e653f2d3efa385e5c8a27a272463a6f333e290378cc307c2b664eb923c78994e706e +a389fd6c59fe2b4031cc244e22d3991e541bd203dd5b5e73a6159e72df1ab41d49994961500dcde7989e945213184778 +8d2141e4a17836c548de9598d7b298b03f0e6c73b7364979a411c464e0628e21cff6ac3d6decdba5d1c4909eff479761 +980b22ef53b7bdf188a3f14bc51b0dbfdf9c758826daa3cbc1e3986022406a8aa9a6a79e400567120b88c67faa35ce5f +a28882f0a055f96df3711de5d0aa69473e71245f4f3e9aa944e9d1fb166e02caa50832e46da6d3a03b4801735fd01b29 +8db106a37d7b88f5d995c126abb563934dd8de516af48e85695d02b1aea07f79217e3cdd03c6f5ca57421830186c772b +b5a7e50da0559a675c472f7dfaee456caab6695ab7870541b2be8c2b118c63752427184aad81f0e1afc61aef1f28c46f +9962118780e20fe291d10b64f28d09442a8e1b5cffd0f3dd68d980d0614050a626c616b44e9807fbee7accecae00686a +b38ddf33745e8d2ad6a991aefaf656a33c5f8cbe5d5b6b6fd03bd962153d8fd0e01b5f8f96d80ae53ab28d593ab1d4e7 +857dc12c0544ff2c0c703761d901aba636415dee45618aba2e3454ff9cbc634a85c8b05565e88520ff9be2d097c8b2b1 +a80d465c3f8cc63af6d74a6a5086b626c1cb4a8c0fee425964c3bd203d9d7094e299f81ce96d58afc20c8c9a029d9dae +89e1c8fbde8563763be483123a3ed702efac189c6d8ab4d16c85e74bbaf856048cc42d5d6e138633a38572ba5ec3f594 +893a594cf495535f6d216508f8d03c317dcf03446668cba688da90f52d0111ac83d76ad09bf5ea47056846585ee5c791 +aadbd8be0ae452f7f9450c7d2957598a20cbf10139a4023a78b4438172d62b18b0de39754dd2f8862dbd50a3a0815e53 +ae7d39670ecca3eb6db2095da2517a581b0e8853bdfef619b1fad9aacd443e7e6a40f18209fadd44038a55085c5fe8b2 +866ef241520eacb6331593cfcb206f7409d2f33d04542e6e52cba5447934e02d44c471f6c9a45963f9307e9809ab91d9 +b1a09911ad3864678f7be79a9c3c3eb5c84a0a45f8dcb52c67148f43439aeaaa9fd3ed3471276b7e588b49d6ebe3033a +add07b7f0dbb34049cd8feeb3c18da5944bf706871cfd9f14ff72f6c59ad217ebb1f0258b13b167851929387e4e34cfe +ae048892d5c328eefbdd4fba67d95901e3c14d974bfc0a1fc68155ca9f0d59e61d7ba17c6c9948b120cf35fd26e6fee9 +9185b4f3b7da0ddb4e0d0f09b8a9e0d6943a4611e43f13c3e2a767ed8592d31e0ba3ebe1914026a3627680274291f6e5 +a9c022d4e37b0802284ce3b7ee9258628ab4044f0db4de53d1c3efba9de19d15d65cc5e608dbe149c21c2af47d0b07b5 +b24dbd5852f8f24921a4e27013b6c3fa8885b973266cb839b9c388efad95821d5d746348179dcc07542bd0d0aefad1ce +b5fb4f279300876a539a27a441348764908bc0051ebd66dc51739807305e73db3d2f6f0f294ffb91b508ab150eaf8527 +ace50841e718265b290c3483ed4b0fdd1175338c5f1f7530ae9a0e75d5f80216f4de37536adcbc8d8c95982e88808cd0 +b19cadcde0f63bd1a9c24bd9c2806f53c14c0b9735bf351601498408ba503ddbd2037c891041cbba47f58b8c483f3b21 +b6061e63558d312eb891b97b39aa552fa218568d79ee26fe6dd5b864aea9e3216d8f2e2f3b093503be274766dac41426 +89730fdb2876ab6f0fe780d695f6e12090259027e789b819956d786e977518057e5d1d7f5ab24a3ae3d5d4c97773bd2b +b6fa841e81f9f2cad0163a02a63ae96dc341f7ae803b616efc6e1da2fbea551c1b96b11ad02c4afbdf6d0cc9f23da172 +8fb66187182629c861ddb6896d7ed3caf2ad050c3dba8ab8eb0d7a2c924c3d44c48d1a148f9e33fb1f061b86972f8d21 +86022ac339c1f84a7fa9e05358c1a5b316b4fc0b83dbe9c8c7225dc514f709d66490b539359b084ce776e301024345fa +b50b9c321468da950f01480bb62b6edafd42f83c0001d6e97f2bd523a1c49a0e8574fb66380ea28d23a7c4d54784f9f0 +a31c05f7032f30d1dac06678be64d0250a071fd655e557400e4a7f4c152be4d5c7aa32529baf3e5be7c4bd49820054f6 +b95ac0848cd322684772119f5b682d90a66bbf9dac411d9d86d2c34844bbd944dbaf8e47aa41380455abd51687931a78 +ae4a6a5ce9553b65a05f7935e61e496a4a0f6fd8203367a2c627394c9ce1e280750297b74cdc48fd1d9a31e93f97bef4 +a22daf35f6e9b05e52e0b07f7bd1dbbebd2c263033fb0e1b2c804e2d964e2f11bc0ece6aca6af079dd3a9939c9c80674 +902150e0cb1f16b9b59690db35281e28998ce275acb313900da8b2d8dfd29fa1795f8ca3ff820c31d0697de29df347c1 +b17b5104a5dc665cdd7d47e476153d715eb78c6e5199303e4b5445c21a7fa7cf85fe7cfd08d7570f4e84e579b005428c +a03f49b81c15433f121680aa02d734bb9e363af2156654a62bcb5b2ba2218398ccb0ff61104ea5d7df5b16ea18623b1e +802101abd5d3c88876e75a27ffc2f9ddcce75e6b24f23dba03e5201281a7bd5cc7530b6a003be92d225093ca17d3c3bb +a4d183f63c1b4521a6b52226fc19106158fc8ea402461a5cccdaa35fee93669df6a8661f45c1750cd01308149b7bf08e +8d17c22e0c8403b69736364d460b3014775c591032604413d20a5096a94d4030d7c50b9fe3240e31d0311efcf9816a47 +947225acfcce5992eab96276f668c3cbe5f298b90a59f2bb213be9997d8850919e8f496f182689b5cbd54084a7332482 +8df6f4ed216fc8d1905e06163ba1c90d336ab991a18564b0169623eb39b84e627fa267397da15d3ed754d1f3423bff07 +83480007a88f1a36dea464c32b849a3a999316044f12281e2e1c25f07d495f9b1710b4ba0d88e9560e72433addd50bc2 +b3019d6e591cf5b33eb972e49e06c6d0a82a73a75d78d383dd6f6a4269838289e6e07c245f54fed67f5c9bb0fd5e1c5f +92e8ce05e94927a9fb02debadb99cf30a26172b2705003a2c0c47b3d8002bf1060edb0f6a5750aad827c98a656b19199 +ac2aff801448dbbfc13cca7d603fd9c69e82100d997faf11f465323b97255504f10c0c77401e4d1890339d8b224f5803 +b0453d9903d08f508ee27e577445dc098baed6cde0ac984b42e0f0efed62760bd58d5816cf1e109d204607b7b175e30c +ae68dc4ba5067e825d46d2c7c67f1009ceb49d68e8d3e4c57f4bcd299eb2de3575d42ea45e8722f8f28497a6e14a1cfe +b22486c2f5b51d72335ce819bbafb7fa25eb1c28a378a658f13f9fc79cd20083a7e573248d911231b45a5cf23b561ca7 +89d1201d1dbd6921867341471488b4d2fd0fc773ae1d4d074c78ae2eb779a59b64c00452c2a0255826fca6b3d03be2b1 +a2998977c91c7a53dc6104f5bc0a5b675e5350f835e2f0af69825db8af4aeb68435bdbcc795f3dd1f55e1dd50bc0507f +b0be4937a925b3c05056ed621910d535ccabf5ab99fd3b9335080b0e51d9607d0fd36cb5781ff340018f6acfca4a9736 +aea145a0f6e0ba9df8e52e84bb9c9de2c2dc822f70d2724029b153eb68ee9c17de7d35063dcd6a39c37c59fdd12138f7 +91cb4545d7165ee8ffbc74c874baceca11fdebbc7387908d1a25877ca3c57f2c5def424dab24148826832f1e880bede0 +b3b579cb77573f19c571ad5eeeb21f65548d7dff9d298b8d7418c11f3e8cd3727c5b467f013cb87d6861cfaceee0d2e3 +b98a1eeec2b19fecc8378c876d73645aa52fb99e4819903735b2c7a885b242787a30d1269a04bfb8573d72d9bbc5f0f0 +940c1f01ed362bd588b950c27f8cc1d52276c71bb153d47f07ec85b038c11d9a8424b7904f424423e714454d5e80d1cd +aa343a8ecf09ce11599b8cf22f7279cf80f06dbf9f6d62cb05308dbbb39c46fd0a4a1240b032665fbb488a767379b91b +87c3ac72084aca5974599d3232e11d416348719e08443acaba2b328923af945031f86432e170dcdd103774ec92e988c9 +91d6486eb5e61d2b9a9e742c20ec974a47627c6096b3da56209c2b4e4757f007e793ebb63b2b246857c9839b64dc0233 +aebcd3257d295747dd6fc4ff910d839dd80c51c173ae59b8b2ec937747c2072fa85e3017f9060aa509af88dfc7529481 +b3075ba6668ca04eff19efbfa3356b92f0ab12632dcda99cf8c655f35b7928c304218e0f9799d68ef9f809a1492ff7db +93ba7468bb325639ec2abd4d55179c69fd04eaaf39fc5340709227bbaa4ad0a54ea8b480a1a3c8d44684e3be0f8d1980 +a6aef86c8c0d92839f38544d91b767c582568b391071228ff5a5a6b859c87bf4f81a7d926094a4ada1993ddbd677a920 +91dcd6d14207aa569194aa224d1e5037b999b69ade52843315ca61ba26abe9a76412c9e88259bc5cf5d7b95b97d9c3bc +b3b483d31c88f78d49bd065893bc1e3d2aa637e27dedb46d9a7d60be7660ce7a10aaaa7deead362284a52e6d14021178 +8e5730070acf8371461ef301cc4523e8e672aa0e3d945d438a0e0aa6bdf8cb9c685dcf38df429037b0c8aff3955c6f5b +b8c6d769890a8ee18dc4f9e917993315877c97549549b34785a92543cbeec96a08ae3a28d6e809c4aacd69de356c0012 +95ca86cd384eaceaa7c077c5615736ca31f36824bd6451a16142a1edc129fa42b50724aeed7c738f08d7b157f78b569e +94df609c6d71e8eee7ab74226e371ccc77e01738fe0ef1a6424435b4570fe1e5d15797b66ed0f64eb88d4a3a37631f0e +89057b9783212add6a0690d6bb99097b182738deff2bd9e147d7fd7d6c8eacb4c219923633e6309ad993c24572289901 +83a0f9f5f265c5a0e54defa87128240235e24498f20965009fef664f505a360b6fb4020f2742565dfc7746eb185bcec0 +91170da5306128931349bc3ed50d7df0e48a68b8cc8420975170723ac79d8773e4fa13c5f14dc6e3fafcad78379050b1 +b7178484d1b55f7e56a4cc250b6b2ec6040437d96bdfddfa7b35ed27435860f3855c2eb86c636f2911b012eb83b00db8 +ac0b00c4322d1e4208e09cd977b4e54d221133ff09551f75b32b0b55d0e2be80941dda26257b0e288c162e63c7e9cf68 +9690ed9e7e53ed37ff362930e4096b878b12234c332fd19d5d064824084245952eda9f979e0098110d6963e468cf513e +b6fa547bb0bb83e5c5be0ed462a8783fba119041c136a250045c09d0d2af330c604331e7de960df976ff76d67f8000cd +814603907c21463bcf4e59cfb43066dfe1a50344ae04ef03c87c0f61b30836c3f4dea0851d6fa358c620045b7f9214c8 +9495639e3939fad2a3df00a88603a5a180f3c3a0fe4d424c35060e2043e0921788003689887b1ed5be424d9a89bb18bb +aba4c02d8d57f2c92d5bc765885849e9ff8393d6554f5e5f3e907e5bfac041193a0d8716d7861104a4295d5a03c36b03 +8ead0b56c1ca49723f94a998ba113b9058059321da72d9e395a667e6a63d5a9dac0f5717cec343f021695e8ced1f72af +b43037f7e3852c34ed918c5854cd74e9d5799eeddfe457d4f93bb494801a064735e326a76e1f5e50a339844a2f4a8ec9 +99db8422bb7302199eb0ff3c3d08821f8c32f53a600c5b6fb43e41205d96adae72be5b460773d1280ad1acb806af9be8 +8a9be08eae0086c0f020838925984df345c5512ff32e37120b644512b1d9d4fecf0fd30639ca90fc6cf334a86770d536 +81b43614f1c28aa3713a309a88a782fb2bdfc4261dd52ddc204687791a40cf5fd6a263a8179388596582cccf0162efc2 +a9f3a8b76912deb61d966c75daf5ddb868702ebec91bd4033471c8e533183df548742a81a2671de5be63a502d827437d +902e2415077f063e638207dc7e14109652e42ab47caccd6204e2870115791c9defac5425fd360b37ac0f7bd8fe7011f8 +aa18e4fdc1381b59c18503ae6f6f2d6943445bd00dd7d4a2ad7e5adad7027f2263832690be30d456e6d772ad76f22350 +a348b40ba3ba7d81c5d4631f038186ebd5e5f314f1ea737259151b07c3cc8cf0c6ed4201e71bcc1c22fefda81a20cde6 +aa1306f7ac1acbfc47dc6f7a0cb6d03786cec8c8dc8060388ccda777bca24bdc634d03e53512c23dba79709ff64f8620 +818ccfe46e700567b7f3eb400e5a35f6a5e39b3db3aa8bc07f58ace35d9ae5a242faf8dbccd08d9a9175bbce15612155 +b7e3da2282b65dc8333592bb345a473f03bd6df69170055fec60222de9897184536bf22b9388b08160321144d0940279 +a4d976be0f0568f4e57de1460a1729129252b44c552a69fceec44e5b97c96c711763360d11f9e5bf6d86b4976bf40d69 +85d185f0397c24c2b875b09b6328a23b87982b84ee880f2677a22ff4c9a1ba9f0fea000bb3f7f66375a00d98ebafce17 +b4ccbb8c3a2606bd9b87ce022704663af71d418351575f3b350d294f4efc68c26f9a2ce49ff81e6ff29c3b63d746294e +93ffd3265fddb63724dfde261d1f9e22f15ecf39df28e4d89e9fea03221e8e88b5dd9b77628bacaa783c6f91802d47cc +b1fd0f8d7a01378e693da98d03a2d2fda6b099d03454b6f2b1fa6472ff6bb092751ce6290059826b74ac0361eab00e1e +a89f440c71c561641589796994dd2769616b9088766e983c873fae0716b95c386c8483ab8a4f367b6a68b72b7456dd32 +af4fe92b01d42d03dd5d1e7fa55e96d4bbcb7bf7d4c8c197acd16b3e0f3455807199f683dcd263d74547ef9c244b35cc +a8227f6e0a344dfe76bfbe7a1861be32c4f4bed587ccce09f9ce2cf481b2dda8ae4f566154bc663d15f962f2d41761bd +a7b361663f7495939ed7f518ba45ea9ff576c4e628995b7aea026480c17a71d63fc2c922319f0502eb7ef8f14a406882 +8ddcf382a9f39f75777160967c07012cfa89e67b19714a7191f0c68eaf263935e5504e1104aaabd0899348c972a8d3c6 +98c95b9f6f5c91f805fb185eedd06c6fc4457d37dd248d0be45a6a168a70031715165ea20606245cbdf8815dc0ac697f +805b44f96e001e5909834f70c09be3efcd3b43632bcac5b6b66b6d227a03a758e4b1768ce2a723045681a1d34562aaeb +b0e81b07cdc45b3dca60882676d9badb99f25c461b7efe56e3043b80100bb62d29e1873ae25eb83087273160ece72a55 +b0c53f0abe78ee86c7b78c82ae1f7c070bb0b9c45c563a8b3baa2c515d482d7507bb80771e60b38ac13f78b8af92b4a9 +a7838ef6696a9e4d2e5dfd581f6c8d6a700467e8fd4e85adabb5f7a56f514785dd4ab64f6f1b48366f7d94728359441b +88c76f7700a1d23c30366a1d8612a796da57b2500f97f88fdf2d76b045a9d24e7426a8ffa2f4e86d3046937a841dad58 +ad8964baf98c1f02e088d1d9fcb3af6b1dfa44cdfe0ed2eae684e7187c33d3a3c28c38e8f4e015f9c04d451ed6f85ff6 +90e9d00a098317ececaa9574da91fc149eda5b772dedb3e5a39636da6603aa007804fa86358550cfeff9be5a2cb7845e +a56ff4ddd73d9a6f5ab23bb77efa25977917df63571b269f6a999e1ad6681a88387fcc4ca3b26d57badf91b236503a29 +97ad839a6302c410a47e245df84c01fb9c4dfef86751af3f9340e86ff8fc3cd52fa5ff0b9a0bd1d9f453e02ca80658a6 +a4c8c44cbffa804129e123474854645107d1f0f463c45c30fd168848ebea94880f7c0c5a45183e9eb837f346270bdb35 +a72e53d0a1586d736e86427a93569f52edd2f42b01e78aee7e1961c2b63522423877ae3ac1227a2cf1e69f8e1ff15bc3 +8559f88a7ef13b4f09ac82ae458bbae6ab25671cfbf52dae7eac7280d6565dd3f0c3286aec1a56a8a16dc3b61d78ce47 +8221503f4cdbed550876c5dc118a3f2f17800c04e8be000266633c83777b039a432d576f3a36c8a01e8fd18289ebc10b +99bfbe5f3e46d4d898a578ba86ed26de7ed23914bd3bcdf3c791c0bcd49398a52419077354a5ab75cea63b6c871c6e96 +aa134416d8ff46f2acd866c1074af67566cfcf4e8be8d97329dfa0f603e1ff208488831ce5948ac8d75bfcba058ddcaa +b02609d65ebfe1fe8e52f21224a022ea4b5ea8c1bd6e7b9792eed8975fc387cdf9e3b419b8dd5bcce80703ab3a12a45f +a4f14798508698fa3852e5cac42a9db9797ecee7672a54988aa74037d334819aa7b2ac7b14efea6b81c509134a6b7ad2 +884f01afecbcb987cb3e7c489c43155c416ed41340f61ecb651d8cba884fb9274f6d9e7e4a46dd220253ae561614e44c +a05523c9e71dce1fe5307cc71bd721feb3e1a0f57a7d17c7d1c9fb080d44527b7dbaa1f817b1af1c0b4322e37bc4bb1e +8560aec176a4242b39f39433dd5a02d554248c9e49d3179530815f5031fee78ba9c71a35ceeb2b9d1f04c3617c13d8f0 +996aefd402748d8472477cae76d5a2b92e3f092fc834d5222ae50194dd884c9fb8b6ed8e5ccf8f6ed483ddbb4e80c747 +8fd09900320000cbabc40e16893e2fcf08815d288ec19345ad7b6bb22f7d78a52b6575a3ca1ca2f8bc252d2eafc928ec +939e51f73022bc5dc6862a0adf8fb8a3246b7bfb9943cbb4b27c73743926cc20f615a036c7e5b90c80840e7f1bfee0e7 +a0a6258700cadbb9e241f50766573bf9bdb7ad380b1079dc3afb4054363d838e177b869cad000314186936e40359b1f2 +972699a4131c8ed27a2d0e2104d54a65a7ff1c450ad9da3a325c662ab26869c21b0a84d0700b98c8b5f6ce3b746873d7 +a454c7fe870cb8aa6491eafbfb5f7872d6e696033f92e4991d057b59d70671f2acdabef533e229878b60c7fff8f748b1 +a167969477214201f09c79027b10221e4707662e0c0fde81a0f628249f2f8a859ce3d30a7dcc03b8ecca8f7828ad85c7 +8ff6b7265175beb8a63e1dbf18c9153fb2578c207c781282374f51b40d57a84fd2ef2ea2b9c6df4a54646788a62fd17f +a3d7ebeccde69d73d8b3e76af0da1a30884bb59729503ff0fb0c3bccf9221651b974a6e72ea33b7956fc3ae758226495 +b71ef144c9a98ce5935620cb86c1590bd4f48e5a2815d25c0cdb008fde628cf628c31450d3d4f67abbfeb16178a74cfd +b5e0a16d115134f4e2503990e3f2035ed66b9ccf767063fe6747870d97d73b10bc76ed668550cb82eedc9a2ca6f75524 +b30ffaaf94ee8cbc42aa2c413175b68afdb207dbf351fb20be3852cb7961b635c22838da97eaf43b103aff37e9e725cc +98aa7d52284f6c1f22e272fbddd8c8698cf8f5fbb702d5de96452141fafb559622815981e50b87a72c2b1190f59a7deb +81fbacda3905cfaf7780bb4850730c44166ed26a7c8d07197a5d4dcd969c09e94a0461638431476c16397dd7bdc449f9 +95e47021c1726eac2e5853f570d6225332c6e48e04c9738690d53e07c6b979283ebae31e2af1fc9c9b3e59f87e5195b1 +ac024a661ba568426bb8fce21780406537f518075c066276197300841e811860696f7588188bc01d90bace7bc73d56e3 +a4ebcaf668a888dd404988ab978594dee193dad2d0aec5cdc0ccaf4ec9a7a8228aa663db1da8ddc52ec8472178e40c32 +a20421b8eaf2199d93b083f2aff37fb662670bd18689d046ae976d1db1fedd2c2ff897985ecc6277b396db7da68bcb27 +8bc33d4b40197fd4d49d1de47489d10b90d9b346828f53a82256f3e9212b0cbc6930b895e879da9cec9fedf026aadb3e +aaafdd1bec8b757f55a0433eddc0a39f818591954fd4e982003437fcceb317423ad7ee74dbf17a2960380e7067a6b4e2 +aad34277ebaed81a6ec154d16736866f95832803af28aa5625bf0461a71d02b1faba02d9d9e002be51c8356425a56867 +976e9c8b150d08706079945bd0e84ab09a648ecc6f64ded9eb5329e57213149ae409ae93e8fbd8eda5b5c69f5212b883 +8097fae1653247d2aed4111533bc378171d6b2c6d09cbc7baa9b52f188d150d645941f46d19f7f5e27b7f073c1ebd079 +83905f93b250d3184eaba8ea7d727c4464b6bdb027e5cbe4f597d8b9dc741dcbea709630bd4fd59ce24023bec32fc0f3 +8095030b7045cff28f34271386e4752f9a9a0312f8df75de4f424366d78534be2b8e1720a19cb1f9a2d21105d790a225 +a7b7b73a6ae2ed1009c49960374b0790f93c74ee03b917642f33420498c188a169724945a975e5adec0a1e83e07fb1b2 +856a41c54df393b6660b7f6354572a4e71c8bfca9cabaffb3d4ef2632c015e7ee2bc10056f3eccb3dbed1ad17d939178 +a8f7a55cf04b38cd4e330394ee6589da3a07dc9673f74804fdf67b364e0b233f14aec42e783200a2e4666f7c5ff62490 +82c529f4e543c6bca60016dc93232c115b359eaee2798a9cf669a654b800aafe6ab4ba58ea8b9cdda2b371c8d62fa845 +8caab020c1baddce77a6794113ef1dfeafc5f5000f48e97f4351b588bf02f1f208101745463c480d37f588d5887e6d8c +8fa91b3cc400f48b77b6fd77f3b3fbfb3f10cdff408e1fd22d38f77e087b7683adad258804409ba099f1235b4b4d6fea +8aa02787663d6be9a35677d9d8188b725d5fcd770e61b11b64e3def8808ea5c71c0a9afd7f6630c48634546088fcd8e2 +b5635b7b972e195cab878b97dea62237c7f77eb57298538582a330b1082f6207a359f2923864630136d8b1f27c41b9aa +8257bb14583551a65975946980c714ecd6e5b629672bb950b9caacd886fbd22704bc9e3ba7d30778adab65dc74f0203a +ab5fe1cd12634bfa4e5c60d946e2005cbd38f1063ec9a5668994a2463c02449a0a185ef331bd86b68b6e23a8780cb3ba +a7d3487da56cda93570cc70215d438204f6a2709bfb5fda6c5df1e77e2efc80f4235c787e57fbf2c74aaff8cbb510a14 +b61cff7b4c49d010e133319fb828eb900f8a7e55114fc86b39c261a339c74f630e1a7d7e1350244ada566a0ff3d46c4b +8d4d1d55d321d278db7a85522ccceca09510374ca81d4d73e3bb5249ace7674b73900c35a531ec4fa6448fabf7ad00dc +966492248aee24f0f56c8cfca3c8ec6ba3b19abb69ae642041d4c3be8523d22c65c4dafcab4c58989ccc4e0bd2f77919 +b20c320a90cb220b86e1af651cdc1e21315cd215da69f6787e28157172f93fc8285dcd59b039c626ed8ca4633cba1a47 +aae9e6b22f018ceb5c0950210bb8182cb8cb61014b7e14581a09d36ebd1bbfebdb2b82afb7fdb0cf75e58a293d9c456d +875547fb67951ad37b02466b79f0c9b985ccbc500cfb431b17823457dc79fb9597ec42cd9f198e15523fcd88652e63a4 +92afce49773cb2e20fb21e4f86f18e0959ebb9c33361547ddb30454ee8e36b1e234019cbdca0e964cb292f7f77df6b90 +8af85343dfe1821464c76ba11c216cbef697b5afc69c4d821342e55afdac047081ec2e3f7b09fc14b518d9a23b78c003 +b7de4a1648fd63f3a918096ea669502af5357438e69dac77cb8102b6e6c15c76e033cfaa80dafc806e535ede5c1a20aa +ac80e9b545e8bd762951d96c9ce87f629d01ffcde07efc2ef7879ca011f1d0d8a745abf26c9d452541008871304fac00 +a4cf0f7ed724e481368016c38ea5816698a5f68eb21af4d3c422d2ba55f96a33e427c2aa40de1b56a7cfac7f7cf43ab0 +899b0a678bb2db2cae1b44e75a661284844ebcdd87abf308fedeb2e4dbe5c5920c07db4db7284a7af806a2382e8b111a +af0588a2a4afce2b1b13c1230816f59e8264177e774e4a341b289a101dcf6af813638fed14fb4d09cb45f35d5d032609 +a4b8df79e2be76e9f5fc5845f06fe745a724cf37c82fcdb72719b77bdebea3c0e763f37909373e3a94480cc5e875cba0 +83e42c46d88930c8f386b19fd999288f142d325e2ebc86a74907d6d77112cb0d449bc511c95422cc810574031a8cbba9 +b5e39534070de1e5f6e27efbdd3dc917d966c2a9b8cf2d893f964256e95e954330f2442027dc148c776d63a95bcde955 +958607569dc28c075e658cd4ae3927055c6bc456eef6212a6fea8205e48ed8777a8064f584cda38fe5639c371e2e7fba +812adf409fa63575113662966f5078a903212ffb65c9b0bbe62da0f13a133443a7062cb8fd70f5e5dd5559a32c26d2c8 +a679f673e5ce6a3cce7fa31f22ee3785e96bcb55e5a776e2dd3467bef7440e3555d1a9b87cb215e86ee9ed13a090344b +afedbb34508b159eb25eb2248d7fe328f86ef8c7d84c62d5b5607d74aae27cc2cc45ee148eb22153b09898a835c58df4 +b75505d4f6b67d31e665cfaf5e4acdb5838ae069166b7fbcd48937c0608a59e40a25302fcc1873d2e81c1782808c70f0 +b62515d539ec21a155d94fc00ea3c6b7e5f6636937bce18ed5b618c12257fb82571886287fd5d1da495296c663ebc512 +ab8e1a9446bbdd588d1690243b1549d230e6149c28f59662b66a8391a138d37ab594df38e7720fae53217e5c3573b5be +b31e8abf4212e03c3287bb2c0a153065a7290a16764a0bac8f112a72e632185a654bb4e88fdd6053e6c7515d9719fadb +b55165477fe15b6abd2d0f4fddaa9c411710dcc4dd712daba3d30e303c9a3ee5415c256f9dc917ecf18c725b4dbab059 +a0939d4f57cacaae549b78e87cc234de4ff6a35dc0d9cd5d7410abc30ebcd34c135e008651c756e5a9d2ca79c40ef42b +8cf10e50769f3443340844aad4d56ec790850fed5a41fcbd739abac4c3015f0a085a038fbe7fae9f5ad899cce5069f6b +924055e804d82a99ea4bb160041ea4dc14b568abf379010bc1922fde5d664718c31d103b8b807e3a1ae809390e708c73 +8ec0f9d26f71b0f2e60a179e4fd1778452e2ffb129d50815e5d7c7cb9415fa69ae5890578086e8ef6bfde35ad2a74661 +98c7f12b15ec4426b59f737f73bf5faea4572340f4550b7590dfb7f7ffedb2372e3e555977c63946d579544c53210ad0 +8a935f7a955c78f69d66f18eee0092e5e833fa621781c9581058e219af4d7ceee48b84e472e159dda6199715fb2f9acf +b78d4219f95a2dbfaa7d0c8a610c57c358754f4f43c2af312ab0fe8f10a5f0177e475332fb8fd23604e474fc2abeb051 +8d086a14803392b7318c28f1039a17e3cfdcece8abcaca3657ec3d0ac330842098a85c0212f889fabb296dfb133ce9aa +a53249f417aac82f2c2a50c244ce21d3e08a5e5a8bd33bec2a5ab0d6cd17793e34a17edfa3690899244ce201e2fb9986 +8619b0264f9182867a1425be514dc4f1ababc1093138a728a28bd7e4ecc99b9faaff68c23792264bc6e4dce5f52a5c52 +8c171edbbbde551ec19e31b2091eb6956107dd9b1f853e1df23bff3c10a3469ac77a58335eee2b79112502e8e163f3de +a9d19ec40f0ca07c238e9337c6d6a319190bdba2db76fb63902f3fb459aeeb50a1ac30db5b25ee1b4201f3ca7164a7f4 +b9c6ec14b1581a03520b8d2c1fbbc31fb8ceaef2c0f1a0d0080b6b96e18442f1734bea7ef7b635d787c691de4765d469 +8cb437beb4cfa013096f40ccc169a713dc17afee6daa229a398e45fd5c0645a9ad2795c3f0cd439531a7151945d7064d +a6e8740cc509126e146775157c2eb278003e5bb6c48465c160ed27888ca803fa12eee1f6a8dd7f444f571664ed87fdc1 +b75c1fecc85b2732e96b3f23aefb491dbd0206a21d682aee0225838dc057d7ed3b576176353e8e90ae55663f79e986e4 +ad8d249b0aea9597b08358bce6c77c1fd552ef3fbc197d6a1cfe44e5e6f89b628b12a6fb04d5dcfcbacc51f46e4ae7bb +b998b2269932cbd58d04b8e898d373ac4bb1a62e8567484f4f83e224061bc0f212459f1daae95abdbc63816ae6486a55 +827988ef6c1101cddc96b98f4a30365ff08eea2471dd949d2c0a9b35c3bbfa8c07054ad1f4c88c8fbf829b20bb5a9a4f +8692e638dd60babf7d9f2f2d2ce58e0ac689e1326d88311416357298c6a2bffbfebf55d5253563e7b3fbbf5072264146 +a685d75b91aea04dbc14ab3c1b1588e6de96dae414c8e37b8388766029631b28dd860688079b12d09cd27f2c5af11adf +b57eced93eec3371c56679c259b34ac0992286be4f4ff9489d81cf9712403509932e47404ddd86f89d7c1c3b6391b28c +a1c8b4e42ebcbd8927669a97f1b72e236fb19249325659e72be7ddaaa1d9e81ca2abb643295d41a8c04a2c01f9c0efd7 +877c33de20d4ed31674a671ba3e8f01a316581e32503136a70c9c15bf0b7cb7b1cba6cd4eb641fad165fb3c3c6c235fd +a2a469d84ec478da40838f775d11ad38f6596eb41caa139cc190d6a10b5108c09febae34ffdafac92271d2e73c143693 +972f817caedb254055d52e963ed28c206848b6c4cfdb69dbc961c891f8458eaf582a6d4403ce1177d87bc2ea410ef60a +accbd739e138007422f28536381decc54bb6bd71d93edf3890e54f9ef339f83d2821697d1a4ac1f5a98175f9a9ecb9b5 +8940f8772e05389f823b62b3adc3ed541f91647f0318d7a0d3f293aeeb421013de0d0a3664ea53dd24e5fbe02d7efef6 +8ecce20f3ef6212edef07ec4d6183fda8e0e8cad2c6ccd0b325e75c425ee1faba00b5c26b4d95204238931598d78f49d +97cc72c36335bd008afbed34a3b0c7225933faba87f7916d0a6d2161e6f82e0cdcda7959573a366f638ca75d30e9dab1 +9105f5de8699b5bdb6bd3bb6cc1992d1eac23929c29837985f83b22efdda92af64d9c574aa9640475087201bbbe5fd73 +8ffb33c4f6d05c413b9647eb6933526a350ed2e4278ca2ecc06b0e8026d8dbe829c476a40e45a6df63a633090a3f82ef +8bfc6421fdc9c2d2aaa68d2a69b1a2728c25b84944cc3e6a57ff0c94bfd210d1cbf4ff3f06702d2a8257024d8be7de63 +a80e1dc1dddfb41a70220939b96dc6935e00b32fb8be5dff4eed1f1c650002ff95e4af481c43292e3827363b7ec4768a +96f714ebd54617198bd636ba7f7a7f8995a61db20962f2165078d9ed8ee764d5946ef3cbdc7ebf8435bb8d5dd4c1deac +8cdb0890e33144d66391d2ae73f5c71f5a861f72bc93bff6cc399fc25dd1f9e17d8772592b44593429718784802ac377 +8ccf9a7f80800ee770b92add734ed45a73ecc31e2af0e04364eefc6056a8223834c7c0dc9dfc52495bdec6e74ce69994 +aa0875f423bd68b5f10ba978ddb79d3b96ec093bfbac9ff366323193e339ed7c4578760fb60f60e93598bdf1e5cc4995 +a9214f523957b59c7a4cb61a40251ad72aba0b57573163b0dc0f33e41d2df483fb9a1b85a5e7c080e9376c866790f8cb +b6224b605028c6673a536cc8ff9aeb94e7a22e686fda82cf16068d326469172f511219b68b2b3affb7933af0c1f80d07 +b6d58968d8a017c6a34e24c2c09852f736515a2c50f37232ac6b43a38f8faa7572cc31dade543b594b61b5761c4781d0 +8a97cefe5120020c38deeb861d394404e6c993c6cbd5989b6c9ebffe24f46ad11b4ba6348e2991cbf3949c28cfc3c99d +95bf046f8c3a9c0ce2634be4de3713024daec3fc4083e808903b25ce3ac971145af90686b451efcc72f6b22df0216667 +a6a4e2f71b8fa28801f553231eff2794c0f10d12e7e414276995e21195abc9c2983a8997e41af41e78d19ff6fbb2680b +8e5e62a7ca9c2f58ebaab63db2ff1fb1ff0877ae94b7f5e2897f273f684ae639dff44cc65718f78a9c894787602ab26a +8542784383eec4f565fcb8b9fc2ad8d7a644267d8d7612a0f476fc8df3aff458897a38003d506d24142ad18f93554f2b +b7db68ba4616ea072b37925ec4fb39096358c2832cc6d35169e032326b2d6614479f765ae98913c267105b84afcb9bf2 +8b31dbb9457d23d416c47542c786e07a489af35c4a87dadb8ee91bea5ac4a5315e65625d78dad2cf8f9561af31b45390 +a8545a1d91ac17257732033d89e6b7111db8242e9c6ebb0213a88906d5ef407a2c6fdb444e29504b06368b6efb4f4839 +b1bd85d29ebb28ccfb05779aad8674906b267c2bf8cdb1f9a0591dd621b53a4ee9f2942687ee3476740c0b4a7621a3ae +a2b54534e152e46c50d91fff03ae9cd019ff7cd9f4168b2fe7ac08ef8c3bbc134cadd3f9d6bd33d20ae476c2a8596c8a +b19b571ff4ae3e9f5d95acda133c455e72c9ea9973cae360732859836c0341c4c29ab039224dc5bc3deb824e031675d8 +940b5f80478648bac025a30f3efeb47023ce20ee98be833948a248bca6979f206bb28fc0f17b90acf3bb4abd3d14d731 +8f106b40588586ac11629b96d57808ad2808915d89539409c97414aded90b4ff23286a692608230a52bff696055ba5d6 +ae6bda03aa10da3d2abbc66d764ca6c8d0993e7304a1bdd413eb9622f3ca1913baa6da1e9f4f9e6cf847f14f44d6924d +a18e7796054a340ef826c4d6b5a117b80927afaf2ebd547794c400204ae2caf277692e2eabb55bc2f620763c9e9da66d +8d2d25180dc2c65a4844d3e66819ccfcf48858f0cc89e1c77553b463ec0f7feb9a4002ce26bc618d1142549b9850f232 +863f413a394de42cc8166c1c75d513b91d545fff1de6b359037a742c70b008d34bf8e587afa2d62c844d0c6f0ea753e7 +83cd0cf62d63475e7fcad18a2e74108499cdbf28af2113cfe005e3b5887794422da450b1944d0a986eb7e1f4c3b18f25 +b4f8b350a6d88fea5ab2e44715a292efb12eb52df738c9b2393da3f1ddee68d0a75b476733ccf93642154bceb208f2b8 +b3f52aaa4cd4221cb9fc45936cc67fd3864bf6d26bf3dd86aa85aa55ecfc05f5e392ecce5e7cf9406b4b1c4fce0398c8 +b33137084422fb643123f40a6df2b498065e65230fc65dc31791c330e898c51c3a65ff738930f32c63d78f3c9315f85b +91452bfa75019363976bb7337fe3a73f1c10f01637428c135536b0cdc7da5ce558dae3dfc792aa55022292600814a8ef +ad6ba94c787cd4361ca642c20793ea44f1f127d4de0bb4a77c7fbfebae0fcadbf28e2cb6f0c12c12a07324ec8c19761d +890aa6248b17f1501b0f869c556be7bf2b1d31a176f9978bb97ab7a6bd4138eed32467951c5ef1871944b7f620542f43 +82111db2052194ee7dd22ff1eafffac0443cf969d3762cceae046c9a11561c0fdce9c0711f88ac01d1bed165f8a7cee3 +b1527b71df2b42b55832f72e772a466e0fa05743aacc7814f4414e4bcc8d42a4010c9e0fd940e6f254cafedff3cd6543 +922370fa49903679fc565f09c16a5917f8125e72acfeb060fcdbadbd1644eb9f4016229756019c93c6d609cda5d5d174 +aa4c7d98a96cab138d2a53d4aee8ebff6ef903e3b629a92519608d88b3bbd94de5522291a1097e6acf830270e64c8ee1 +b3dc21608a389a72d3a752883a382baaafc61ecc44083b832610a237f6a2363f24195acce529eb4aed4ef0e27a12b66e +94619f5de05e07b32291e1d7ab1d8b7337a2235e49d4fb5f3055f090a65e932e829efa95db886b32b153bdd05a53ec8c +ade1e92722c2ffa85865d2426fb3d1654a16477d3abf580cfc45ea4b92d5668afc9d09275d3b79283e13e6b39e47424d +b7201589de7bed094911dd62fcd25c459a8e327ac447b69f541cdba30233063e5ddffad0b67e9c3e34adcffedfd0e13d +809d325310f862d6549e7cb40f7e5fc9b7544bd751dd28c4f363c724a0378c0e2adcb5e42ec8f912f5f49f18f3365c07 +a79c20aa533de7a5d671c99eb9eb454803ba54dd4f2efa3c8fec1a38f8308e9905c71e9282955225f686146388506ff6 +a85eeacb5e8fc9f3ed06a3fe2dc3108ab9f8c5877b148c73cf26e4e979bf5795edbe2e63a8d452565fd1176ed40402b2 +97ef55662f8a1ec0842b22ee21391227540adf7708f491436044f3a2eb18c471525e78e1e14fa292507c99d74d7437c6 +93110d64ed5886f3d16ce83b11425576a3a7a9bb831cd0de3f9a0b0f2270a730d68136b4ef7ff035ede004358f419b5c +ac9ed0a071517f0ae4f61ce95916a90ba9a77a3f84b0ec50ef7298acdcd44d1b94525d191c39d6bd1bb68f4471428760 +98abd6a02c7690f5a339adf292b8c9368dfc12e0f8069cf26a5e0ce54b4441638f5c66ea735142f3c28e00a0024267e6 +b51efb73ba6d44146f047d69b19c0722227a7748b0e8f644d0fc9551324cf034c041a2378c56ce8b58d06038fb8a78de +8f115af274ef75c1662b588b0896b97d71f8d67986ae846792702c4742ab855952865ce236b27e2321967ce36ff93357 +b3c4548f14d58b3ab03c222da09e4381a0afe47a72d18d50a94e0008797f78e39e99990e5b4757be62310d400746e35a +a9b1883bd5f31f909b8b1b6dcb48c1c60ed20aa7374b3ffa7f5b2ed036599b5bef33289d23c80a5e6420d191723b92f7 +85d38dffd99487ae5bb41ab4a44d80a46157bbbe8ef9497e68f061721f74e4da513ccc3422936b059575975f6787c936 +adf870fcb96e972c033ab7a35d28ae79ee795f82bc49c3bd69138f0e338103118d5529c53f2d72a9c0d947bf7d312af2 +ab4c7a44e2d9446c6ff303eb49aef0e367a58b22cc3bb27b4e69b55d1d9ee639c9234148d2ee95f9ca8079b1457d5a75 +a386420b738aba2d7145eb4cba6d643d96bda3f2ca55bb11980b318d43b289d55a108f4bc23a9606fb0bccdeb3b3bb30 +847020e0a440d9c4109773ecca5d8268b44d523389993b1f5e60e541187f7c597d79ebd6e318871815e26c96b4a4dbb1 +a530aa7e5ca86fcd1bec4b072b55cc793781f38a666c2033b510a69e110eeabb54c7d8cbcb9c61fee531a6f635ffa972 +87364a5ea1d270632a44269d686b2402da737948dac27f51b7a97af80b66728b0256547a5103d2227005541ca4b7ed04 +8816fc6e16ea277de93a6d793d0eb5c15e9e93eb958c5ef30adaf8241805adeb4da8ce19c3c2167f971f61e0b361077d +8836a72d301c42510367181bb091e4be377777aed57b73c29ef2ce1d475feedd7e0f31676284d9a94f6db01cc4de81a2 +b0d9d8b7116156d9dde138d28aa05a33e61f8a85839c1e9071ccd517b46a5b4b53acb32c2edd7150c15bc1b4bd8db9e3 +ae931b6eaeda790ba7f1cd674e53dc87f6306ff44951fa0df88d506316a5da240df9794ccbd7215a6470e6b31c5ea193 +8c6d5bdf87bd7f645419d7c6444e244fe054d437ed1ba0c122fde7800603a5fadc061e5b836cb22a6cfb2b466f20f013 +90d530c6d0cb654999fa771b8d11d723f54b8a8233d1052dc1e839ea6e314fbed3697084601f3e9bbb71d2b4eaa596df +b0d341a1422588c983f767b1ed36c18b141774f67ef6a43cff8e18b73a009da10fc12120938b8bba27f225bdfd3138f9 +a131b56f9537f460d304e9a1dd75702ace8abd68cb45419695cb8dee76998139058336c87b7afd6239dc20d7f8f940cc +aa6c51fa28975f709329adee1bbd35d49c6b878041841a94465e8218338e4371f5cb6c17f44a63ac93644bf28f15d20f +88440fb584a99ebd7f9ea04aaf622f6e44e2b43bbb49fb5de548d24a238dc8f26c8da2ccf03dd43102bda9f16623f609 +9777b8695b790e702159a4a750d5e7ff865425b95fa0a3c15495af385b91c90c00a6bd01d1b77bffe8c47d01baae846f +8b9d764ece7799079e63c7f01690c8eff00896a26a0d095773dea7a35967a8c40db7a6a74692f0118bf0460c26739af4 +85808c65c485520609c9e61fa1bb67b28f4611d3608a9f7a5030ee61c3aa3c7e7dc17fff48af76b4aecee2cb0dbd22ac +ad2783a76f5b3db008ef5f7e67391fda4e7e36abde6b3b089fc4835b5c339370287935af6bd53998bed4e399eda1136d +96f18ec03ae47c205cc4242ca58e2eff185c9dca86d5158817e2e5dc2207ab84aadda78725f8dc080a231efdc093b940 +97de1ab6c6cc646ae60cf7b86df73b9cf56cc0cd1f31b966951ebf79fc153531af55ca643b20b773daa7cab784b832f7 +870ba266a9bfa86ef644b1ef025a0f1b7609a60de170fe9508de8fd53170c0b48adb37f19397ee8019b041ce29a16576 +ad990e888d279ac4e8db90619d663d5ae027f994a3992c2fbc7d262b5990ae8a243e19157f3565671d1cb0de17fe6e55 +8d9d5adcdd94c5ba3be4d9a7428133b42e485f040a28d16ee2384758e87d35528f7f9868de9bd23d1a42a594ce50a567 +85a33ed75d514ece6ad78440e42f7fcdb59b6f4cff821188236d20edae9050b3a042ce9bc7d2054296e133d033e45022 +92afd2f49a124aaba90de59be85ff269457f982b54c91b06650c1b8055f9b4b0640fd378df02a00e4fc91f7d226ab980 +8c0ee09ec64bd831e544785e3d65418fe83ed9c920d9bb4d0bf6dd162c1264eb9d6652d2def0722e223915615931581c +8369bedfa17b24e9ad48ebd9c5afea4b66b3296d5770e09b00446c5b0a8a373d39d300780c01dcc1c6752792bccf5fd0 +8b9e960782576a59b2eb2250d346030daa50bbbec114e95cdb9e4b1ba18c3d34525ae388f859708131984976ca439d94 +b682bface862008fea2b5a07812ca6a28a58fd151a1d54c708fc2f8572916e0d678a9cb8dc1c10c0470025c8a605249e +a38d5e189bea540a824b36815fc41e3750760a52be0862c4cac68214febdc1a754fb194a7415a8fb7f96f6836196d82a +b9e7fbda650f18c7eb8b40e42cc42273a7298e65e8be524292369581861075c55299ce69309710e5b843cb884de171bd +b6657e5e31b3193874a1bace08f42faccbd3c502fb73ad87d15d18a1b6c2a146f1baa929e6f517db390a5a47b66c0acf +ae15487312f84ed6265e4c28327d24a8a0f4d2d17d4a5b7c29b974139cf93223435aaebe3af918f5b4bb20911799715f +8bb4608beb06bc394e1a70739b872ce5a2a3ffc98c7547bf2698c893ca399d6c13686f6663f483894bccaabc3b9c56ad +b58ac36bc6847077584308d952c5f3663e3001af5ecf2e19cb162e1c58bd6c49510205d453cffc876ca1dc6b8e04a578 +924f65ced61266a79a671ffb49b300f0ea44c50a0b4e3b02064faa99fcc3e4f6061ea8f38168ab118c5d47bd7804590e +8d67d43b8a06b0ff4fafd7f0483fa9ed1a9e3e658a03fb49d9d9b74e2e24858dc1bed065c12392037b467f255d4e5643 +b4d4f87813125a6b355e4519a81657fa97c43a6115817b819a6caf4823f1d6a1169683fd68f8d025cdfa40ebf3069acb +a7fd4d2c8e7b59b8eed3d4332ae94b77a89a2616347402f880bc81bde072220131e6dbec8a605be3a1c760b775375879 +8d4a7d8fa6f55a30df37bcf74952e2fa4fd6676a2e4606185cf154bdd84643fd01619f8fb8813a564f72e3f574f8ce30 +8086fb88e6260e9a9c42e9560fde76315ff5e5680ec7140f2a18438f15bc2cc7d7d43bfb5880b180b738c20a834e6134 +916c4c54721de03934fee6f43de50bb04c81f6f8dd4f6781e159e71c40c60408aa54251d457369d133d4ba3ed7c12cb4 +902e5bf468f11ed9954e2a4a595c27e34abe512f1d6dc08bbca1c2441063f9af3dc5a8075ab910a10ff6c05c1c644a35 +a1302953015e164bf4c15f7d4d35e3633425a78294406b861675667eec77765ff88472306531e5d3a4ec0a2ff0dd6a9e +87874461df3c9aa6c0fa91325576c0590f367075f2f0ecfeb34afe162c04c14f8ce9d608c37ac1adc8b9985bc036e366 +84b50a8a61d3cc609bfb0417348133e698fe09a6d37357ce3358de189efcf35773d78c57635c2d26c3542b13cc371752 +acaed2cff8633d12c1d12bb7270c54d65b0b0733ab084fd47f81d0a6e1e9b6f300e615e79538239e6160c566d8bb8d29 +889e6a0e136372ca4bac90d1ab220d4e1cad425a710e8cdd48b400b73bb8137291ceb36a39440fa84305783b1d42c72f +90952e5becec45b2b73719c228429a2c364991cf1d5a9d6845ae5b38018c2626f4308daa322cab1c72e0f6c621bb2b35 +8f5a97a801b6e9dcd66ccb80d337562c96f7914e7169e8ff0fda71534054c64bf2a9493bb830623d612cfe998789be65 +84f3df8b9847dcf1d63ca470dc623154898f83c25a6983e9b78c6d2d90a97bf5e622445be835f32c1e55e6a0a562ea78 +91d12095cd7a88e7f57f254f02fdb1a1ab18984871dead2f107404bcf8069fe68258c4e6f6ebd2477bddf738135400bb +b771a28bc04baef68604d4723791d3712f82b5e4fe316d7adc2fc01b935d8e644c06d59b83bcb542afc40ebafbee0683 +872f6341476e387604a7e93ae6d6117e72d164e38ebc2b825bc6df4fcce815004d7516423c190c1575946b5de438c08d +90d6b4aa7d40a020cdcd04e8b016d041795961a8e532a0e1f4041252131089114a251791bf57794cadb7d636342f5d1c +899023ba6096a181448d927fed7a0fe858be4eac4082a42e30b3050ee065278d72fa9b9d5ce3bc1372d4cbd30a2f2976 +a28f176571e1a9124f95973f414d5bdbf5794d41c3839d8b917100902ac4e2171eb940431236cec93928a60a77ede793 +838dbe5bcd29c4e465d02350270fa0036cd46f8730b13d91e77afb7f5ed16525d0021d3b2ae173a76c378516a903e0cb +8e105d012dd3f5d20f0f1c4a7e7f09f0fdd74ce554c3032e48da8cce0a77260d7d47a454851387770f5c256fa29bcb88 +8f4df0f9feeb7a487e1d138d13ea961459a6402fd8f8cabb226a92249a0d04ded5971f3242b9f90d08da5ff66da28af6 +ad1cfda4f2122a20935aa32fb17c536a3653a18617a65c6836700b5537122af5a8206befe9eaea781c1244c43778e7f1 +832c6f01d6571964ea383292efc8c8fa11e61c0634a25fa180737cc7ab57bc77f25e614aac9a2a03d98f27b3c1c29de2 +903f89cc13ec6685ac7728521898781fecb300e9094ef913d530bf875c18bcc3ceed7ed51e7b482d45619ab4b025c2e9 +a03c474bb915aad94f171e8d96f46abb2a19c9470601f4c915512ec8b9e743c3938450a2a5b077b4618b9df8809e1dc1 +83536c8456f306045a5f38ae4be2e350878fa7e164ea408d467f8c3bc4c2ee396bd5868008c089183868e4dfad7aa50b +88f26b4ea1b236cb326cd7ad7e2517ec8c4919598691474fe15d09cabcfc37a8d8b1b818f4d112432ee3a716b0f37871 +a44324e3fe96e9c12b40ded4f0f3397c8c7ee8ff5e96441118d8a6bfad712d3ac990b2a6a23231a8f691491ac1fd480f +b0de4693b4b9f932191a21ee88629964878680152a82996c0019ffc39f8d9369bbe2fe5844b68d6d9589ace54af947e4 +8e5d8ba948aea5fd26035351a960e87f0d23efddd8e13236cc8e4545a3dda2e9a85e6521efb8577e03772d3637d213d9 +93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556 +8731176363ad7658a2862426ee47a5dce9434216cef60e6045fa57c40bb3ce1e78dac4510ae40f1f31db5967022ced32 +b10c9a96745722c85bdb1a693100104d560433d45b9ac4add54c7646a7310d8e9b3ca9abd1039d473ae768a18e489845 +a2ac374dfbb464bf850b4a2caf15b112634a6428e8395f9c9243baefd2452b4b4c61b0cb2836d8eae2d57d4900bf407e +b69fe3ded0c4f5d44a09a0e0f398221b6d1bf5dbb8bc4e338b93c64f1a3cac1e4b5f73c2b8117158030ec03787f4b452 +8852cdbaf7d0447a8c6f211b4830711b3b5c105c0f316e3a6a18dcfbb9be08bd6f4e5c8ae0c3692da08a2dfa532f9d5c +93bbf6d7432a7d98ade3f94b57bf9f4da9bc221a180a370b113066dd42601bb9e09edd79e2e6e04e00423399339eebda +a80941c391f1eeafc1451c59e4775d6a383946ff22997aeaadf806542ba451d3b0f0c6864eeba954174a296efe2c1550 +a045fe2bb011c2a2f71a0181a8f457a3078470fb74c628eab8b59aef69ffd0d649723bf74d6885af3f028bc5a104fb39 +b9d8c35911009c4c8cad64692139bf3fc16b78f5a19980790cb6a7aea650a25df4231a4437ae0c351676a7e42c16134f +94c79501ded0cfcbab99e1841abe4a00a0252b3870e20774c3da16c982d74c501916ec28304e71194845be6e3113c7ab +900a66418b082a24c6348d8644ddb1817df5b25cb33044a519ef47cc8e1f7f1e38d2465b7b96d32ed472d2d17f8414c6 +b26f45d393b8b2fcb29bdbb16323dc7f4b81c09618519ab3a39f8ee5bd148d0d9f3c0b5dfab55b5ce14a1cb9206d777b +aa1a87735fc493a80a96a9a57ca40a6d9c32702bfcaa9869ce1a116ae65d69cefe2f3e79a12454b4590353e96f8912b4 +a922b188d3d0b69b4e4ea2a2aa076566962844637da12c0832105d7b31dea4a309eee15d12b7a336be3ea36fcbd3e3b7 +8f3841fcf4105131d8c4d9885e6e11a46c448226401cf99356c291fadb864da9fa9d30f3a73c327f23f9fd99a11d633e +9791d1183fae270e226379af6c497e7da803ea854bb20afa74b253239b744c15f670ee808f708ede873e78d79a626c9a +a4cad52e3369491ada61bf28ada9e85de4516d21c882e5f1cd845bea9c06e0b2887b0c5527fcff6fc28acd3c04f0a796 +b9ac86a900899603452bd11a7892a9bfed8054970bfcbeaa8c9d1930db891169e38d6977f5258c25734f96c8462eee3b +a3a154c28e5580656a859f4efc2f5ebfa7eaa84ca40e3f134fa7865e8581586db74992dbfa4036aa252fba103773ddde +95cc2a0c1885a029e094f5d737e3ecf4d26b99036453a8773c77e360101f9f98676ee246f6f732a377a996702d55691f +842651bbe99720438d8d4b0218feb60481280c05beb17750e9ca0d8c0599a60f873b7fbdcc7d8835ba9a6d57b16eec03 +81ee54699da98f5620307893dcea8f64670609fa20e5622265d66283adeac122d458b3308c5898e6c57c298db2c8b24f +b97868b0b2bc98032d68352a535a1b341b9ff3c7af4e3a7f3ebc82d3419daa1b5859d6aedc39994939623c7cd878bd9b +b60325cd5d36461d07ef253d826f37f9ee6474a760f2fff80f9873d01fd2b57711543cdc8d7afa1c350aa753c2e33dea +8c205326c11d25a46717b780c639d89714c7736c974ae71287e3f4b02e6605ac2d9b4928967b1684f12be040b7bf2dd3 +95a392d82db51e26ade6c2ccd3396d7e40aff68fa570b5951466580d6e56dda51775dce5cf3a74a7f28c3cb2eb551c4d +8f2cc8071eb56dffb70bda6dd433b556221dc8bba21c53353c865f00e7d4d86c9e39f119ea9a8a12ef583e9a55d9a6b6 +9449a71af9672aaf8856896d7e3d788b22991a7103f75b08c0abbcc2bfe60fda4ed8ce502cea4511ff0ea52a93e81222 +857090ab9fdb7d59632d068f3cc8cf27e61f0d8322d30e6b38e780a1f05227199b4cd746aac1311c36c659ef20931f28 +98a891f4973e7d9aaf9ac70854608d4f7493dffc7e0987d7be9dd6029f6ea5636d24ef3a83205615ca1ff403750058e1 +a486e1365bbc278dd66a2a25d258dc82f46b911103cb16aab3945b9c95ae87b386313a12b566df5b22322ede0afe25ad +a9a1eb399ed95d396dccd8d1ac718043446f8b979ec62bdce51c617c97a312f01376ab7fb87d27034e5f5570797b3c33 +b7abc3858d7a74bb446218d2f5a037e0fae11871ed9caf44b29b69c500c1fa1dcfad64c9cdccc9d80d5e584f06213deb +8cfb09fe2e202faa4cebad932b1d35f5ca204e1c2a0c740a57812ac9a6792130d1312aabd9e9d4c58ca168bfebd4c177 +a90a305c2cd0f184787c6be596fa67f436afd1f9b93f30e875f817ac2aae8bdd2e6e656f6be809467e6b3ad84adb86b1 +80a9ef993c2b009ae172cc8f7ec036f5734cf4f4dfa06a7db4d54725e7fbfae5e3bc6f22687bdbb6961939d6f0c87537 +848ade1901931e72b955d7db1893f07003e1708ff5d93174bac5930b9a732640f0578839203e9b77eb27965c700032d3 +93fdf4697609c5ae9c33b9ca2f5f1af44abeb2b98dc4fdf732cf7388de086f410730dc384d9b7a7f447bb009653c8381 +89ce3fb805aea618b5715c0d22a9f46da696b6fa86794f56fdf1d44155a33d42daf1920bcbe36cbacf3cf4c92df9cbc7 +829ce2c342cf82aa469c65f724f308f7a750bd1494adc264609cd790c8718b8b25b5cab5858cf4ee2f8f651d569eea67 +af2f0cee7bf413204be8b9df59b9e4991bc9009e0d6dbe6815181df0ec2ca93ab8f4f3135b1c14d8f53d74bff0bd6f27 +b87998cecf7b88cde93d1779f10a521edd5574a2fbd240102978639ec57433ba08cdb53849038a329cebbe74657268d2 +a64542a1261a6ed3d720c2c3a802303aad8c4c110c95d0f12e05c1065e66f42da494792b6bfc5b9272363f3b1d457f58 +86a6fd042e4f282fadf07a4bfee03fc96a3aea49f7a00f52bf249a20f1ec892326855410e61f37fbb27d9305eb2fc713 +967ea5bc403b6db269682f7fd0df90659350d7e1aa66bc4fab4c9dfcd75ed0bba4b52f1cebc5f34dc8ba810793727629 +a52990f9f3b8616ce3cdc2c74cd195029e6a969753dcf2d1630438700e7d6ebde36538532b3525ac516f5f2ce9dd27a3 +a64f7ff870bab4a8bf0d4ef6f5c744e9bf1021ed08b4c80903c7ad318e80ba1817c3180cc45cb5a1cae1170f0241655f +b00f706fa4de1f663f021e8ad3d155e84ce6084a409374b6e6cd0f924a0a0b51bebaaaf1d228c77233a73b0a5a0df0e9 +8b882cc3bff3e42babdb96df95fb780faded84887a0a9bab896bef371cdcf169d909f5658649e93006aa3c6e1146d62e +9332663ef1d1dcf805c3d0e4ce7a07d9863fb1731172e766b3cde030bf81682cc011e26b773fb9c68e0477b4ae2cfb79 +a8aa8151348dbd4ef40aaeb699b71b4c4bfd3218560c120d85036d14f678f6736f0ec68e80ce1459d3d35feccc575164 +a16cd8b729768f51881c213434aa28301fa78fcb554ddd5f9012ee1e4eae7b5cb3dd88d269d53146dea92d10790faf0b +86844f0ef9d37142faf3b1e196e44fbe280a3ba4189aa05c356778cb9e3b388a2bff95eed305ada8769935c9974e4c57 +ae2eec6b328fccf3b47bcdac32901ac2744a51beb410b04c81dea34dee4912b619466a4f5e2780d87ecefaebbe77b46d +915df4c38d301c8a4eb2dc5b1ba0ffaad67cbb177e0a80095614e9c711f4ef24a4cef133f9d982a63d2a943ba6c8669d +ae6a2a4dedfc2d1811711a8946991fede972fdf2a389b282471280737536ffc0ac3a6d885b1f8bda0366eb0b229b9979 +a9b628c63d08b8aba6b1317f6e91c34b2382a6c85376e8ef2410a463c6796740ae936fc4e9e0737cb9455d1daa287bd8 +848e30bf7edf2546670b390d5cf9ab71f98fcb6add3c0b582cb34996c26a446dee5d1bde4fdcde4fc80c10936e117b29 +907d6096c7c8c087d1808dd995d5d2b9169b3768c3f433475b50c2e2bd4b082f4d543afd8b0b0ddffa9c66222a72d51d +a59970a2493b07339124d763ac9d793c60a03354539ecbcf6035bc43d1ea6e35718202ae6d7060b7d388f483d971573c +b9cfef2af9681b2318f119d8611ff6d9485a68d8044581b1959ab1840cbca576dbb53eec17863d2149966e9feb21122f +ad47271806161f61d3afa45cdfe2babceef5e90031a21779f83dc8562e6076680525b4970b2f11fe9b2b23c382768323 +8e425a99b71677b04fe044625d338811fbb8ee32368a424f6ab2381c52e86ee7a6cecedf777dc97181519d41c351bc22 +86b55b54d7adefc12954a9252ee23ae83efe8b5b4b9a7dc307904413e5d69868c7087a818b2833f9b004213d629be8ad +a14fda6b93923dd11e564ae4457a66f397741527166e0b16a8eb91c6701c244fd1c4b63f9dd3515193ec88fa6c266b35 +a9b17c36ae6cd85a0ed7f6cabc5b47dc8f80ced605db327c47826476dc1fb8f8669aa7a7dc679fbd4ee3d8e8b4bd6a6f +82a0829469c1458d959c821148f15dacae9ea94bf56c59a6ab2d4dd8b3d16d73e313b5a3912a6c1f131d73a8f06730c4 +b22d56d549a53eaef549595924bdb621ff807aa4513feedf3fdcbf7ba8b6b9cfa4481c2f67fc642db397a6b794a8b63a +974c59c24392e2cb9294006cbe3c52163e255f3bd0c2b457bdc68a6338e6d5b6f87f716854492f8d880a6b896ccf757c +b70d247ba7cad97c50b57f526c2ba915786e926a94e8f8c3eebc2e1be6f4255411b9670e382060049c8f4184302c40b2 +ad80201fe75ef21c3ddbd98cf23591e0d7a3ba1036dfe77785c32f44755a212c31f0ceb0a0b6f5ee9b6dc81f358d30c3 +8c656e841f9bb90b9a42d425251f3fdbc022a604d75f5845f479ed4be23e02aaf9e6e56cde351dd7449c50574818a199 +8b88dd3fa209d3063b7c5b058f7249ee9900fbc2287d16da61a0704a0a1d71e45d9c96e1cda7fdf9654534ec44558b22 +961da00cc8750bd84d253c08f011970ae1b1158ad6778e8ed943d547bceaf52d6d5a212a7de3bf2706688c4389b827d2 +a5dd379922549a956033e3d51a986a4b1508e575042b8eaa1df007aa77cf0b8c2ab23212f9c075702788fa9c53696133 +ac8fcfde3a349d1e93fc8cf450814e842005c545c4844c0401bc80e6b96cdb77f29285a14455e167c191d4f312e866cd +ac63d79c799783a8466617030c59dd5a8f92ee6c5204676fd8d881ce5f7f8663bdbeb0379e480ea9b6340ab0dc88e574 +805874fde19ce359041ae2bd52a39e2841acabfd31f965792f2737d7137f36d4e4722ede8340d8c95afa6af278af8acb +8d2f323a228aa8ba7b7dc1399138f9e6b41df1a16a7069003ab8104b8b68506a45141bc5fe66acf430e23e13a545190b +a1610c721a2d9af882bb6b39bea97cff1527a3aea041d25934de080214ae77c959e79957164440686d15ab301e897d4d +aba16d29a47fc36f12b654fde513896723e2c700c4190f11b26aa4011da57737ad717daa02794aa3246e4ae5f0b0cc3a +a406db2f15fdd135f346cc4846623c47edd195e80ba8c7cb447332095314d565e4040694ca924696bb5ee7f8996ea0ba +8b30e2cd9b47d75ba57b83630e40f832249af6c058d4f490416562af451993eec46f3e1f90bc4d389e4c06abd1b32a46 +aacf9eb7036e248e209adbfc3dd7ce386569ea9b312caa4b240726549db3c68c4f1c8cbf8ed5ea9ea60c7e57c9df3b8e +b20fcac63bf6f5ee638a42d7f89be847f348c085ddcbec3fa318f4323592d136c230495f188ef2022aa355cc2b0da6f9 +811eff750456a79ec1b1249d76d7c1547065b839d8d4aaad860f6d4528eb5b669473dcceeeea676cddbc3980b68461b7 +b52d14ae33f4ab422f953392ae76a19c618cc31afc96290bd3fe2fb44c954b5c92c4789f3f16e8793f2c0c1691ade444 +a7826dafeeba0db5b66c4dfcf2b17fd7b40507a5a53ac2e42942633a2cb30b95ba1739a6e9f3b7a0e0f1ec729bf274e2 +8acfd83ddf7c60dd7c8b20c706a3b972c65d336b8f9b3d907bdd8926ced271430479448100050b1ef17578a49c8fa616 +af0c69f65184bb06868029ad46f8465d75c36814c621ac20a5c0b06a900d59305584f5a6709683d9c0e4b6cd08d650a6 +b6cc8588191e00680ee6c3339bd0f0a17ad8fd7f4be57d5d7075bede0ea593a19e67f3d7c1a20114894ee5bfcab71063 +a82fd4f58635129dbb6cc3eb9391cf2d28400018b105fc41500fbbd12bd890b918f97d3d359c29dd3b4c4e34391dfab0 +92fc544ed65b4a3625cf03c41ddff7c039bc22d22c0d59dcc00efd5438401f2606adb125a1d5de294cca216ec8ac35a3 +906f67e4a32582b71f15940523c0c7ce370336935e2646bdaea16a06995256d25e99df57297e39d6c39535e180456407 +97510337ea5bbd5977287339197db55c60533b2ec35c94d0a460a416ae9f60e85cee39be82abeeacd5813cf54df05862 +87e6894643815c0ea48cb96c607266c5ee4f1f82ba5fe352fb77f9b6ed14bfc2b8e09e80a99ac9047dfcf62b2ae26795 +b6fd55dd156622ad7d5d51b7dde75e47bd052d4e542dd6449e72411f68275775c846dde301e84613312be8c7bce58b07 +b98461ac71f554b2f03a94e429b255af89eec917e208a8e60edf5fc43b65f1d17a20de3f31d2ce9f0cb573c25f2f4d98 +96f0dea40ca61cefbee41c4e1fe9a7d81fbe1f49bb153d083ab70f5d0488a1f717fd28cedcf6aa18d07cce2c62801898 +8d7c3ab310184f7dc34b6ce4684e4d29a31e77b09940448ea4daac730b7eb308063125d4dd229046cf11bfd521b771e0 +96f0564898fe96687918bbf0a6adead99cf72e3a35ea3347e124af9d006221f8e82e5a9d2fe80094d5e8d48e610f415e +ad50fcb92c2675a398cf07d4c40a579e44bf8d35f27cc330b57e54d5ea59f7d898af0f75dccfe3726e5471133d70f92b +828beed62020361689ae7481dd8f116902b522fb0c6c122678e7f949fdef70ead011e0e6bffd25678e388744e17cdb69 +8349decac1ca16599eee2efc95bcaabf67631107da1d34a2f917884bd70dfec9b4b08ab7bc4379d6c73b19c0b6e54fb8 +b2a6a2e50230c05613ace9e58bb2e98d94127f196f02d9dddc53c43fc68c184549ca12d713cb1b025d8260a41e947155 +94ff52181aadae832aed52fc3b7794536e2a31a21fc8be3ea312ca5c695750d37f08002f286b33f4023dba1e3253ecfa +a21d56153c7e5972ee9a319501be4faff199fdf09bb821ea9ce64aa815289676c00f105e6f00311b3a5b627091b0d0fc +a27a60d219f1f0c971db73a7f563b371b5c9fc3ed1f72883b2eac8a0df6698400c9954f4ca17d7e94e44bd4f95532afb +a2fc56fae99b1f18ba5e4fe838402164ce82f8a7f3193d0bbd360c2bac07c46f9330c4c7681ffb47074c6f81ee6e7ac6 +b748e530cd3afb96d879b83e89c9f1a444f54e55372ab1dcd46a0872f95ce8f49cf2363fc61be82259e04f555937ed16 +8bf8993e81080c7cbba1e14a798504af1e4950b2f186ab3335b771d6acaee4ffe92131ae9c53d74379d957cb6344d9cd +96774d0ef730d22d7ab6d9fb7f90b9ead44285219d076584a901960542756700a2a1603cdf72be4708b267200f6c36a9 +b47703c2ab17be1e823cc7bf3460db1d6760c0e33862c90ca058845b2ff234b0f9834ddba2efb2ee1770eb261e7d8ffd +84319e67c37a9581f8b09b5e4d4ae88d0a7fb4cbb6908971ab5be28070c3830f040b1de83ee663c573e0f2f6198640e4 +96811875fa83133e0b3c0e0290f9e0e28bca6178b77fdf5350eb19344d453dbd0d71e55a0ef749025a5a2ca0ad251e81 +81a423423e9438343879f2bfd7ee9f1c74ebebe7ce3cfffc8a11da6f040cc4145c3b527bd3cf63f9137e714dbcb474ef +b8c3535701ddbeec2db08e17a4fa99ba6752d32ece5331a0b8743676f421fcb14798afc7c783815484f14693d2f70db8 +81aee980c876949bf40782835eec8817d535f6f3f7e00bf402ddd61101fdcd60173961ae90a1cf7c5d060339a18c959d +87e67b928d97b62c49dac321ce6cb680233f3a394d4c9a899ac2e8db8ccd8e00418e66cdfd68691aa3cb8559723b580c +8eac204208d99a2b738648df96353bbb1b1065e33ee4f6bba174b540bbbd37d205855e1f1e69a6b7ff043ca377651126 +848e6e7a54ad64d18009300b93ea6f459ce855971dddb419b101f5ac4c159215626fadc20cc3b9ab1701d8f6dfaddd8b +88aa123d9e0cf309d46dddb6acf634b1ade3b090a2826d6e5e78669fa1220d6df9a6697d7778cd9b627db17eea846126 +9200c2a629b9144d88a61151b661b6c4256cc5dadfd1e59a8ce17a013c2d8f7e754aabe61663c3b30f1bc47784c1f8cf +b6e1a2827c3bdda91715b0e1b1f10dd363cef337e7c80cac1f34165fc0dea7c8b69747e310563db5818390146ce3e231 +92c333e694f89f0d306d54105b2a5dcc912dbe7654d9e733edab12e8537350815be472b063e56cfde5286df8922fdecb +a6fac04b6d86091158ebb286586ccfec2a95c9786e14d91a9c743f5f05546073e5e3cc717635a0c602cad8334e922346 +a581b4af77feebc1fb897d49b5b507c6ad513d8f09b273328efbb24ef0d91eb740d01b4d398f2738125dacfe550330cd +81c4860cccf76a34f8a2bc3f464b7bfd3e909e975cce0d28979f457738a56e60a4af8e68a3992cf273b5946e8d7f76e2 +8d1eaa09a3180d8af1cbaee673db5223363cc7229a69565f592fa38ba0f9d582cedf91e15dabd06ebbf2862fc0feba54 +9832f49b0147f4552402e54593cfa51f99540bffada12759b71fcb86734be8e500eea2d8b3d036710bdf04c901432de9 +8bdb0e8ec93b11e5718e8c13cb4f5de545d24829fd76161216340108098dfe5148ed25e3b57a89a516f09fa79043734d +ab96f06c4b9b0b2c0571740b24fca758e6976315053a7ecb20119150a9fa416db2d3a2e0f8168b390bb063f0c1caf785 +ab777f5c52acd62ecf4d1f168b9cc8e1a9b45d4ec6a8ff52c583e867c2239aba98d7d3af977289b367edce03d9c2dfb1 +a09d3ce5e748da84802436951acc3d3ea5d8ec1d6933505ed724d6b4b0d69973ab0930daec9c6606960f6e541e4a3ce2 +8ef94f7be4d85d5ad3d779a5cf4d7b2fc3e65c52fb8e1c3c112509a4af77a0b5be994f251e5e40fabeeb1f7d5615c22b +a7406a5bf5708d9e10922d3c5c45c03ef891b8d0d74ec9f28328a72be4cdc05b4f2703fa99366426659dfca25d007535 +b7f52709669bf92a2e070bfe740f422f0b7127392c5589c7f0af71bb5a8428697c762d3c0d74532899da24ea7d8695c2 +b9dfb0c8df84104dbf9239ccefa4672ef95ddabb8801b74997935d1b81a78a6a5669a3c553767ec19a1281f6e570f4ff +ae4d5c872156061ce9195ac640190d8d71dd406055ee43ffa6f9893eb24b870075b74c94d65bc1d5a07a6573282b5520 +afe6bd3eb72266d333f1807164900dcfa02a7eb5b1744bb3c86b34b3ee91e3f05e38fa52a50dc64eeb4bdb1dd62874b8 +948043cf1bc2ef3c01105f6a78dc06487f57548a3e6ef30e6ebc51c94b71e4bf3ff6d0058c72b6f3ecc37efd7c7fa8c0 +a22fd17c2f7ffe552bb0f23fa135584e8d2d8d75e3f742d94d04aded2a79e22a00dfe7acbb57d44e1cdb962fb22ae170 +8cd0f4e9e4fb4a37c02c1bde0f69359c43ab012eb662d346487be0c3758293f1ca560122b059b091fddce626383c3a8f +90499e45f5b9c81426f3d735a52a564cafbed72711d9279fdd88de8038e953bc48c57b58cba85c3b2e4ce56f1ddb0e11 +8c30e4c034c02958384564cac4f85022ef36ab5697a3d2feaf6bf105049675bbf23d01b4b6814711d3d9271abff04cac +81f7999e7eeea30f3e1075e6780bbf054f2fb6f27628a2afa4d41872a385b4216dd5f549da7ce6cf39049b2251f27fb7 +b36a7191f82fc39c283ffe53fc1f5a9a00b4c64eee7792a8443475da9a4d226cf257f226ea9d66e329af15d8f04984ec +aad4da528fdbb4db504f3041c747455baff5fcd459a2efd78f15bdf3aea0bdb808343e49df88fe7a7c8620009b7964a3 +99ebd8c6dd5dd299517fb6381cfc2a7f443e6e04a351440260dd7c2aee3f1d8ef06eb6c18820b394366ecdfd2a3ce264 +8873725b81871db72e4ec3643084b1cdce3cbf80b40b834b092767728605825c19b6847ad3dcf328438607e8f88b4410 +b008ee2f895daa6abd35bd39b6f7901ae4611a11a3271194e19da1cdcc7f1e1ea008fe5c5440e50d2c273784541ad9c5 +9036feafb4218d1f576ef89d0e99124e45dacaa6d816988e34d80f454d10e96809791d5b78f7fd65f569e90d4d7238c5 +92073c1d11b168e4fa50988b0288638b4868e48bbc668c5a6dddf5499875d53be23a285acb5e4bad60114f6cf6c556e9 +88c87dfcb8ba6cbfe7e1be081ccfadbd589301db2cb7c99f9ee5d7db90aa297ed1538d5a867678a763f2deede5fd219a +b42a562805c661a50f5dea63108002c0f27c0da113da6a9864c9feb5552225417c0356c4209e8e012d9bcc9d182c7611 +8e6317d00a504e3b79cd47feb4c60f9df186467fe9ca0f35b55c0364db30528f5ff071109dabb2fc80bb9cd4949f0c24 +b7b1ea6a88694f8d2f539e52a47466695e39e43a5eb9c6f23bca15305fe52939d8755cc3ac9d6725e60f82f994a3772f +a3cd55161befe795af93a38d33290fb642b8d80da8b786c6e6fb02d393ea308fbe87f486994039cbd7c7b390414594b6 +b416d2d45b44ead3b1424e92c73c2cf510801897b05d1724ff31cbd741920cd858282fb5d6040fe1f0aa97a65bc49424 +950ee01291754feace97c2e933e4681e7ddfbc4fcd079eb6ff830b0e481d929c93d0c7fb479c9939c28ca1945c40da09 +869bd916aee8d86efe362a49010382674825d49195b413b4b4018e88ce43fe091b475d0b863ff0ba2259400f280c2b23 +9782f38cd9c9d3385ec286ebbc7cba5b718d2e65a5890b0a5906b10a89dc8ed80d417d71d7c213bf52f2af1a1f513ea7 +91cd33bc2628d096269b23faf47ee15e14cb7fdc6a8e3a98b55e1031ea0b68d10ba30d97e660f7e967d24436d40fad73 +8becc978129cc96737034c577ae7225372dd855da8811ae4e46328e020c803833b5bdbc4a20a93270e2b8bd1a2feae52 +a36b1d8076783a9522476ce17f799d78008967728ce920531fdaf88303321bcaf97ecaa08e0c01f77bc32e53c5f09525 +b4720e744943f70467983aa34499e76de6d59aa6fadf86f6b787fdce32a2f5b535b55db38fe2da95825c51002cfe142d +91ad21fc502eda3945f6de874d1b6bf9a9a7711f4d61354f9e5634fc73f9c06ada848de15ab0a75811d3250be862827d +84f78e2ebf5fc077d78635f981712daf17e2475e14c2a96d187913006ad69e234746184a51a06ef510c9455b38acb0d7 +960aa7906e9a2f11db64a26b5892ac45f20d2ccb5480f4888d89973beb6fa0dfdc06d68d241ff5ffc7f1b82b1aac242d +a99365dcd1a00c66c9db6924b97c920f5c723380e823b250db85c07631b320ec4e92e586f7319e67a522a0578f7b6d6c +a25d92d7f70cf6a88ff317cfec071e13774516da664f5fac0d4ecaa65b8bf4eb87a64a4d5ef2bd97dfae98d388dbf5cc +a7af47cd0041295798f9779020a44653007444e8b4ef0712982b06d0dcdd434ec4e1f7c5f7a049326602cb605c9105b7 +aefe172eac5568369a05980931cc476bebd9dea573ba276d59b9d8c4420784299df5a910033b7e324a6c2dfc62e3ef05 +b69bc9d22ffa645baa55e3e02522e9892bb2daa7fff7c15846f13517d0799766883ee09ae0869df4139150c5b843ca8a +95a10856140e493354fdd12722c7fdded21b6a2ffbc78aa2697104af8ad0c8e2206f44b0bfee077ef3949d46bbf7c16b +891f2fcd2c47cbea36b7fa715968540c233313f05333f09d29aba23c193f462ed490dd4d00969656e89c53155fdfe710 +a6c33e18115e64e385c843dde34e8a228222795c7ca90bc2cc085705d609025f3351d9be61822c69035a49fb3e48f2d5 +b87fb12f12c0533b005adad0487f03393ff682e13575e3cb57280c3873b2c38ba96a63c49eef7a442753d26b7005230b +b905c02ba451bfd411c135036d92c27af3b0b1c9c2f1309d6948544a264b125f39dd41afeff4666b12146c545adc168a +8b29c513f43a78951cf742231cf5457a6d9d55edf45df5481a0f299a418d94effef561b15d2c1a01d1b8067e7153fda9 +b9941cccd51dc645920d2781c81a317e5a33cb7cf76427b60396735912cb6d2ca9292bb4d36b6392467d390d2c58d9f3 +a8546b627c76b6ef5c93c6a98538d8593dbe21cb7673fd383d5401b0c935eea0bdeeefeb1af6ad41bad8464fb87bbc48 +aa286b27de2812de63108a1aec29d171775b69538dc6198640ac1e96767c2b83a50391f49259195957d457b493b667c9 +a932fb229f641e9abbd8eb2bd874015d97b6658ab6d29769fc23b7db9e41dd4f850382d4c1f08af8f156c5937d524473 +a1412840fcc86e2aeec175526f2fb36e8b3b8d21a78412b7266daf81e51b3f68584ed8bd42a66a43afdd8c297b320520 +89c78be9efb624c97ebca4fe04c7704fa52311d183ffd87737f76b7dadc187c12c982bd8e9ed7cd8beb48cdaafd2fd01 +a3f5ddec412a5bec0ce15e3bcb41c6214c2b05d4e9135a0d33c8e50a78eaba71e0a5a6ea8b45854dec5c2ed300971fc2 +9721f9cec7a68b7758e3887548790de49fa6a442d0396739efa20c2f50352a7f91d300867556d11a703866def2d5f7b5 +a23764e140a87e5991573521af039630dd28128bf56eed2edbed130fd4278e090b60cf5a1dca9de2910603d44b9f6d45 +a1a6494a994215e48ab55c70efa8ffdddce6e92403c38ae7e8dd2f8288cad460c6c7db526bbdf578e96ca04d9fe12797 +b1705ea4cb7e074efe0405fc7b8ee2ec789af0426142f3ec81241cacd4f7edcd88e39435e4e4d8e7b1df64f3880d6613 +85595d061d677116089a6064418b93eb44ff79e68d12bd9625078d3bbc440a60d0b02944eff6054433ee34710ae6fbb4 +9978d5e30bedb7526734f9a1febd973a70bfa20890490e7cc6f2f9328feab1e24f991285dbc3711d892514e2d7d005ad +af30243c66ea43b9f87a061f947f7bce745f09194f6e95f379c7582b9fead920e5d6957eaf05c12ae1282ada4670652f +a1930efb473f88001e47aa0b2b2a7566848cccf295792e4544096ecd14ee5d7927c173a8576b405bfa2eec551cd67eb5 +b0446d1c590ee5a45f7e22d269c044f3848c97aec1d226b44bfd0e94d9729c28a38bccddc3a1006cc5fe4e3c24f001f2 +b8a8380172df3d84b06176df916cf557966d4f2f716d3e9437e415d75b646810f79f2b2b71d857181b7fc944018883a3 +a563afec25b7817bfa26e19dc9908bc00aa8fc3d19be7d6de23648701659009d10e3e4486c28e9c6b13d48231ae29ac5 +a5a8e80579de886fb7d6408f542791876885947b27ad6fa99a8a26e381f052598d7b4e647b0115d4b5c64297e00ce28e +8f87afcc7ad33c51ac719bade3cd92da671a37a82c14446b0a2073f4a0a23085e2c8d31913ed2d0be928f053297de8f6 +a43c455ce377e0bc434386c53c752880687e017b2f5ae7f8a15c044895b242dffde4c92fb8f8bb50b18470b17351b156 +8368f8b12a5bceb1dba25adb3a2e9c7dc9b1a77a1f328e5a693f5aec195cd1e06b0fe9476b554c1c25dac6c4a5b640a3 +919878b27f3671fc78396f11531c032f3e2bd132d04cc234fa4858676b15fb1db3051c0b1db9b4fc49038216f11321ce +b48cd67fb7f1242696c1f877da4bdf188eac676cd0e561fbac1a537f7b8229aff5a043922441d603a26aae56a15faee4 +a3e0fdfd4d29ea996517a16f0370b54787fefe543c2fe73bfc6f9e560c1fd30dad8409859e2d7fa2d44316f24746c712 +8bb156ade8faf149df7bea02c140c7e392a4742ae6d0394d880a849127943e6f26312033336d3b9fdc0092d71b5efe87 +8845e5d5cc555ca3e0523244300f2c8d7e4d02aaebcb5bd749d791208856c209a6f84dd99fd55968c9f0ab5f82916707 +a3e90bb5c97b07789c2f32dff1aec61d0a2220928202f5ad5355ae71f8249237799d6c8a22602e32e572cb12eabe0c17 +b150bcc391884c996149dc3779ce71f15dda63a759ee9cc05871f5a8379dcb62b047098922c0f26c7bd04deb394c33f9 +95cd4ad88d51f0f2efcfd0c2df802fe252bb9704d1afbf9c26a248df22d55da87bdfaf41d7bc6e5df38bd848f0b13f42 +a05a49a31e91dff6a52ac8b9c2cfdd646a43f0d488253f9e3cfbce52f26667166bbb9b608fc358763a65cbf066cd6d05 +a59c3c1227fdd7c2e81f5e11ef5c406da44662987bac33caed72314081e2eed66055d38137e01b2268e58ec85dd986c0 +b7020ec3bd73a99861f0f1d88cf5a19abab1cbe14b7de77c9868398c84bb8e18dbbe9831838a96b6d6ca06e82451c67b +98d1ff2525e9718ee59a21d8900621636fcd873d9a564b8dceb4be80a194a0148daf1232742730b3341514b2e5a5436c +886d97b635975fc638c1b6afc493e5998ca139edba131b75b65cfe5a8e814f11bb678e0eeee5e6e5cd913ad3f2fefdfc +8fb9fd928d38d5d813b671c924edd56601dd7163b686c13f158645c2f869d9250f3859aa5463a39258c90fef0f41190a +aac35e1cd655c94dec3580bb3800bd9c2946c4a9856f7d725af15fbea6a2d8ca51c8ad2772abed60ee0e3fb9cb24046b +b8d71fa0fa05ac9e443c9b4929df9e7f09a919be679692682e614d24227e04894bfc14a5c73a62fb927fedff4a0e4aa7 +a45a19f11fbbb531a704badbb813ed8088ab827c884ee4e4ebf363fa1132ff7cfa9d28be9c85b143e4f7cdbc94e7cf1a +82b54703a4f295f5471b255ab59dce00f0fe90c9fb6e06b9ee48b15c91d43f4e2ef4a96c3118aeb03b08767be58181bb +8283264c8e6d2a36558f0d145c18576b6600ff45ff99cc93eca54b6c6422993cf392668633e5df396b9331e873d457e5 +8c549c03131ead601bc30eb6b9537b5d3beb7472f5bb1bcbbfd1e9f3704477f7840ab3ab7f7dc13bbbbcdff886a462d4 +afbb0c520ac1b5486513587700ad53e314cb74bfbc12e0b5fbdcfdaac36d342e8b59856196a0d84a25cff6e6e1d17e76 +89e4c22ffb51f2829061b3c7c1983c5c750cad158e3a825d46f7cf875677da5d63f653d8a297022b5db5845c9271b32b +afb27a86c4c2373088c96b9adf4433f2ebfc78ac5c526e9f0510670b6e4e5e0057c0a4f75b185e1a30331b9e805c1c15 +a18e16b57445f88730fc5d3567bf5a176861dc14c7a08ed2996fe80eed27a0e7628501bcb78a1727c5e9ac55f29c12c4 +93d61bf88b192d6825cf4e1120af1c17aa0f994d158b405e25437eaeefae049f7b721a206e7cc8a04fdc29d3c42580a1 +a99f2995a2e3ed2fd1228d64166112038de2f516410aa439f4c507044e2017ea388604e2d0f7121256fadf7fbe7023d1 +914fd91cffc23c32f1c6d0e98bf660925090d873367d543034654389916f65f552e445b0300b71b61b721a72e9a5983c +b42a578a7787b71f924e7def425d849c1c777156b1d4170a8ee7709a4a914e816935131afd9a0412c4cb952957b20828 +82fb30590e84b9e45db1ec475a39971cf554dc01bcc7050bc89265740725c02e2be5a972168c5170c86ae83e5b0ad2c0 +b14f8d8e1e93a84976289e0cf0dfa6f3a1809e98da16ee5c4932d0e1ed6bf8a07697fdd4dd86a3df84fb0003353cdcc0 +85d7a2f4bda31aa2cb208b771fe03291a4ebdaf6f1dc944c27775af5caec412584c1f45bc741fca2a6a85acb3f26ad7d +af02e56ce886ff2253bc0a68faad76f25ead84b2144e5364f3fb9b648f03a50ee9dc0b2c33ebacf7c61e9e43201ef9ef +87e025558c8a0b0abd06dfc350016847ea5ced7af2d135a5c9eec9324a4858c4b21510fb0992ec52a73447f24945058e +80fff0bafcd058118f5e7a4d4f1ae0912efeb281d2cbe4d34ba8945cc3dbe5d8baf47fb077343b90b8d895c90b297aca +b6edcf3a40e7b1c3c0148f47a263cd819e585a51ef31c2e35a29ce6f04c53e413f743034c0d998d9c00a08ba00166f31 +abb87ed86098c0c70a76e557262a494ff51a30fb193f1c1a32f8e35eafa34a43fcc07aa93a3b7a077d9e35afa07b1a3d +a280214cd3bb0fb7ecd2d8bcf518cbd9078417f2b91d2533ec2717563f090fb84f2a5fcfdbbeb2a2a1f8a71cc5aa5941 +a63083ca7238ea2b57d15a475963cf1d4f550d8cd76db290014a0461b90351f1f26a67d674c837b0b773b330c7c3d534 +a8fa39064cb585ece5263e2f42f430206476bf261bd50f18d2b694889bd79d04d56410664cecad62690e5c5a20b3f6ff +85ba52ce9d700a5dcf6c5b00559acbe599d671ce5512467ff4b6179d7fad550567ce2a9c126a50964e3096458ea87920 +b913501e1008f076e5eac6d883105174f88b248e1c9801e568fefaffa1558e4909364fc6d9512aa4d125cbd7cc895f05 +8eb33b5266c8f2ed4725a6ad147a322e44c9264cf261c933cbbe230a43d47fca0f29ec39756b20561dabafadd5796494 +850ebc8b661a04318c9db5a0515066e6454fa73865aa4908767a837857ecd717387f614acb614a88e075d4edc53a2f5a +a08d6b92d866270f29f4ce23a3f5d99b36b1e241a01271ede02817c8ec3f552a5c562db400766c07b104a331835c0c64 +8131804c89bb3e74e9718bfc4afa547c1005ff676bd4db9604335032b203390cfa54478d45c6c78d1fe31a436ed4be9f +9106d94f23cc1eacec8316f16d6f0a1cc160967c886f51981fdb9f3f12ee1182407d2bb24e5b873de58cb1a3ee915a6b +a13806bfc3eae7a7000c9d9f1bd25e10218d4e67f59ae798b145b098bca3edad2b1040e3fc1e6310e612fb8818f459ac +8c69fbca502046cb5f6db99900a47b34117aef3f4b241690cdb3b84ca2a2fc7833e149361995dc41fa78892525bce746 +852c473150c91912d58ecb05769222fa18312800c3f56605ad29eec9e2d8667b0b81c379048d3d29100ed2773bb1f3c5 +b1767f6074426a00e01095dbb1795beb4e4050c6411792cbad6537bc444c3165d1058bafd1487451f9c5ddd209e0ae7e +80c600a5fe99354ce59ff0f84c760923dc8ff66a30bf47dc0a086181785ceb01f9b951c4e66df800ea6d705e8bc47055 +b5cf19002fbc88a0764865b82afcb4d64a50196ea361e5c71dff7de084f4dcbbc34ec94a45cc9e0247bd51da565981aa +93e67a254ea8ce25e112d93cc927fadaa814152a2c4ec7d9a56eaa1ed47aec99b7e9916b02e64452cc724a6641729bbb +ace70b32491bda18eee4a4d041c3bc9effae9340fe7e6c2f5ad975ee0874c17f1a7da7c96bd85fccff9312c518fac6e9 +ab4cfa02065017dd7f1aadc66f2c92f78f0f11b8597c03a5d69d82cb2eaf95a4476a836ac102908f137662472c8d914b +a40b8cd8deb8ae503d20364d64cab7c2801b7728a9646ed19c65edea6a842756a2f636283494299584ad57f4bb12cd0b +8594e11d5fc2396bcd9dbf5509ce4816dbb2b7305168021c426171fb444d111da5a152d6835ad8034542277011c26c0e +8024de98c26b4c994a66628dc304bb737f4b6859c86ded552c5abb81fd4c6c2e19d5a30beed398a694b9b2fdea1dd06a +8843f5872f33f54df8d0e06166c1857d733995f67bc54abb8dfa94ad92407cf0179bc91b0a50bbb56cdc2b350d950329 +b8bab44c7dd53ef9edf497dcb228e2a41282c90f00ba052fc52d57e87b5c8ab132d227af1fcdff9a12713d1f980bcaae +982b4d7b29aff22d527fd82d2a52601d95549bfb000429bb20789ed45e5abf1f4b7416c7b7c4b79431eb3574b29be658 +8eb1f571b6a1878e11e8c1c757e0bc084bab5e82e897ca9be9b7f4b47b91679a8190bf0fc8f799d9b487da5442415857 +a6e74b588e5af935c8b243e888582ef7718f8714569dd4992920740227518305eb35fab674d21a5551cca44b3e511ef2 +a30fc2f3a4cb4f50566e82307de73cd7bd8fe2c1184e9293c136a9b9e926a018d57c6e4f308c95b9eb8299e94d90a2a1 +a50c5869ca5d2b40722c056a32f918d47e0b65ca9d7863ca7d2fb4a7b64fe523fe9365cf0573733ceaadebf20b48fff8 +83bbdd32c04d17581418cf360749c7a169b55d54f2427390defd9f751f100897b2d800ce6636c5bbc046c47508d60c8c +a82904bdf614de5d8deaff688c8a5e7ac5b3431687acbcda8fa53960b7c417a39c8b2e462d7af91ce6d79260f412db8e +a4362e31ff4b05d278b033cf5eebea20de01714ae16d4115d04c1da4754269873afc8171a6f56c5104bfd7b0db93c3e7 +b5b8daa63a3735581e74a021b684a1038cea77168fdb7fdf83c670c2cfabcfc3ab2fc7359069b5f9048188351aef26b5 +b48d723894b7782d96ac8433c48faca1bdfa5238019c451a7f47d958097cce3ae599b876cf274269236b9d6ff8b6d7ca +98ffff6a61a3a6205c7820a91ca2e7176fab5dba02bc194c4d14942ac421cb254183c705506ab279e4f8db066f941c6c +ae7db24731da2eaa6efc4f7fcba2ecc26940ddd68038dce43acf2cee15b72dc4ef42a7bfdd32946d1ed78786dd7696b3 +a656db14f1de9a7eb84f6301b4acb2fbf78bfe867f48a270e416c974ab92821eb4df1cb881b2d600cfed0034ac784641 +aa315f8ecba85a5535e9a49e558b15f39520fce5d4bf43131bfbf2e2c9dfccc829074f9083e8d49f405fb221d0bc4c3c +90bffba5d9ff40a62f6c8e9fc402d5b95f6077ed58d030c93e321b8081b77d6b8dac3f63a92a7ddc01585cf2c127d66c +abdd733a36e0e0f05a570d0504e73801bf9b5a25ff2c78786f8b805704997acb2e6069af342538c581144d53149fa6d3 +b4a723bb19e8c18a01bd449b1bb3440ddb2017f10bb153da27deb7a6a60e9bb37619d6d5435fbb1ba617687838e01dd0 +870016b4678bab3375516db0187a2108b2e840bae4d264b9f4f27dbbc7cc9cac1d7dc582d7a04d6fd1ed588238e5e513 +80d33d2e20e8fc170aa3cb4f69fffb72aeafb3b5bb4ea0bc79ab55da14142ca19b2d8b617a6b24d537366e3b49cb67c3 +a7ee76aec273aaae03b3b87015789289551969fb175c11557da3ab77e39ab49d24634726f92affae9f4d24003050d974 +8415ea4ab69d779ebd42d0fe0c6aef531d6a465a5739e429b1fcf433ec45aa8296c527e965a20f0ec9f340c9273ea3cf +8c7662520794e8b4405d0b33b5cac839784bc86a5868766c06cbc1fa306dbe334978177417b31baf90ce7b0052a29c56 +902b2abecc053a3dbdea9897ee21e74821f3a1b98b2d560a514a35799f4680322550fd3a728d4f6d64e1de98033c32b8 +a05e84ed9ecab8d508d670c39f2db61ad6e08d2795ec32a3c9d0d3737ef3801618f4fc2a95f90ec2f068606131e076c5 +8b9208ff4d5af0c2e3f53c9375da666773ac57197dfabb0d25b1c8d0588ba7f3c15ee9661bb001297f322ea2fbf6928b +a3c827741b34a03254d4451b5ab74a96f2b9f7fb069e2f5adaf54fd97cc7a4d516d378db5ca07da87d8566d6eef13726 +8509d8a3f4a0ed378e0a1e28ea02f6bf1d7f6c819c6c2f5297c7df54c895b848f841653e32ba2a2c22c2ff739571acb8 +a0ce988b7d3c40b4e496aa83a09e4b5472a2d98679622f32bea23e6d607bc7de1a5374fb162bce0549a67dad948519be +aa8a3dd12bd60e3d2e05f9c683cdcb8eab17fc59134815f8d197681b1bcf65108cba63ac5c58ee632b1e5ed6bba5d474 +8b955f1d894b3aefd883fb4b65f14cd37fc2b9db77db79273f1700bef9973bf3fd123897ea2b7989f50003733f8f7f21 +ac79c00ddac47f5daf8d9418d798d8af89fc6f1682e7e451f71ea3a405b0d36af35388dd2a332af790bc83ca7b819328 +a0d44dd2a4438b809522b130d0938c3fe7c5c46379365dbd1810a170a9aa5818e1c783470dd5d0b6d4ac7edbb7330910 +a30b69e39ad43dd540a43c521f05b51b5f1b9c4eed54b8162374ae11eac25da4f5756e7b70ce9f3c92c2eeceee7431ed +ac43220b762c299c7951222ea19761ab938bf38e4972deef58ed84f4f9c68c230647cf7506d7cbfc08562fcca55f0485 +b28233b46a8fb424cfa386a845a3b5399d8489ceb83c8f3e05c22c934798d639c93718b7b68ab3ce24c5358339e41cbb +ac30d50ee8ce59a10d4b37a3a35e62cdb2273e5e52232e202ca7d7b8d09d28958ee667fae41a7bb6cdc6fe8f6e6c9c85 +b199842d9141ad169f35cc7ff782b274cbaa645fdb727761e0a89edbf0d781a15f8218b4bf4eead326f2903dd88a9cc1 +85e018c7ddcad34bb8285a737c578bf741ccd547e68c734bdb3808380e12c5d4ef60fc896b497a87d443ff9abd063b38 +8c856e6ba4a815bdb891e1276f93545b7072f6cb1a9aa6aa5cf240976f29f4dee01878638500a6bf1daf677b96b54343 +b8a47555fa8710534150e1a3f13eab33666017be6b41005397afa647ea49708565f2b86b77ad4964d140d9ced6b4d585 +8cd1f1db1b2f4c85a3f46211599caf512d5439e2d8e184663d7d50166fd3008f0e9253272f898d81007988435f715881 +b1f34b14612c973a3eceb716dc102b82ab18afef9de7630172c2780776679a7706a4874e1df3eaadf541fb009731807f +b25464af9cff883b55be2ff8daf610052c02df9a5e147a2cf4df6ce63edcdee6dc535c533590084cc177da85c5dc0baa +91c3c4b658b42d8d3448ae1415d4541d02379a40dc51e36a59bd6e7b9ba3ea51533f480c7c6e8405250ee9b96a466c29 +86dc027b95deb74c36a58a1333a03e63cb5ae22d3b29d114cfd2271badb05268c9d0c819a977f5e0c6014b00c1512e3a +ae0e6ff58eb5fa35da5107ebeacf222ab8f52a22bb1e13504247c1dfa65320f40d97b0e6b201cb6613476687cb2f0681 +8f13415d960b9d7a1d93ef28afc2223e926639b63bdefce0f85e945dfc81670a55df288893a0d8b3abe13c5708f82f91 +956f67ca49ad27c1e3a68c1faad5e7baf0160c459094bf6b7baf36b112de935fdfd79fa4a9ea87ea8de0ac07272969f4 +835e45e4a67df9fb51b645d37840b3a15c171d571a10b03a406dd69d3c2f22df3aa9c5cbe1e73f8d767ce01c4914ea9a +919b938e56d4b32e2667469d0bdccb95d9dda3341aa907683ee70a14bbbe623035014511c261f4f59b318b610ac90aa3 +96b48182121ccd9d689bf1dfdc228175564cd68dc904a99c808a7f0053a6f636c9d953e12198bdf2ea49ea92772f2e18 +ac5e5a941d567fa38fdbcfa8cf7f85bb304e3401c52d88752bcd516d1fa9bac4572534ea2205e38423c1df065990790f +ac0bd594fb85a8d4fc26d6df0fa81f11919401f1ecf9168b891ec7f061a2d9368af99f7fd8d9b43b2ce361e7b8482159 +83d92c69ca540d298fe80d8162a1c7af3fa9b49dfb69e85c1d136a3ec39fe419c9fa78e0bb6d96878771fbd37fe92e40 +b35443ae8aa66c763c2db9273f908552fe458e96696b90e41dd509c17a5c04ee178e3490d9c6ba2dc0b8f793c433c134 +923b2d25aa45b2e580ffd94cbb37dc8110f340f0f011217ee1bd81afb0714c0b1d5fb4db86006cdd2457563276f59c59 +96c9125d38fca1a61ac21257b696f8ac3dae78def50285e44d90ea293d591d1c58f703540a7e4e99e070afe4646bbe15 +b57946b2332077fbcdcb406b811779aefd54473b5559a163cd65cb8310679b7e2028aa55c12a1401fdcfcac0e6fae29a +845daedc5cf972883835d7e13c937b63753c2200324a3b8082a6c4abb4be06c5f7c629d4abe4bfaf1d80a1f073eb6ce6 +91a55dfd0efefcd03dc6dacc64ec93b8d296cb83c0ee72400a36f27246e7f2a60e73b7b70ba65819e9cfb73edb7bd297 +8874606b93266455fe8fdd25df9f8d2994e927460af06f2e97dd4d2d90db1e6b06d441b72c2e76504d753badca87fb37 +8ee99e6d231274ff9252c0f4e84549da173041299ad1230929c3e3d32399731c4f20a502b4a307642cac9306ccd49d3c +8836497714a525118e20849d6933bb8535fb6f72b96337d49e3133d936999c90a398a740f42e772353b5f1c63581df6d +a6916945e10628f7497a6cdc5e2de113d25f7ade3e41e74d3de48ccd4fce9f2fa9ab69645275002e6f49399b798c40af +9597706983107eb23883e0812e1a2c58af7f3499d50c6e29b455946cb9812fde1aa323d9ed30d1c0ffd455abe32303cd +a24ee89f7f515cc33bdbdb822e7d5c1877d337f3b2162303cfc2dae028011c3a267c5cb4194afa63a4856a6e1c213448 +8cd25315e4318801c2776824ae6e7d543cb85ed3bc2498ba5752df2e8142b37653cf9e60104d674be3aeb0a66912e97a +b5085ecbe793180b40dbeb879f4c976eaaccaca3a5246807dced5890e0ed24d35f3f86955e2460e14fb44ff5081c07ba +960188cc0b4f908633a6840963a6fa2205fc42c511c6c309685234911c5304ef4c304e3ae9c9c69daa2fb6a73560c256 +a32d0a70bf15d569b4cda5aebe3e41e03c28bf99cdd34ffa6c5d58a097f322772acca904b3a47addb6c7492a7126ebac +977f72d06ad72d4aa4765e0f1f9f4a3231d9f030501f320fe7714cc5d329d08112789fa918c60dd7fdb5837d56bb7fc6 +99fa038bb0470d45852bb871620d8d88520adb701712fcb1f278fed2882722b9e729e6cdce44c82caafad95e37d0e6f7 +b855e8f4fc7634ada07e83b6c719a1e37acb06394bc8c7dcab7747a8c54e5df3943915f021364bd019fdea103864e55f +88bc2cd7458532e98c596ef59ea2cf640d7cc31b4c33cef9ed065c078d1d4eb49677a67de8e6229cc17ea48bace8ee5a +aaa78a3feaa836d944d987d813f9b9741afb076e6aca1ffa42682ab06d46d66e0c07b8f40b9dbd63e75e81efa1ef7b08 +b7b080420cc4d808723b98b2a5b7b59c81e624ab568ecdfdeb8bf3aa151a581b6f56e983ef1b6f909661e25db40b0c69 +abee85c462ac9a2c58e54f06c91b3e5cd8c5f9ab5b5deb602b53763c54826ed6deb0d6db315a8d7ad88733407e8d35e2 +994d075c1527407547590df53e9d72dd31f037c763848d1662eebd4cefec93a24328c986802efa80e038cb760a5300f5 +ab8777640116dfb6678e8c7d5b36d01265dfb16321abbfc277da71556a34bb3be04bc4ae90124ed9c55386d2bfb3bda0 +967e3a828bc59409144463bcf883a3a276b5f24bf3cbfdd7a42343348cba91e00b46ac285835a9b91eef171202974204 +875a9f0c4ffe5bb1d8da5e3c8e41d0397aa6248422a628bd60bfae536a651417d4e8a7d2fb98e13f2dad3680f7bd86d3 +acaa330c3e8f95d46b1880126572b238dbb6d04484d2cd4f257ab9642d8c9fc7b212188b9c7ac9e0fd135c520d46b1bf +aceb762edbb0f0c43dfcdb01ea7a1ac5918ca3882b1e7ebc4373521742f1ed5250d8966b498c00b2b0f4d13212e6dd0b +81d072b4ad258b3646f52f399bced97c613b22e7ad76373453d80b1650c0ca87edb291a041f8253b649b6e5429bb4cff +980a47d27416ac39c7c3a0ebe50c492f8c776ea1de44d5159ac7d889b6d554357f0a77f0e5d9d0ff41aae4369eba1fc2 +8b4dfd5ef5573db1476d5e43aacfb5941e45d6297794508f29c454fe50ea622e6f068b28b3debe8635cf6036007de2e3 +a60831559d6305839515b68f8c3bc7abbd8212cc4083502e19dd682d56ca37c9780fc3ce4ec2eae81ab23b221452dc57 +951f6b2c1848ced9e8a2339c65918e00d3d22d3e59a0a660b1eca667d18f8430d737884e9805865ef3ed0fe1638a22d9 +b02e38fe790b492aa5e89257c4986c9033a8b67010fa2add9787de857d53759170fdd67715ca658220b4e14b0ca48124 +a51007e4346060746e6b0e4797fc08ef17f04a34fe24f307f6b6817edbb8ce2b176f40771d4ae8a60d6152cbebe62653 +a510005b05c0b305075b27b243c9d64bcdce85146b6ed0e75a3178b5ff9608213f08c8c9246f2ca6035a0c3e31619860 +aaff4ef27a7a23be3419d22197e13676d6e3810ceb06a9e920d38125745dc68a930f1741c9c2d9d5c875968e30f34ab5 +864522a9af9857de9814e61383bebad1ba9a881696925a0ea6bfc6eff520d42c506bbe5685a9946ed710e889765be4a0 +b63258c080d13f3b7d5b9f3ca9929f8982a6960bdb1b0f8676f4dca823971601672f15e653917bf5d3746bb220504913 +b51ce0cb10869121ae310c7159ee1f3e3a9f8ad498827f72c3d56864808c1f21fa2881788f19ece884d3f705cd7bd0c5 +95d9cecfc018c6ed510e441cf84c712d9909c778c16734706c93222257f64dcd2a9f1bd0b400ca271e22c9c487014274 +8beff4d7d0140b86380ff4842a9bda94c2d2be638e20ac68a4912cb47dbe01a261857536375208040c0554929ced1ddc +891ff49258749e2b57c1e9b8e04b12c77d79c3308b1fb615a081f2aacdfb4b39e32d53e069ed136fdbd43c53b87418fa +9625cad224e163d387738825982d1e40eeff35fe816d10d7541d15fdc4d3eee48009090f3faef4024b249205b0b28f72 +8f3947433d9bd01aa335895484b540a9025a19481a1c40b4f72dd676bfcf332713714fd4010bde936eaf9470fd239ed0 +a00ec2d67789a7054b53f0e858a8a232706ccc29a9f3e389df7455f1a51a2e75801fd78469a13dbc25d28399ae4c6182 +a3f65884506d4a62b8775a0ea0e3d78f5f46bc07910a93cd604022154eabdf1d73591e304d61edc869e91462951975e1 +a14eef4fd5dfac311713f0faa9a60415e3d30b95a4590cbf95f2033dffb4d16c02e7ceff3dcd42148a4e3bc49cce2dd4 +8afa11c0eef3c540e1e3460bc759bb2b6ea90743623f88e62950c94e370fe4fd01c22b6729beba4dcd4d581198d9358f +afb05548a69f0845ffcc5f5dc63e3cdb93cd270f5655173b9a950394b0583663f2b7164ba6df8d60c2e775c1d9f120af +97f179e01a947a906e1cbeafa083960bc9f1bade45742a3afee488dfb6011c1c6e2db09a355d77f5228a42ccaa7bdf8e +8447fca4d35f74b3efcbd96774f41874ca376bf85b79b6e66c92fa3f14bdd6e743a051f12a7fbfd87f319d1c6a5ce217 +a57ca39c23617cd2cf32ff93b02161bd7baf52c4effb4679d9d5166406e103bc8f3c6b5209e17c37dbb02deb8bc72ddd +9667c7300ff80f0140be002b0e36caab07aaee7cce72679197c64d355e20d96196acaf54e06e1382167d081fe6f739c1 +828126bb0559ce748809b622677267ca896fa2ee76360fd2c02990e6477e06a667241379ca7e65d61a5b64b96d7867de +8b8835dea6ba8cf61c91f01a4b3d2f8150b687a4ee09b45f2e5fc8f80f208ae5d142d8e3a18153f0722b90214e60c5a7 +a98e8ff02049b4da386e3ee93db23bbb13dfeb72f1cfde72587c7e6d962780b7671c63e8ac3fbaeb1a6605e8d79e2f29 +87a4892a0026d7e39ef3af632172b88337cb03669dea564bcdb70653b52d744730ebb5d642e20cb627acc9dbb547a26b +877352a22fc8052878a57effc159dac4d75fe08c84d3d5324c0bab6d564cdf868f33ceee515eee747e5856b62cfa0cc7 +8b801ba8e2ff019ee62f64b8cb8a5f601fc35423eb0f9494b401050103e1307dc584e4e4b21249cd2c686e32475e96c3 +a9e7338d6d4d9bfec91b2af28a8ed13b09415f57a3a00e5e777c93d768fdb3f8e4456ae48a2c6626b264226e911a0e28 +99c05fedf40ac4726ed585d7c1544c6e79619a0d3fb6bda75a08c7f3c0008e8d5e19ed4da48de3216135f34a15eba17c +a61cce8a1a8b13a4a650fdbec0eeea8297c352a8238fb7cac95a0df18ed16ee02a3daa2de108fa122aca733bd8ad7855 +b97f37da9005b440b4cb05870dd881bf8491fe735844f2d5c8281818583b38e02286e653d9f2e7fa5e74c3c3eb616540 +a72164a8554da8e103f692ac5ebb4aece55d5194302b9f74b6f2a05335b6e39beede0bf7bf8c5bfd4d324a784c5fb08c +b87e8221c5341cd9cc8bb99c10fe730bc105550f25ed4b96c0d45e6142193a1b2e72f1b3857373a659b8c09be17b3d91 +a41fb1f327ef91dcb7ac0787918376584890dd9a9675c297c45796e32d6e5985b12f9b80be47fc3a8596c245f419d395 +90dafa3592bdbb3465c92e2a54c2531822ba0459d45d3e7a7092fa6b823f55af28357cb51896d4ec2d66029c82f08e26 +a0a9adc872ebc396557f484f1dd21954d4f4a21c4aa5eec543f5fa386fe590839735c01f236574f7ff95407cd12de103 +b8c5c940d58be7538acf8672852b5da3af34f82405ef2ce8e4c923f1362f97fc50921568d0fd2fe846edfb0823e62979 +85aaf06a8b2d0dac89dafd00c28533f35dbd074978c2aaa5bef75db44a7b12aeb222e724f395513b9a535809a275e30b +81f3cbe82fbc7028c26a6c1808c604c63ba023a30c9f78a4c581340008dbda5ec07497ee849a2183fcd9124f7936af32 +a11ac738de75fd60f15a34209d3825d5e23385796a4c7fc5931822f3f380af977dd0f7b59fbd58eed7777a071e21b680 +85a279c493de03db6fa6c3e3c1b1b29adc9a8c4effc12400ae1128da8421954fa8b75ad19e5388fe4543b76fb0812813 +83a217b395d59ab20db6c4adb1e9713fc9267f5f31a6c936042fe051ce8b541f579442f3dcf0fa16b9e6de9fd3518191 +83a0b86e7d4ed8f9ccdc6dfc8ff1484509a6378fa6f09ed908e6ab9d1073f03011dc497e14304e4e3d181b57de06a5ab +a63ad69c9d25704ce1cc8e74f67818e5ed985f8f851afa8412248b2df5f833f83b95b27180e9e7273833ed0d07113d3b +99b1bc2021e63b561fe44ddd0af81fcc8627a91bfeecbbc989b642bc859abc0c8d636399701aad7bbaf6a385d5f27d61 +b53434adb66f4a807a6ad917c6e856321753e559b1add70824e5c1e88191bf6993fccb9b8b911fc0f473fb11743acacd +97ed3b9e6fb99bf5f945d4a41f198161294866aa23f2327818cdd55cb5dc4c1a8eff29dd8b8d04902d6cd43a71835c82 +b1e808260e368a18d9d10bdea5d60223ba1713b948c782285a27a99ae50cc5fc2c53d407de07155ecc16fb8a36d744a0 +a3eb4665f18f71833fec43802730e56b3ee5a357ea30a888ad482725b169d6f1f6ade6e208ee081b2e2633079b82ba7d +ab8beb2c8353fc9f571c18fdd02bdb977fc883313469e1277b0372fbbb33b80dcff354ca41de436d98d2ed710faa467e +aa9071cfa971e4a335a91ad634c98f2be51544cb21f040f2471d01bb97e1df2277ae1646e1ea8f55b7ba9f5c8c599b39 +80b7dbfdcaf40f0678012acc634eba44ea51181475180d9deb2050dc4f2de395289edd0223018c81057ec79b04b04c49 +89623d7f6cb17aa877af14de842c2d4ab7fd576d61ddd7518b5878620a01ded40b6010de0da3cdf31d837eecf30e9847 +a773bb024ae74dd24761f266d4fb27d6fd366a8634febe8235376b1ae9065c2fe12c769f1d0407867dfbe9f5272c352f +8455a561c3aaa6ba64c881a5e13921c592b3a02e968f4fb24a2243c36202795d0366d9cc1a24e916f84d6e158b7aeac7 +81d8bfc4b283cf702a40b87a2b96b275bdbf0def17e67d04842598610b67ea08c804d400c3e69fa09ea001eaf345b276 +b8f8f82cb11fea1c99467013d7e167ff03deb0c65a677fab76ded58826d1ba29aa7cf9fcd7763615735ea3ad38e28719 +89a6a04baf9cccc1db55179e1650b1a195dd91fb0aebc197a25143f0f393524d2589975e3fbfc2547126f0bced7fd6f2 +b81b2162df045390f04df07cbd0962e6b6ca94275a63edded58001a2f28b2ae2af2c7a6cba4ecd753869684e77e7e799 +a3757f722776e50de45c62d9c4a2ee0f5655a512344c4cbec542d8045332806568dd626a719ef21a4eb06792ca70f204 +8c5590df96ec22179a4e8786de41beb44f987a1dcc508eb341eecbc0b39236fdfad47f108f852e87179ccf4e10091e59 +87502f026ed4e10167419130b88c3737635c5b9074c364e1dd247cef5ef0fc064b4ae99b187e33301e438bbd2fe7d032 +af925a2165e980ced620ff12289129fe17670a90ae0f4db9d4b39bd887ccb1f5d2514ac9ecf910f6390a8fc66bd5be17 +857fca899828cf5c65d26e3e8a6e658542782fc72762b3b9c73514919f83259e0f849a9d4838b40dc905fe43024d0d23 +87ffebdbfb69a9e1007ebac4ffcb4090ff13705967b73937063719aa97908986effcb7262fdadc1ae0f95c3690e3245d +a9ff6c347ac6f4c6ab993b748802e96982eaf489dc69032269568412fc9a79e7c2850dfc991b28211b3522ee4454344b +a65b3159df4ec48bebb67cb3663cd744027ad98d970d620e05bf6c48f230fa45bf17527fe726fdf705419bb7a1bb913e +84b97b1e6408b6791831997b03cd91f027e7660fd492a93d95daafe61f02427371c0e237c75706412f442991dfdff989 +ab761c26527439b209af0ae6afccd9340bbed5fbe098734c3145b76c5d2cd7115d9227b2eb523882b7317fbb09180498 +a0479a8da06d7a69c0b0fee60df4e691c19c551f5e7da286dab430bfbcabf31726508e20d26ea48c53365a7f00a3ad34 +a732dfc9baa0f4f40b5756d2e8d8937742999623477458e0bc81431a7b633eefc6f53b3b7939fe0a020018549c954054 +901502436a1169ba51dc479a5abe7c8d84e0943b16bc3c6a627b49b92cd46263c0005bc324c67509edd693f28e612af1 +b627aee83474e7f84d1bab9b7f6b605e33b26297ac6bbf52d110d38ba10749032bd551641e73a383a303882367af429b +95108866745760baef4a46ef56f82da6de7e81c58b10126ebd2ba2cd13d339f91303bf2fb4dd104a6956aa3b13739503 +899ed2ade37236cec90056f3569bc50f984f2247792defafcceb49ad0ca5f6f8a2f06573705300e07f0de0c759289ff5 +a9f5eee196d608efe4bcef9bf71c646d27feb615e21252cf839a44a49fd89da8d26a758419e0085a05b1d59600e2dc42 +b36c6f68fed6e6c85f1f4a162485f24817f2843ec5cbee45a1ebfa367d44892e464949c6669f7972dc7167af08d55d25 +aaaede243a9a1b6162afbc8f571a52671a5a4519b4062e3f26777664e245ba873ed13b0492c5dbf0258c788c397a0e9e +972b4fb39c31cbe127bf9a32a5cc10d621ebdd9411df5e5da3d457f03b2ab2cd1f6372d8284a4a9400f0b06ecdbfd38e +8f6ca1e110e959a4b1d9a5ce5f212893cec21db40d64d5ac4d524f352d72198f923416a850bf845bc5a22a79c0ea2619 +a0f3c93b22134f66f04b2553a53b738644d1665ceb196b8494b315a4c28236fb492017e4a0de4224827c78e42f9908b7 +807fb5ee74f6c8735b0b5ca07e28506214fe4047dbeb00045d7c24f7849e98706aea79771241224939cb749cf1366c7d +915eb1ff034224c0b645442cdb7d669303fdc00ca464f91aaf0b6fde0b220a3a74ff0cb043c26c9f3a5667b3fdaa9420 +8fda6cef56ed33fefffa9e6ac8e6f76b1af379f89761945c63dd448801f7bb8ca970504a7105fac2f74f652ccff32327 +87380cffdcffb1d0820fa36b63cc081e72187f86d487315177d4d04da4533eb19a0e2ff6115ceab528887819c44a5164 +8cd89e03411a18e7f16f968b89fb500c36d47d229f6487b99e62403a980058db5925ce249206743333538adfad168330 +974451b1df33522ce7056de9f03e10c70bf302c44b0741a59df3d6877d53d61a7394dcee1dd46e013d7cb9d73419c092 +98c35ddf645940260c490f384a49496a7352bb8e3f686feed815b1d38f59ded17b1ad6e84a209e773ed08f7b8ff1e4c2 +963f386cf944bb9b2ddebb97171b64253ea0a2894ac40049bdd86cda392292315f3a3d490ca5d9628c890cfb669f0acb +8d507712152babd6d142ee682638da8495a6f3838136088df9424ef50d5ec28d815a198c9a4963610b22e49b4cdf95e9 +83d4bc6b0be87c8a4f1e9c53f257719de0c73d85b490a41f7420e777311640937320557ff2f1d9bafd1daaa54f932356 +82f5381c965b7a0718441131c4d13999f4cdce637698989a17ed97c8ea2e5bdb5d07719c5f7be8688edb081b23ede0f4 +a6ebecab0b72a49dfd01d69fa37a7f74d34fb1d4fef0aa10e3d6fceb9eccd671225c230af89f6eb514250e41a5f91f52 +846d185bdad6e11e604df7f753b7a08a28b643674221f0e750ebdb6b86ec584a29c869e131bca868972a507e61403f6a +85a98332292acb744bd1c0fd6fdcf1f889a78a2c9624d79413ffa194cc8dfa7821a4b60cde8081d4b5f71f51168dd67f +8f7d97c3b4597880d73200d074eb813d95432306e82dafc70b580b8e08cb8098b70f2d07b4b3ac6a4d77e92d57035031 +8185439c8751e595825d7053518cbe121f191846a38d4dbcb558c3f9d7a3104f3153401adaaaf27843bbe2edb504bfe3 +b3c00d8ece1518fca6b1215a139b0a0e26d9cba1b3a424f7ee59f30ce800a5db967279ed60958dd1f3ee69cf4dd1b204 +a2e6cb6978e883f9719c3c0d44cfe8de0cc6f644b98f98858433bea8bbe7b612c8aca5952fccce4f195f9d54f9722dc2 +99663087e3d5000abbec0fbda4e7342ec38846cc6a1505191fb3f1a337cb369455b7f8531a6eb8b0f7b2c4baf83cbe2b +ab0836c6377a4dbc7ca6a4d6cf021d4cd60013877314dd05f351706b128d4af6337711ed3443cb6ca976f40d74070a9a +87abfd5126152fd3bac3c56230579b489436755ea89e0566aa349490b36a5d7b85028e9fb0710907042bcde6a6f5d7e3 +974ba1033f75f60e0cf7c718a57ae1da3721cf9d0fb925714c46f027632bdd84cd9e6de4cf4d00bc55465b1c5ebb7384 +a607b49d73689ac64f25cec71221d30d53e781e1100d19a2114a21da6507a60166166369d860bd314acb226596525670 +a7c2b0b915d7beba94954f2aa7dd08ec075813661e2a3ecca5d28a0733e59583247fed9528eb28aba55b972cdbaf06eb +b8b3123e44128cc8efbe3270f2f94e50ca214a4294c71c3b851f8cbb70cb67fe9536cf07d04bf7fe380e5e3a29dd3c15 +a59a07e343b62ad6445a0859a32b58c21a593f9ddbfe52049650f59628c93715aa1f4e1f45b109321756d0eeec8a5429 +94f51f8a4ed18a6030d0aaa8899056744bd0e9dc9ac68f62b00355cddab11da5da16798db75f0bfbce0e5bdfe750c0b6 +97460a97ca1e1fa5ce243b81425edc0ec19b7448e93f0b55bc9785eedeeafe194a3c8b33a61a5c72990edf375f122777 +8fa859a089bc17d698a7ee381f37ce9beadf4e5b44fce5f6f29762bc04f96faff5d58c48c73631290325f05e9a1ecf49 +abdf38f3b20fc95eff31de5aa9ef1031abfa48f1305ee57e4d507594570401503476d3bcc493838fc24d6967a3082c7f +b8914bfb82815abb86da35c64d39ab838581bc0bf08967192697d9663877825f2b9d6fbdcf9b410463482b3731361aef +a8187f9d22b193a5f578999954d6ec9aa9b32338ccadb8a3e1ce5bad5ea361d69016e1cdfac44e9d6c54e49dd88561b9 +aac262cb7cba7fd62c14daa7b39677cabc1ef0947dd06dd89cac8570006a200f90d5f0353e84f5ff03179e3bebe14231 +a630ef5ece9733b8c46c0a2df14a0f37647a85e69c63148e79ffdcc145707053f9f9d305c3f1cf3c7915cb46d33abd07 +b102c237cb2e254588b6d53350dfda6901bd99493a3fbddb4121d45e0b475cf2663a40d7b9a75325eda83e4ba1e68cb3 +86a930dd1ddcc16d1dfa00aa292cb6c2607d42c367e470aa920964b7c17ab6232a7108d1c2c11fc40fb7496547d0bbf8 +a832fdc4500683e72a96cce61e62ac9ee812c37fe03527ad4cf893915ca1962cee80e72d4f82b20c8fc0b764376635a1 +88ad985f448dabb04f8808efd90f273f11f5e6d0468b5489a1a6a3d77de342992a73eb842d419034968d733f101ff683 +98a8538145f0d86f7fbf9a81c9140f6095c5bdd8960b1c6f3a1716428cd9cca1bf8322e6d0af24e6169abcf7df2b0ff6 +9048c6eba5e062519011e177e955a200b2c00b3a0b8615bdecdebc217559d41058d3315f6d05617be531ef0f6aef0e51 +833bf225ab6fc68cdcacf1ec1b50f9d05f5410e6cdcd8d56a3081dc2be8a8d07b81534d1ec93a25c2e270313dfb99e3b +a84bcd24c3da5e537e64a811b93c91bfc84d7729b9ead7f79078989a6eb76717d620c1fad17466a0519208651e92f5ff +b7cdd0a3fbd79aed93e1b5a44ca44a94e7af5ed911e4492f332e3a5ed146c7286bde01b52276a2fcc02780d2109874dd +8a19a09854e627cb95750d83c20c67442b66b35896a476358f993ba9ac114d32c59c1b3d0b8787ee3224cf3888b56c64 +a9abd5afb8659ee52ada8fa5d57e7dd355f0a7350276f6160bec5fbf70d5f99234dd179eb221c913e22a49ec6d267846 +8c13c4274c0d30d184e73eaf812200094bbbd57293780bdadbceb262e34dee5b453991e7f37c7333a654fc71c69d6445 +a4320d73296ff8176ce0127ca1921c450e2a9c06eff936681ebaffb5a0b05b17fded24e548454de89aca2dcf6d7a9de4 +b2b8b3e15c1f645f07783e5628aba614e60157889db41d8161d977606788842b67f83f361eae91815dc0abd84e09abd5 +ad26c3aa35ddfddc15719b8bb6c264aaec7065e88ac29ba820eb61f220fef451609a7bb037f3722d022e6c86e4f1dc88 +b8615bf43e13ae5d7b8dd903ce37190800cd490f441c09b22aa29d7a29ed2c0417b7a08ead417868f1de2589deaadd80 +8d3425e1482cd1e76750a76239d33c06b3554c3c3c87c15cb7ab58b1cee86a4c5c4178b44e23f36928365a1b484bde02 +806893a62e38c941a7dd6f249c83af16596f69877cc737d8f73f6b8cd93cbc01177a7a276b2b8c6b0e5f2ad864db5994 +86618f17fa4b0d65496b661bbb5ba3bc3a87129d30a4b7d4f515b904f4206ca5253a41f49fd52095861e5e065ec54f21 +9551915da1304051e55717f4c31db761dcdcf3a1366c89a4af800a9e99aca93a357bf928307f098e62b44a02cb689a46 +8f79c4ec0ec1146cb2a523b52fe33def90d7b5652a0cb9c2d1c8808a32293e00aec6969f5b1538e3a94cd1efa3937f86 +a0c03e329a707300081780f1e310671315b4c6a4cedcb29697aedfabb07a9d5df83f27b20e9c44cf6b16e39d9ded5b98 +86a7cfa7c8e7ce2c01dd0baec2139e97e8e090ad4e7b5f51518f83d564765003c65968f85481bbb97cb18f005ccc7d9f +a33811770c6dfda3f7f74e6ad0107a187fe622d61b444bbd84fd7ef6e03302e693b093df76f6ab39bb4e02afd84a575a +85480f5c10d4162a8e6702b5e04f801874d572a62a130be94b0c02b58c3c59bdcd48cd05f0a1c2839f88f06b6e3cd337 +8e181011564b17f7d787fe0e7f3c87f6b62da9083c54c74fd6c357a1f464c123c1d3d8ade3cf72475000b464b14e2be3 +8ee178937294b8c991337e0621ab37e9ffa4ca2bdb3284065c5e9c08aad6785d50cf156270ff9daf9a9127289710f55b +8bd1e8e2d37379d4b172f1aec96f2e41a6e1393158d7a3dbd9a95c8dd4f8e0b05336a42efc11a732e5f22b47fc5c271d +8f3da353cd487c13136a85677de8cedf306faae0edec733cf4f0046f82fa4639db4745b0095ff33a9766aba50de0cbcf +8d187c1e97638df0e4792b78e8c23967dac43d98ea268ca4aabea4e0fa06cb93183fd92d4c9df74118d7cc27bf54415e +a4c992f08c2f8bac0b74b3702fb0c75c9838d2ce90b28812019553d47613c14d8ce514d15443159d700b218c5a312c49 +a6fd1874034a34c3ea962a316c018d9493d2b3719bb0ec4edbc7c56b240802b2228ab49bee6f04c8a3e9f6f24a48c1c2 +b2efed8e799f8a15999020900dc2c58ece5a3641c90811b86a5198e593d7318b9d53b167818ccdfbe7df2414c9c34011 +995ff7de6181ddf95e3ead746089c6148da3508e4e7a2323c81785718b754d356789b902e7e78e2edc6b0cbd4ff22c78 +944073d24750a9068cbd020b834afc72d2dde87efac04482b3287b40678ad07588519a4176b10f2172a2c463d063a5cd +99db4b1bb76475a6fd75289986ef40367960279524378cc917525fb6ba02a145a218c1e9caeb99332332ab486a125ac0 +89fce4ecd420f8e477af4353b16faabb39e063f3f3c98fde2858b1f2d1ef6eed46f0975a7c08f233b97899bf60ccd60a +8c09a4f07a02b80654798bc63aada39fd638d3e3c4236ccd8a5ca280350c31e4a89e5f4c9aafb34116e71da18c1226b8 +85325cfa7ded346cc51a2894257eab56e7488dbff504f10f99f4cd2b630d913003761a50f175ed167e8073f1b6b63fb0 +b678b4fbec09a8cc794dcbca185f133578f29e354e99c05f6d07ac323be20aecb11f781d12898168e86f2e0f09aca15e +a249cfcbca4d9ba0a13b5f6aac72bf9b899adf582f9746bb2ad043742b28915607467eb794fca3704278f9136f7642be +9438e036c836a990c5e17af3d78367a75b23c37f807228362b4d13e3ddcb9e431348a7b552d09d11a2e9680704a4514f +925ab70450af28c21a488bfb5d38ac994f784cf249d7fd9ad251bb7fd897a23e23d2528308c03415074d43330dc37ef4 +a290563904d5a8c0058fc8330120365bdd2ba1fdbaef7a14bc65d4961bb4217acfaed11ab82669e359531f8bf589b8db +a7e07a7801b871fc9b981a71e195a3b4ba6b6313bc132b04796a125157e78fe5c11a3a46cf731a255ac2d78a4ae78cd0 +b26cd2501ee72718b0eebab6fb24d955a71f363f36e0f6dff0ab1d2d7836dab88474c0cef43a2cc32701fca7e82f7df3 +a1dc3b6c968f3de00f11275092290afab65b2200afbcfa8ddc70e751fa19dbbc300445d6d479a81bda3880729007e496 +a9bc213e28b630889476a095947d323b9ac6461dea726f2dc9084473ae8e196d66fb792a21905ad4ec52a6d757863e7d +b25d178df8c2df8051e7c888e9fa677fde5922e602a95e966db9e4a3d6b23ce043d7dc48a5b375c6b7c78e966893e8c3 +a1c8d88d72303692eaa7adf68ea41de4febec40cc14ae551bb4012afd786d7b6444a3196b5d9d5040655a3366d96b7cd +b22bd44f9235a47118a9bbe2ba5a2ba9ec62476061be2e8e57806c1a17a02f9a51403e849e2e589520b759abd0117683 +b8add766050c0d69fe81d8d9ea73e1ed05f0135d093ff01debd7247e42dbb86ad950aceb3b50b9af6cdc14ab443b238f +af2cf95f30ef478f018cf81d70d47d742120b09193d8bb77f0d41a5d2e1a80bfb467793d9e2471b4e0ad0cb2c3b42271 +8af5ef2107ad284e246bb56e20fef2a255954f72de791cbdfd3be09f825298d8466064f3c98a50496c7277af32b5c0bc +85dc19558572844c2849e729395a0c125096476388bd1b14fa7f54a7c38008fc93e578da3aac6a52ff1504d6ca82db05 +ae8c9b43c49572e2e166d704caf5b4b621a3b47827bb2a3bcd71cdc599bba90396fd9a405261b13e831bb5d44c0827d7 +a7ba7efede25f02e88f6f4cbf70643e76784a03d97e0fbd5d9437c2485283ad7ca3abb638a5f826cd9f6193e5dec0b6c +94a9d122f2f06ef709fd8016fd4b712d88052245a65a301f5f177ce22992f74ad05552b1f1af4e70d1eac62cef309752 +82d999b3e7cf563833b8bc028ff63a6b26eb357dfdb3fd5f10e33a1f80a9b2cfa7814d871b32a7ebfbaa09e753e37c02 +aec6edcde234df502a3268dd2c26f4a36a2e0db730afa83173f9c78fcb2b2f75510a02b80194327b792811caefda2725 +94c0bfa66c9f91d462e9194144fdd12d96f9bbe745737e73bab8130607ee6ea9d740e2cfcbbd00a195746edb6369ee61 +ab7573dab8c9d46d339e3f491cb2826cabe8b49f85f1ede78d845fc3995537d1b4ab85140b7d0238d9c24daf0e5e2a7e +87e8b16832843251fe952dadfd01d41890ed4bb4b8fa0254550d92c8cced44368225eca83a6c3ad47a7f81ff8a80c984 +9189d2d9a7c64791b19c0773ad4f0564ce6bea94aa275a917f78ad987f150fdb3e5e26e7fef9982ac184897ecc04683f +b3661bf19e2da41415396ae4dd051a9272e8a2580b06f1a1118f57b901fa237616a9f8075af1129af4eabfefedbe2f1c +af43c86661fb15daf5d910a4e06837225e100fb5680bd3e4b10f79a2144c6ec48b1f8d6e6b98e067d36609a5d038889a +82ac0c7acaa83ddc86c5b4249aae12f28155989c7c6b91e5137a4ce05113c6cbc16f6c44948b0efd8665362d3162f16a +8f268d1195ab465beeeb112cd7ffd5d5548559a8bc01261106d3555533fc1971081b25558d884d552df0db1cddda89d8 +8ef7caa5521f3e037586ce8ac872a4182ee20c7921c0065ed9986c047e3dda08294da1165f385d008b40d500f07d895f +8c2f98f6880550573fad46075d3eba26634b5b025ce25a0b4d6e0193352c8a1f0661064027a70fe8190b522405f9f4e3 +b7653f353564feb164f0f89ec7949da475b8dad4a4d396d252fc2a884f6932d027b7eb2dc4d280702c74569319ed701a +a026904f4066333befd9b87a8fad791d014096af60cdd668ef919c24dbe295ff31f7a790e1e721ba40cf5105abca67f4 +988f982004ada07a22dd345f2412a228d7a96b9cae2c487de42e392afe1e35c2655f829ce07a14629148ce7079a1f142 +9616add009067ed135295fb74d5b223b006b312bf14663e547a0d306694ff3a8a7bb9cfc466986707192a26c0bce599f +ad4c425de9855f6968a17ee9ae5b15e0a5b596411388cf976df62ecc6c847a6e2ddb2cea792a5f6e9113c2445dba3e5c +b698ac9d86afa3dc69ff8375061f88e3b0cff92ff6dfe747cebaf142e813c011851e7a2830c10993b715e7fd594604a9 +a386fa189847bb3b798efca917461e38ead61a08b101948def0f82cd258b945ed4d45b53774b400af500670149e601b7 +905c95abda2c68a6559d8a39b6db081c68cef1e1b4be63498004e1b2f408409be9350b5b5d86a30fd443e2b3e445640a +9116dade969e7ce8954afcdd43e5cab64dc15f6c1b8da9d2d69de3f02ba79e6c4f6c7f54d6bf586d30256ae405cd1e41 +a3084d173eacd08c9b5084a196719b57e47a0179826fda73466758235d7ecdb87cbcf097bd6b510517d163a85a7c7edd +85bb00415ad3c9be99ff9ba83672cc59fdd24356b661ab93713a3c8eab34e125d8867f628a3c3891b8dc056e69cd0e83 +8d58541f9f39ed2ee4478acce5d58d124031338ec11b0d55551f00a5a9a6351faa903a5d7c132dc5e4bb026e9cbd18e4 +a622adf72dc250e54f672e14e128c700166168dbe0474cecb340da175346e89917c400677b1bc1c11fcc4cc26591d9db +b3f865014754b688ca8372e8448114fff87bf3ca99856ab9168894d0c4679782c1ced703f5b74e851b370630f5e6ee86 +a7e490b2c40c2446fcd91861c020da9742c326a81180e38110558bb5d9f2341f1c1885e79b364e6419023d1cbdc47380 +b3748d472b1062e54572badbb8e87ac36534407f74932e7fc5b8392d008e8e89758f1671d1e4d30ab0fa40551b13bb5e +89898a5c5ec4313aabc607b0049fd1ebad0e0c074920cf503c9275b564d91916c2c446d3096491c950b7af3ac5e4b0ed +8eb8c83fef2c9dd30ea44e286e9599ec5c20aba983f702e5438afe2e5b921884327ad8d1566c72395587efac79ca7d56 +b92479599e806516ce21fb0bd422a1d1d925335ebe2b4a0a7e044dd275f30985a72b97292477053ac5f00e081430da80 +a34ae450a324fe8a3c25a4d653a654f9580ed56bbea213b8096987bbad0f5701d809a17076435e18017fea4d69f414bc +81381afe6433d62faf62ea488f39675e0091835892ecc238e02acf1662669c6d3962a71a3db652f6fe3bc5f42a0e5dc5 +a430d475bf8580c59111103316fe1aa79c523ea12f1d47a976bbfae76894717c20220e31cf259f08e84a693da6688d70 +b842814c359754ece614deb7d184d679d05d16f18a14b288a401cef5dad2cf0d5ee90bad487b80923fc5573779d4e4e8 +971d9a2627ff2a6d0dcf2af3d895dfbafca28b1c09610c466e4e2bff2746f8369de7f40d65b70aed135fe1d72564aa88 +8f4ce1c59e22b1ce7a0664caaa7e53735b154cfba8d2c5cc4159f2385843de82ab58ed901be876c6f7fce69cb4130950 +86cc9dc321b6264297987000d344fa297ef45bcc2a4df04e458fe2d907ad304c0ea2318e32c3179af639a9a56f3263cf +8229e0876dfe8f665c3fb19b250bd89d40f039bbf1b331468b403655be7be2e104c2fd07b9983580c742d5462ca39a43 +99299d73066e8eb128f698e56a9f8506dfe4bd014931e86b6b487d6195d2198c6c5bf15cccb40ccf1f8ddb57e9da44a2 +a3a3be37ac554c574b393b2f33d0a32a116c1a7cfeaf88c54299a4da2267149a5ecca71f94e6c0ef6e2f472b802f5189 +a91700d1a00387502cdba98c90f75fbc4066fefe7cc221c8f0e660994c936badd7d2695893fde2260c8c11d5bdcdd951 +8e03cae725b7f9562c5c5ab6361644b976a68bada3d7ca508abca8dfc80a469975689af1fba1abcf21bc2a190dab397d +b01461ad23b2a8fa8a6d241e1675855d23bc977dbf4714add8c4b4b7469ccf2375cec20e80cedfe49361d1a30414ac5b +a2673bf9bc621e3892c3d7dd4f1a9497f369add8cbaa3472409f4f86bd21ac67cfac357604828adfee6ada1835365029 +a042dff4bf0dfc33c178ba1b335e798e6308915128de91b12e5dbbab7c4ac8d60a01f6aea028c3a6d87b9b01e4e74c01 +86339e8a75293e4b3ae66b5630d375736b6e6b6b05c5cda5e73fbf7b2f2bd34c18a1d6cefede08625ce3046e77905cb8 +af2ebe1b7d073d03e3d98bc61af83bf26f7a8c130fd607aa92b75db22d14d016481b8aa231e2c9757695f55b7224a27f +a00ee882c9685e978041fd74a2c465f06e2a42ffd3db659053519925be5b454d6f401e3c12c746e49d910e4c5c9c5e8c +978a781c0e4e264e0dad57e438f1097d447d891a1e2aa0d5928f79a9d5c3faae6f258bc94fdc530b7b2fa6a9932bb193 +aa4b7ce2e0c2c9e9655bf21e3e5651c8503bce27483017b0bf476be743ba06db10228b3a4c721219c0779747f11ca282 +b003d1c459dacbcf1a715551311e45d7dbca83a185a65748ac74d1800bbeaba37765d9f5a1a221805c571910b34ebca8 +95b6e531b38648049f0d19de09b881baa1f7ea3b2130816b006ad5703901a05da57467d1a3d9d2e7c73fb3f2e409363c +a6cf9c06593432d8eba23a4f131bb7f72b9bd51ab6b4b772a749fe03ed72b5ced835a349c6d9920dba2a39669cb7c684 +aa3d59f6e2e96fbb66195bc58c8704e139fa76cd15e4d61035470bd6e305db9f98bcbf61ac1b95e95b69ba330454c1b3 +b57f97959c208361de6d7e86dff2b873068adb0f158066e646f42ae90e650079798f165b5cd713141cd3a2a90a961d9a +a76ee8ed9052f6a7a8c69774bb2597be182942f08115baba03bf8faaeaee526feba86120039fe8ca7b9354c3b6e0a8e6 +95689d78c867724823f564627d22d25010f278674c6d2d0cdb10329169a47580818995d1d727ce46c38a1e47943ebb89 +ab676d2256c6288a88e044b3d9ffd43eb9d5aaee00e8fc60ac921395fb835044c71a26ca948e557fed770f52d711e057 +96351c72785c32e5d004b6f4a1259fb8153d631f0c93fed172f18e8ba438fbc5585c1618deeabd0d6d0b82173c2e6170 +93dd8d3db576418e22536eba45ab7f56967c6c97c64260d6cddf38fb19c88f2ec5cd0e0156f50e70855eee8a2b879ffd +ad6ff16f40f6de3d7a737f8e6cebd8416920c4ff89dbdcd75eabab414af9a6087f83ceb9aff7680aa86bff98bd09c8cc +84de53b11671abc9c38710e19540c5c403817562aeb22a88404cdaff792c1180f717dbdfe8f54940c062c4d032897429 +872231b9efa1cdd447b312099a5c164c560440a9441d904e70f5abfc3b2a0d16be9a01aca5e0a2599a61e19407587e3d +88f44ac27094a2aa14e9dc40b099ee6d68f97385950f303969d889ee93d4635e34dff9239103bdf66a4b7cbba3e7eb7a +a59afebadf0260e832f6f44468443562f53fbaf7bcb5e46e1462d3f328ac437ce56edbca617659ac9883f9e13261fad7 +b1990e42743a88de4deeacfd55fafeab3bc380cb95de43ed623d021a4f2353530bcab9594389c1844b1c5ea6634c4555 +85051e841149a10e83f56764e042182208591396d0ce78c762c4a413e6836906df67f38c69793e158d64fef111407ba3 +9778172bbd9b1f2ec6bbdd61829d7b39a7df494a818e31c654bf7f6a30139899c4822c1bf418dd4f923243067759ce63 +9355005b4878c87804fc966e7d24f3e4b02bed35b4a77369d01f25a3dcbff7621b08306b1ac85b76fe7b4a3eb5f839b1 +8f9dc6a54fac052e236f8f0e1f571ac4b5308a43acbe4cc8183bce26262ddaf7994e41cf3034a4cbeca2c505a151e3b1 +8cc59c17307111723fe313046a09e0e32ea0cce62c13814ab7c6408c142d6a0311d801be4af53fc9240523f12045f9ef +8e6057975ed40a1932e47dd3ac778f72ee2a868d8540271301b1aa6858de1a5450f596466494a3e0488be4fbeb41c840 +812145efbd6559ae13325d56a15940ca4253b17e72a9728986b563bb5acc13ec86453796506ac1a8f12bd6f9e4a288c3 +911da0a6d6489eb3dab2ec4a16e36127e8a291ae68a6c2c9de33e97f3a9b1f00da57a94e270a0de79ecc5ecb45d19e83 +b72ea85973f4b2a7e6e71962b0502024e979a73c18a9111130e158541fa47bbaaf53940c8f846913a517dc69982ba9e1 +a7a56ad1dbdc55f177a7ad1d0af78447dc2673291e34e8ab74b26e2e2e7d8c5fe5dc89e7ef60f04a9508847b5b3a8188 +b52503f6e5411db5d1e70f5fb72ccd6463fa0f197b3e51ca79c7b5a8ab2e894f0030476ada72534fa4eb4e06c3880f90 +b51c7957a3d18c4e38f6358f2237b3904618d58b1de5dec53387d25a63772e675a5b714ad35a38185409931157d4b529 +b86b4266e719d29c043d7ec091547aa6f65bbf2d8d831d1515957c5c06513b72aa82113e9645ad38a7bc3f5383504fa6 +b95b547357e6601667b0f5f61f261800a44c2879cf94e879def6a105b1ad2bbf1795c3b98a90d588388e81789bd02681 +a58fd4c5ae4673fa350da6777e13313d5d37ed1dafeeb8f4f171549765b84c895875d9d3ae6a9741f3d51006ef81d962 +9398dc348d078a604aadc154e6eef2c0be1a93bb93ba7fe8976edc2840a3a318941338cc4d5f743310e539d9b46613d2 +902c9f0095014c4a2f0dccaaab543debba6f4cc82c345a10aaf4e72511725dbed7a34cd393a5f4e48a3e5142b7be84ed +a7c0447849bb44d04a0393a680f6cd390093484a79a147dd238f5d878030d1c26646d88211108e59fe08b58ad20c6fbd +80db045535d6e67a422519f5c89699e37098449d249698a7cc173a26ccd06f60238ae6cc7242eb780a340705c906790c +8e52b451a299f30124505de2e74d5341e1b5597bdd13301cc39b05536c96e4380e7f1b5c7ef076f5b3005a868657f17c +824499e89701036037571761e977654d2760b8ce21f184f2879fda55d3cda1e7a95306b8abacf1caa79d3cc075b9d27f +9049b956b77f8453d2070607610b79db795588c0cec12943a0f5fe76f358dea81e4f57a4692112afda0e2c05c142b26f +81911647d818a4b5f4990bfd4bc13bf7be7b0059afcf1b6839333e8569cdb0172fd2945410d88879349f677abaed5eb3 +ad4048f19b8194ed45b6317d9492b71a89a66928353072659f5ce6c816d8f21e69b9d1817d793effe49ca1874daa1096 +8d22f7b2ddb31458661abd34b65819a374a1f68c01fc6c9887edeba8b80c65bceadb8f57a3eb686374004b836261ef67 +92637280c259bc6842884db3d6e32602a62252811ae9b019b3c1df664e8809ffe86db88cfdeb8af9f46435c9ee790267 +a2f416379e52e3f5edc21641ea73dc76c99f7e29ea75b487e18bd233856f4c0183429f378d2bfc6cd736d29d6cadfa49 +882cb6b76dbdc188615dcf1a8439eba05ffca637dd25197508156e03c930b17b9fed2938506fdd7b77567cb488f96222 +b68b621bb198a763fb0634eddb93ed4b5156e59b96c88ca2246fd1aea3e6b77ed651e112ac41b30cd361fadc011d385e +a3cb22f6b675a29b2d1f827cacd30df14d463c93c3502ef965166f20d046af7f9ab7b2586a9c64f4eae4fad2d808a164 +8302d9ce4403f48ca217079762ce42cee8bc30168686bb8d3a945fbd5acd53b39f028dce757b825eb63af2d5ae41169d +b2eef1fbd1a176f1f4cd10f2988c7329abe4eb16c7405099fb92baa724ab397bc98734ef7d4b24c0f53dd90f57520d04 +a1bbef0bd684a3f0364a66bde9b29326bac7aa3dde4caed67f14fb84fed3de45c55e406702f1495a3e2864d4ee975030 +976acdb0efb73e3a3b65633197692dedc2adaed674291ae3df76b827fc866d214e9cac9ca46baefc4405ff13f953d936 +b9fbf71cc7b6690f601f0b1c74a19b7d14254183a2daaafec7dc3830cba5ae173d854bbfebeca985d1d908abe5ef0cda +90591d7b483598c94e38969c4dbb92710a1a894bcf147807f1bcbd8aa3ac210b9f2be65519aa829f8e1ccdc83ad9b8cf +a30568577c91866b9c40f0719d46b7b3b2e0b4a95e56196ac80898a2d89cc67880e1229933f2cd28ee3286f8d03414d7 +97589a88c3850556b359ec5e891f0937f922a751ac7c95949d3bbc7058c172c387611c0f4cb06351ef02e5178b3dd9e4 +98e7bbe27a1711f4545df742f17e3233fbcc63659d7419e1ca633f104cb02a32c84f2fac23ca2b84145c2672f68077ab +a7ddb91636e4506d8b7e92aa9f4720491bb71a72dadc47c7f4410e15f93e43d07d2b371951a0e6a18d1bd087aa96a5c4 +a7c006692227a06db40bceac3d5b1daae60b5692dd9b54772bedb5fea0bcc91cbcdb530cac31900ffc70c5b3ffadc969 +8d3ec6032778420dfa8be52066ba0e623467df33e4e1901dbadd586c5d750f4ccde499b5197e26b9ea43931214060f69 +8d9a8410518ea64f89df319bfd1fc97a0971cdb9ad9b11d1f8fe834042ea7f8dce4db56eeaf179ff8dda93b6db93e5ce +a3c533e9b3aa04df20b9ff635cb1154ce303e045278fcf3f10f609064a5445552a1f93989c52ce852fd0bbd6e2b6c22e +81934f3a7f8c1ae60ec6e4f212986bcc316118c760a74155d06ce0a8c00a9b9669ec4e143ca214e1b995e41271774fd9 +ab8e2d01a71192093ef8fafa7485e795567cc9db95a93fb7cc4cf63a391ef89af5e2bfad4b827fffe02b89271300407f +83064a1eaa937a84e392226f1a60b7cfad4efaa802f66de5df7498962f7b2649924f63cd9962d47906380b97b9fe80e1 +b4f5e64a15c6672e4b55417ee5dc292dcf93d7ea99965a888b1cc4f5474a11e5b6520eacbcf066840b343f4ceeb6bf33 +a63d278b842456ef15c278b37a6ea0f27c7b3ffffefca77c7a66d2ea06c33c4631eb242bbb064d730e70a8262a7b848a +83a41a83dbcdf0d22dc049de082296204e848c453c5ab1ba75aa4067984e053acf6f8b6909a2e1f0009ed051a828a73b +819485b036b7958508f15f3c19436da069cbe635b0318ebe8c014cf1ef9ab2df038c81161b7027475bcfa6fff8dd9faf +aa40e38172806e1e045e167f3d1677ef12d5dcdc89b43639a170f68054bd196c4fae34c675c1644d198907a03f76ba57 +969bae484883a9ed1fbed53b26b3d4ee4b0e39a6c93ece5b3a49daa01444a1c25727dabe62518546f36b047b311b177c +80a9e73a65da99664988b238096a090d313a0ee8e4235bc102fa79bb337b51bb08c4507814eb5baec22103ec512eaab0 +86604379aec5bddda6cbe3ef99c0ac3a3c285b0b1a15b50451c7242cd42ae6b6c8acb717dcca7917838432df93a28502 +a23407ee02a495bed06aa7e15f94cfb05c83e6d6fba64456a9bbabfa76b2b68c5c47de00ba169e710681f6a29bb41a22 +98cff5ecc73b366c6a01b34ac9066cb34f7eeaf4f38a5429bad2d07e84a237047e2a065c7e8a0a6581017dadb4695deb +8de9f68a938f441f3b7ab84bb1f473c5f9e5c9e139e42b7ccee1d254bd57d0e99c2ccda0f3198f1fc5737f6023dd204e +b0ce48d815c2768fb472a315cad86aa033d0e9ca506f146656e2941829e0acb735590b4fbc713c2d18d3676db0a954ac +82f485cdefd5642a6af58ac6817991c49fac9c10ace60f90b27f1788cc026c2fe8afc83cf499b3444118f9f0103598a8 +82c24550ed512a0d53fc56f64cc36b553823ae8766d75d772dacf038c460f16f108f87a39ceef7c66389790f799dbab3 +859ffcf1fe9166388316149b9acc35694c0ea534d43f09dae9b86f4aa00a23b27144dda6a352e74b9516e8c8d6fc809c +b8f7f353eec45da77fb27742405e5ad08d95ec0f5b6842025be9def3d9892f85eb5dd0921b41e6eff373618dba215bca +8ccca4436f9017e426229290f5cd05eac3f16571a4713141a7461acfe8ae99cd5a95bf5b6df129148693c533966145da +a2c67ecc19c0178b2994846fea4c34c327a5d786ac4b09d1d13549d5be5996d8a89021d63d65cb814923388f47cc3a03 +aa0ff87d676b418ec08f5cbf577ac7e744d1d0e9ebd14615b550eb86931eafd2a36d4732cc5d6fab1713fd7ab2f6f7c0 +8aef4730bb65e44efd6bb9441c0ae897363a2f3054867590a2c2ecf4f0224e578c7a67f10b40f8453d9f492ac15a9b2d +86a187e13d8fba5addcfdd5b0410cedd352016c930f913addd769ee09faa6be5ca3e4b1bdb417a965c643a99bd92be42 +a0a4e9632a7a094b14b29b78cd9c894218cdf6783e61671e0203865dc2a835350f465fbaf86168f28af7c478ca17bc89 +a8c7b02d8deff2cd657d8447689a9c5e2cd74ef57c1314ac4d69084ac24a7471954d9ff43fe0907d875dcb65fd0d3ce5 +97ded38760aa7be6b6960b5b50e83b618fe413cbf2bcc1da64c05140bcc32f5e0e709cd05bf8007949953fac5716bad9 +b0d293835a24d64c2ae48ce26e550b71a8c94a0883103757fb6b07e30747f1a871707d23389ba2b2065fa6bafe220095 +8f9e291bf849feaa575592e28e3c8d4b7283f733d41827262367ea1c40f298c7bcc16505255a906b62bf15d9f1ba85fb +998f4e2d12708b4fd85a61597ca2eddd750f73c9e0c9b3cf0825d8f8e01f1628fd19797dcaed3b16dc50331fc6b8b821 +b30d1f8c115d0e63bf48f595dd10908416774c78b3bbb3194192995154d80ea042d2e94d858de5f8aa0261b093c401fd +b5d9c75bb41f964cbff3f00e96d9f1480c91df8913f139f0d385d27a19f57a820f838eb728e46823cbff00e21c660996 +a6edec90b5d25350e2f5f0518777634f9e661ec9d30674cf5b156c4801746d62517751d90074830ac0f4b09911c262f1 +82f98da1264b6b75b8fbeb6a4d96d6a05b25c24db0d57ba3a38efe3a82d0d4e331b9fc4237d6494ccfe4727206457519 +b89511843453cf4ecd24669572d6371b1e529c8e284300c43e0d5bb6b3aaf35aeb634b3cb5c0a2868f0d5e959c1d0772 +a82bf065676583e5c1d3b81987aaae5542f522ba39538263a944bb33ea5b514c649344a96c0205a3b197a3f930fcda6c +a37b47ea527b7e06c460776aa662d9a49ff4149d3993f1a974b0dd165f7171770d189b0e2ea54fd5fccb6a14b116e68a +a1017677f97dda818274d47556d09d0e4ccacb23a252f82a6cfe78c630ad46fb9806307445a59fb61262182de3a2b29c +b01e9fcac239ba270e6877b79273ddd768bf8a51d2ed8a051b1c11e18eff3de5920e2fcbfbd26f06d381eddd3b1f1e1b +82fcd53d803b1c8e4ed76adc339b7f3a5962d37042b9683aabac7513ac68775d4a566a9460183926a6a95dbe7d551a1f +a763e78995d55cd21cdb7ef75d9642d6e1c72453945e346ab6690c20a4e1eeec61bb848ef830ae4b56182535e3c71d8f +b769f4db602251d4b0a1186782799bdcef66de33c110999a5775c50b349666ffd83d4c89714c4e376f2efe021a5cfdb2 +a59cbd1b785efcfa6e83fc3b1d8cf638820bc0c119726b5368f3fba9dce8e3414204fb1f1a88f6c1ff52e87961252f97 +95c8c458fd01aa23ecf120481a9c6332ebec2e8bb70a308d0576926a858457021c277958cf79017ddd86a56cacc2d7db +82eb41390800287ae56e77f2e87709de5b871c8bdb67c10a80fc65f3acb9f7c29e8fa43047436e8933f27449ea61d94d +b3ec25e3545eb83aed2a1f3558d1a31c7edde4be145ecc13b33802654b77dc049b4f0065069dd9047b051e52ab11dcdd +b78a0c715738f56f0dc459ab99e252e3b579b208142836b3c416b704ca1de640ca082f29ebbcee648c8c127df06f6b1e +a4083149432eaaf9520188ebf4607d09cf664acd1f471d4fb654476e77a9eaae2251424ffda78d09b6cb880df35c1219 +8c52857d68d6e9672df3db2df2dbf46b516a21a0e8a18eec09a6ae13c1ef8f369d03233320dd1c2c0bbe00abfc1ea18b +8c856089488803066bff3f8d8e09afb9baf20cecc33c8823c1c0836c3d45498c3de37e87c016b705207f60d2b00f8609 +831a3df39be959047b2aead06b4dcd3012d7b29417f642b83c9e8ce8de24a3dbbd29c6fdf55e2db3f7ea04636c94e403 +aed84d009f66544addabe404bf6d65af7779ce140dc561ff0c86a4078557b96b2053b7b8a43432ffb18cd814f143b9da +93282e4d72b0aa85212a77b336007d8ba071eea17492da19860f1ad16c1ea8867ccc27ef5c37c74b052465cc11ea4f52 +a7b78b8c8d057194e8d68767f1488363f77c77bddd56c3da2bc70b6354c7aa76247c86d51f7371aa38a4aa7f7e3c0bb7 +b1c77283d01dcd1bde649b5b044eac26befc98ff57cbee379fb5b8e420134a88f2fc7f0bf04d15e1fbd45d29e7590fe6 +a4aa8de70330a73b2c6458f20a1067eed4b3474829b36970a8df125d53bbdda4f4a2c60063b7cccb0c80fc155527652f +948a6c79ba1b8ad7e0bed2fae2f0481c4e41b4d9bbdd9b58164e28e9065700e83f210c8d5351d0212e0b0b68b345b3a5 +86a48c31dcbbf7b082c92d28e1f613a2378a910677d7db3a349dc089e4a1e24b12eee8e8206777a3a8c64748840b7387 +976adb1af21e0fc34148917cf43d933d7bfd3fd12ed6c37039dcd5a4520e3c6cf5868539ba5bf082326430deb8a4458d +b93e1a4476f2c51864bb4037e7145f0635eb2827ab91732b98d49b6c07f6ac443111aa1f1da76d1888665cb897c3834e +8afd46fb23bf869999fa19784b18a432a1f252d09506b8dbb756af900518d3f5f244989b3d7c823d9029218c655d3dc6 +83f1e59e3abeed18cdc632921672673f1cb6e330326e11c4e600e13e0d5bc11bdc970ae12952e15103a706fe720bf4d6 +90ce4cc660714b0b673d48010641c09c00fc92a2c596208f65c46073d7f349dd8e6e077ba7dcef9403084971c3295b76 +8b09b0f431a7c796561ecf1549b85048564de428dac0474522e9558b6065fede231886bc108539c104ce88ebd9b5d1b0 +85d6e742e2fb16a7b0ba0df64bc2c0dbff9549be691f46a6669bca05e89c884af16822b85faefefb604ec48c8705a309 +a87989ee231e468a712c66513746fcf03c14f103aadca0eac28e9732487deb56d7532e407953ab87a4bf8961588ef7b0 +b00da10efe1c29ee03c9d37d5918e391ae30e48304e294696b81b434f65cf8c8b95b9d1758c64c25e534d045ba28696f +91c0e1fb49afe46c7056400baa06dbb5f6e479db78ee37e2d76c1f4e88994357e257b83b78624c4ef6091a6c0eb8254d +883fb797c498297ccbf9411a3e727c3614af4eccde41619b773dc7f3259950835ee79453debf178e11dec4d3ada687a0 +a14703347e44eb5059070b2759297fcfcfc60e6893c0373eea069388eba3950aa06f1c57cd2c30984a2d6f9e9c92c79e +afebc7585b304ceba9a769634adff35940e89cd32682c78002822aab25eec3edc29342b7f5a42a56a1fec67821172ad5 +aea3ff3822d09dba1425084ca95fd359718d856f6c133c5fabe2b2eed8303b6e0ba0d8698b48b93136a673baac174fd9 +af2456a09aa777d9e67aa6c7c49a1845ea5cdda2e39f4c935c34a5f8280d69d4eec570446998cbbe31ede69a91e90b06 +82cada19fed16b891ef3442bafd49e1f07c00c2f57b2492dd4ee36af2bd6fd877d6cb41188a4d6ce9ec8d48e8133d697 +82a21034c832287f616619a37c122cee265cc34ae75e881fcaea4ea7f689f3c2bc8150bbf7dbcfd123522bfb7f7b1d68 +86877217105f5d0ec3eeff0289fc2a70d505c9fdf7862e8159553ef60908fb1a27bdaf899381356a4ef4649072a9796c +82b196e49c6e861089a427c0b4671d464e9d15555ffb90954cd0d630d7ae02eb3d98ceb529d00719c2526cd96481355a +a29b41d0d43d26ce76d4358e0db2b77df11f56e389f3b084d8af70a636218bd3ac86b36a9fe46ec9058c26a490f887f7 +a4311c4c20c4d7dd943765099c50f2fd423e203ccfe98ff00087d205467a7873762510cac5fdce7a308913ed07991ed7 +b1f040fc5cc51550cb2c25cf1fd418ecdd961635a11f365515f0cb4ffb31da71f48128c233e9cc7c0cf3978d757ec84e +a9ebae46f86d3bd543c5f207ed0d1aed94b8375dc991161d7a271f01592912072e083e2daf30c146430894e37325a1b9 +826418c8e17ad902b5fe88736323a47e0ca7a44bce4cbe27846ec8fe81de1e8942455dda6d30e192cdcc73e11df31256 +85199db563427c5edcbac21f3d39fec2357be91fb571982ddcdc4646b446ad5ced84410de008cb47b3477ee0d532daf8 +b7eed9cd400b2ca12bf1d9ae008214b8561fb09c8ad9ff959e626ffde00fee5ff2f5b6612e231f2a1a9b1646fcc575e3 +8b40bf12501dcbac78f5a314941326bfcddf7907c83d8d887d0bb149207f85d80cd4dfbd7935439ea7b14ea39a3fded7 +83e3041af302485399ba6cd5120e17af61043977083887e8d26b15feec4a6b11171ac5c06e6ad0971d4b58a81ff12af3 +8f5b9a0eecc589dbf8c35a65d5e996a659277ef6ea509739c0cb7b3e2da9895e8c8012de662e5b23c5fa85d4a8f48904 +835d71ed5e919d89d8e6455f234f3ff215462c4e3720c371ac8c75e83b19dfe3ae15a81547e4dc1138e5f5997f413cc9 +8b7d2e4614716b1db18e9370176ea483e6abe8acdcc3dcdf5fb1f4d22ca55d652feebdccc171c6de38398d9f7bfdec7a +93eace72036fe57d019676a02acf3d224cf376f166658c1bf705db4f24295881d477d6fdd7916efcfceff8c7a063deda +b1ac460b3d516879a84bc886c54f020a9d799e7c49af3e4d7de5bf0d2793c852254c5d8fe5616147e6659512e5ccb012 +acd0947a35cb167a48bcd9667620464b54ac0e78f9316b4aa92dcaab5422d7a732087e52e1c827faa847c6b2fe6e7766 +94ac33d21c3d12ff762d32557860e911cd94d666609ddcc42161b9c16f28d24a526e8b10bb03137257a92cec25ae637d +832e02058b6b994eadd8702921486241f9a19e68ed1406dad545e000a491ae510f525ccf9d10a4bba91c68f2c53a0f58 +9471035d14f78ff8f463b9901dd476b587bb07225c351161915c2e9c6114c3c78a501379ab6fb4eb03194c457cbd22bf +ab64593e034c6241d357fcbc32d8ea5593445a5e7c24cac81ad12bd2ef01843d477a36dc1ba21dbe63b440750d72096a +9850f3b30045e927ad3ec4123a32ed2eb4c911f572b6abb79121873f91016f0d80268de8b12e2093a4904f6e6cab7642 +987212c36b4722fe2e54fa30c52b1e54474439f9f35ca6ad33c5130cd305b8b54b532dd80ffd2c274105f20ce6d79f6e +8b4d0c6abcb239b5ed47bef63bc17efe558a27462c8208fa652b056e9eae9665787cd1aee34fbb55beb045c8bfdb882b +a9f3483c6fee2fe41312d89dd4355d5b2193ac413258993805c5cbbf0a59221f879386d3e7a28e73014f10e65dd503d9 +a2225da3119b9b7c83d514b9f3aeb9a6d9e32d9cbf9309cbb971fd53c4b2c001d10d880a8ad8a7c281b21d85ceca0b7c +a050be52e54e676c151f7a54453bbb707232f849beab4f3bf504b4d620f59ed214409d7c2bd3000f3ff13184ccda1c35 +adbccf681e15b3edb6455a68d292b0a1d0f5a4cb135613f5e6db9943f02181341d5755875db6ee474e19ace1c0634a28 +8b6eff675632a6fad0111ec72aacc61c7387380eb87933fd1d098856387d418bd38e77d897e65d6fe35951d0627c550b +aabe2328ddf90989b15e409b91ef055cb02757d34987849ae6d60bef2c902bf8251ed21ab30acf39e500d1d511e90845 +92ba4eb1f796bc3d8b03515f65c045b66e2734c2da3fc507fdd9d6b5d1e19ab3893726816a32141db7a31099ca817d96 +8a98b3cf353138a1810beb60e946183803ef1d39ac4ea92f5a1e03060d35a4774a6e52b14ead54f6794d5f4022b8685c +909f8a5c13ec4a59b649ed3bee9f5d13b21d7f3e2636fd2bb3413c0646573fdf9243d63083356f12f5147545339fcd55 +9359d914d1267633141328ed0790d81c695fea3ddd2d406c0df3d81d0c64931cf316fe4d92f4353c99ff63e2aefc4e34 +b88302031681b54415fe8fbfa161c032ea345c6af63d2fb8ad97615103fd4d4281c5a9cae5b0794c4657b97571a81d3b +992c80192a519038082446b1fb947323005b275e25f2c14c33cc7269e0ec038581cc43705894f94bad62ae33a8b7f965 +a78253e3e3eece124bef84a0a8807ce76573509f6861d0b6f70d0aa35a30a123a9da5e01e84969708c40b0669eb70aa6 +8d5724de45270ca91c94792e8584e676547d7ac1ac816a6bb9982ee854eb5df071d20545cdfd3771cd40f90e5ba04c8e +825a6f586726c68d45f00ad0f5a4436523317939a47713f78fd4fe81cd74236fdac1b04ecd97c2d0267d6f4981d7beb1 +93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 +b5bfd7dd8cdeb128843bc287230af38926187075cbfbefa81009a2ce615ac53d2914e5870cb452d2afaaab24f3499f72185cbfee53492714734429b7b38608e23926c911cceceac9a36851477ba4c60b087041de621000edc98edada20c1def2 +b5337ba0ce5d37224290916e268e2060e5c14f3f9fc9e1ec3af5a958e7a0303122500ce18f1a4640bf66525bd10e763501fe986d86649d8d45143c08c3209db3411802c226e9fe9a55716ac4a0c14f9dcef9e70b2bb309553880dc5025eab3cc +b3c1dcdc1f62046c786f0b82242ef283e7ed8f5626f72542aa2c7a40f14d9094dd1ebdbd7457ffdcdac45fd7da7e16c51200b06d791e5e43e257e45efdf0bd5b06cd2333beca2a3a84354eb48662d83aef5ecf4e67658c851c10b13d8d87c874 +954d91c7688983382609fca9e211e461f488a5971fd4e40d7e2892037268eacdfd495cfa0a7ed6eb0eb11ac3ae6f651716757e7526abe1e06c64649d80996fd3105c20c4c94bc2b22d97045356fe9d791f21ea6428ac48db6f9e68e30d875280 +88a6b6bb26c51cf9812260795523973bb90ce80f6820b6c9048ab366f0fb96e48437a7f7cb62aedf64b11eb4dfefebb0147608793133d32003cb1f2dc47b13b5ff45f1bb1b2408ea45770a08dbfaec60961acb8119c47b139a13b8641e2c9487 +85cd7be9728bd925d12f47fb04b32d9fad7cab88788b559f053e69ca18e463113ecc8bbb6dbfb024835f901b3a957d3108d6770fb26d4c8be0a9a619f6e3a4bf15cbfd48e61593490885f6cee30e4300c5f9cf5e1c08e60a2d5b023ee94fcad0 +80477dba360f04399821a48ca388c0fa81102dd15687fea792ee8c1114e00d1bc4839ad37ac58900a118d863723acfbe08126ea883be87f50e4eabe3b5e72f5d9e041db8d9b186409fd4df4a7dde38c0e0a3b1ae29b098e5697e7f110b6b27e4 +b7a6aec08715a9f8672a2b8c367e407be37e59514ac19dd4f0942a68007bba3923df22da48702c63c0d6b3efd3c2d04e0fe042d8b5a54d562f9f33afc4865dcbcc16e99029e25925580e87920c399e710d438ac1ce3a6dc9b0d76c064a01f6f7 +ac1b001edcea02c8258aeffbf9203114c1c874ad88dae1184fadd7d94cd09053649efd0ca413400e6e9b5fa4eac33261000af88b6bd0d2abf877a4f0355d2fb4d6007adb181695201c5432e50b850b51b3969f893bddf82126c5a71b042b7686 +90043fda4de53fb364fab2c04be5296c215599105ecff0c12e4917c549257125775c29f2507124d15f56e30447f367db0596c33237242c02d83dfd058735f1e3c1ff99069af55773b6d51d32a68bf75763f59ec4ee7267932ae426522b8aaab6 +a8660ce853e9dc08271bf882e29cd53397d63b739584dda5263da4c7cc1878d0cf6f3e403557885f557e184700575fee016ee8542dec22c97befe1d10f414d22e84560741cdb3e74c30dda9b42eeaaf53e27822de2ee06e24e912bf764a9a533 +8fe3921a96d0d065e8aa8fce9aa42c8e1461ca0470688c137be89396dd05103606dab6cdd2a4591efd6addf72026c12e065da7be276dee27a7e30afa2bd81c18f1516e7f068f324d0bad9570b95f6bd02c727cd2343e26db0887c3e4e26dceda +8ae1ad97dcb9c192c9a3933541b40447d1dc4eebf380151440bbaae1e120cc5cdf1bcea55180b128d8e180e3af623815191d063cc0d7a47d55fb7687b9d87040bf7bc1a7546b07c61db5ccf1841372d7c2fe4a5431ffff829f3c2eb590b0b710 +8c2fa96870a88150f7876c931e2d3cc2adeaaaf5c73ef5fa1cf9dfa0991ae4819f9321af7e916e5057d87338e630a2f21242c29d76963cf26035b548d2a63d8ad7bd6efefa01c1df502cbdfdfe0334fb21ceb9f686887440f713bf17a89b8081 +b9aa98e2f02bb616e22ee5dd74c7d1049321ac9214d093a738159850a1dbcc7138cb8d26ce09d8296368fd5b291d74fa17ac7cc1b80840fdd4ee35e111501e3fa8485b508baecda7c1ab7bd703872b7d64a2a40b3210b6a70e8a6ffe0e5127e3 +9292db67f8771cdc86854a3f614a73805bf3012b48f1541e704ea4015d2b6b9c9aaed36419769c87c49f9e3165f03edb159c23b3a49c4390951f78e1d9b0ad997129b17cdb57ea1a6638794c0cca7d239f229e589c5ae4f9fe6979f7f8cba1d7 +91cd9e86550f230d128664f7312591fee6a84c34f5fc7aed557bcf986a409a6de722c4330453a305f06911d2728626e611acfdf81284f77f60a3a1595053a9479964fd713117e27c0222cc679674b03bc8001501aaf9b506196c56de29429b46 +a9516b73f605cc31b89c68b7675dc451e6364595243d235339437f556cf22d745d4250c1376182273be2d99e02c10eee047410a43eff634d051aeb784e76cb3605d8e079b9eb6ad1957dfdf77e1cd32ce4a573c9dfcc207ca65af6eb187f6c3d +a9667271f7d191935cc8ad59ef3ec50229945faea85bfdfb0d582090f524436b348aaa0183b16a6231c00332fdac2826125b8c857a2ed9ec66821cfe02b3a2279be2412441bc2e369b255eb98614e4be8490799c4df22f18d47d24ec70bba5f7 +a4371144d2aa44d70d3cb9789096d3aa411149a6f800cb46f506461ee8363c8724667974252f28aea61b6030c05930ac039c1ee64bb4bd56532a685cae182bf2ab935eee34718cffcb46cae214c77aaca11dbb1320faf23c47247db1da04d8dc +89a7eb441892260b7e81168c386899cd84ffc4a2c5cad2eae0d1ab9e8b5524662e6f660fe3f8bfe4c92f60b060811bc605b14c5631d16709266886d7885a5eb5930097127ec6fb2ebbaf2df65909cf48f253b3d5e22ae48d3e9a2fd2b01f447e +9648c42ca97665b5eccb49580d8532df05eb5a68db07f391a2340769b55119eaf4c52fe4f650c09250fa78a76c3a1e271799b8333cc2628e3d4b4a6a3e03da1f771ecf6516dd63236574a7864ff07e319a6f11f153406280d63af9e2b5713283 +9663bf6dd446ea7a90658ee458578d4196dc0b175ef7fcfa75f44d41670850774c2e46c5a6be132a2c072a3c0180a24f0305d1acac49d2d79878e5cda80c57feda3d01a6af12e78b5874e2a4b3717f11c97503b41a4474e2e95b179113726199 +b212aeb4814e0915b432711b317923ed2b09e076aaf558c3ae8ef83f9e15a83f9ea3f47805b2750ab9e8106cb4dc6ad003522c84b03dc02829978a097899c773f6fb31f7fe6b8f2d836d96580f216fec20158f1590c3e0d7850622e15194db05 +925f005059bf07e9ceccbe66c711b048e236ade775720d0fe479aebe6e23e8af281225ad18e62458dc1b03b42ad4ca290d4aa176260604a7aad0d9791337006fbdebe23746f8060d42876f45e4c83c3643931392fde1cd13ff8bddf8111ef974 +9553edb22b4330c568e156a59ef03b26f5c326424f830fe3e8c0b602f08c124730ffc40bc745bec1a22417adb22a1a960243a10565c2be3066bfdb841d1cd14c624cd06e0008f4beb83f972ce6182a303bee3fcbcabc6cfe48ec5ae4b7941bfc +935f5a404f0a78bdcce709899eda0631169b366a669e9b58eacbbd86d7b5016d044b8dfc59ce7ed8de743ae16c2343b50e2f925e88ba6319e33c3fc76b314043abad7813677b4615c8a97eb83cc79de4fedf6ccbcfa4d4cbf759a5a84e4d9742 +a5b014ab936eb4be113204490e8b61cd38d71da0dec7215125bcd131bf3ab22d0a32ce645bca93e7b3637cf0c2db3d6601a0ddd330dc46f9fae82abe864ffc12d656c88eb50c20782e5bb6f75d18760666f43943abb644b881639083e122f557 +935b7298ae52862fa22bf03bfc1795b34c70b181679ae27de08a9f5b4b884f824ef1b276b7600efa0d2f1d79e4a470d51692fd565c5cf8343dd80e5d3336968fc21c09ba9348590f6206d4424eb229e767547daefa98bc3aa9f421158dee3f2a +9830f92446e708a8f6b091cc3c38b653505414f8b6507504010a96ffda3bcf763d5331eb749301e2a1437f00e2415efb01b799ad4c03f4b02de077569626255ac1165f96ea408915d4cf7955047620da573e5c439671d1fa5c833fb11de7afe6 +840dcc44f673fff3e387af2bb41e89640f2a70bcd2b92544876daa92143f67c7512faf5f90a04b7191de01f3e2b1bde00622a20dc62ca23bbbfaa6ad220613deff43908382642d4d6a86999f662efd64b1df448b68c847cfa87630a3ffd2ec76 +92950c895ed54f7f876b2fda17ecc9c41b7accfbdd42c210cc5b475e0737a7279f558148531b5c916e310604a1de25a80940c94fe5389ae5d6a5e9c371be67bceea1877f5401725a6595bcf77ece60905151b6dfcb68b75ed2e708c73632f4fd +8010246bf8e94c25fd029b346b5fbadb404ef6f44a58fd9dd75acf62433d8cc6db66974f139a76e0c26dddc1f329a88214dbb63276516cf325c7869e855d07e0852d622c332ac55609ba1ec9258c45746a2aeb1af0800141ee011da80af175d4 +b0f1bad257ebd187bdc3f37b23f33c6a5d6a8e1f2de586080d6ada19087b0e2bf23b79c1b6da1ee82271323f5bdf3e1b018586b54a5b92ab6a1a16bb3315190a3584a05e6c37d5ca1e05d702b9869e27f513472bcdd00f4d0502a107773097da +9636d24f1ede773ce919f309448dd7ce023f424afd6b4b69cb98c2a988d849a283646dc3e469879daa1b1edae91ae41f009887518e7eb5578f88469321117303cd3ac2d7aee4d9cb5f82ab9ae3458e796dfe7c24284b05815acfcaa270ff22e2 +b373feb5d7012fd60578d7d00834c5c81df2a23d42794fed91aa9535a4771fde0341c4da882261785e0caca40bf83405143085e7f17e55b64f6c5c809680c20b050409bf3702c574769127c854d27388b144b05624a0e24a1cbcc4d08467005b +b15680648949ce69f82526e9b67d9b55ce5c537dc6ab7f3089091a9a19a6b90df7656794f6edc87fb387d21573ffc847062623685931c2790a508cbc8c6b231dd2c34f4d37d4706237b1407673605a604bcf6a50cc0b1a2db20485e22b02c17e +8817e46672d40c8f748081567b038a3165f87994788ec77ee8daea8587f5540df3422f9e120e94339be67f186f50952504cb44f61e30a5241f1827e501b2de53c4c64473bcc79ab887dd277f282fbfe47997a930dd140ac08b03efac88d81075 +a6e4ef6c1d1098f95aae119905f87eb49b909d17f9c41bcfe51127aa25fee20782ea884a7fdf7d5e9c245b5a5b32230b07e0dbf7c6743bf52ee20e2acc0b269422bd6cf3c07115df4aa85b11b2c16630a07c974492d9cdd0ec325a3fabd95044 +8634aa7c3d00e7f17150009698ce440d8e1b0f13042b624a722ace68ead870c3d2212fbee549a2c190e384d7d6ac37ce14ab962c299ea1218ef1b1489c98906c91323b94c587f1d205a6edd5e9d05b42d591c26494a6f6a029a2aadb5f8b6f67 +821a58092900bdb73decf48e13e7a5012a3f88b06288a97b855ef51306406e7d867d613d9ec738ebacfa6db344b677d21509d93f3b55c2ebf3a2f2a6356f875150554c6fff52e62e3e46f7859be971bf7dd9d5b3e1d799749c8a97c2e04325df +8dba356577a3a388f782e90edb1a7f3619759f4de314ad5d95c7cc6e197211446819c4955f99c5fc67f79450d2934e3c09adefc91b724887e005c5190362245eec48ce117d0a94d6fa6db12eda4ba8dde608fbbd0051f54dcf3bb057adfb2493 +a32a690dc95c23ed9fb46443d9b7d4c2e27053a7fcc216d2b0020a8cf279729c46114d2cda5772fd60a97016a07d6c5a0a7eb085a18307d34194596f5b541cdf01b2ceb31d62d6b55515acfd2b9eec92b27d082fbc4dc59fc63b551eccdb8468 +a040f7f4be67eaf0a1d658a3175d65df21a7dbde99bfa893469b9b43b9d150fc2e333148b1cb88cfd0447d88fa1a501d126987e9fdccb2852ecf1ba907c2ca3d6f97b055e354a9789854a64ecc8c2e928382cf09dda9abde42bbdf92280cdd96 +864baff97fa60164f91f334e0c9be00a152a416556b462f96d7c43b59fe1ebaff42f0471d0bf264976f8aa6431176eb905bd875024cf4f76c13a70bede51dc3e47e10b9d5652d30d2663b3af3f08d5d11b9709a0321aba371d2ef13174dcfcaf +95a46f32c994133ecc22db49bad2c36a281d6b574c83cfee6680b8c8100466ca034b815cfaedfbf54f4e75188e661df901abd089524e1e0eb0bf48d48caa9dd97482d2e8c1253e7e8ac250a32fd066d5b5cb08a8641bdd64ecfa48289dca83a3 +a2cce2be4d12144138cb91066e0cd0542c80b478bf467867ebef9ddaf3bd64e918294043500bf5a9f45ee089a8d6ace917108d9ce9e4f41e7e860cbce19ac52e791db3b6dde1c4b0367377b581f999f340e1d6814d724edc94cb07f9c4730774 +b145f203eee1ac0a1a1731113ffa7a8b0b694ef2312dabc4d431660f5e0645ef5838e3e624cfe1228cfa248d48b5760501f93e6ab13d3159fc241427116c4b90359599a4cb0a86d0bb9190aa7fabff482c812db966fd2ce0a1b48cb8ac8b3bca +adabe5d215c608696e03861cbd5f7401869c756b3a5aadc55f41745ad9478145d44393fec8bb6dfc4ad9236dc62b9ada0f7ca57fe2bae1b71565dbf9536d33a68b8e2090b233422313cc96afc7f1f7e0907dc7787806671541d6de8ce47c4cd0 +ae7845fa6b06db53201c1080e01e629781817f421f28956589c6df3091ec33754f8a4bd4647a6bb1c141ac22731e3c1014865d13f3ed538dcb0f7b7576435133d9d03be655f8fbb4c9f7d83e06d1210aedd45128c2b0c9bab45a9ddde1c862a5 +9159eaa826a24adfa7adf6e8d2832120ebb6eccbeb3d0459ffdc338548813a2d239d22b26451fda98cc0c204d8e1ac69150b5498e0be3045300e789bcb4e210d5cd431da4bdd915a21f407ea296c20c96608ded0b70d07188e96e6c1a7b9b86b +a9fc6281e2d54b46458ef564ffaed6944bff71e389d0acc11fa35d3fcd8e10c1066e0dde5b9b6516f691bb478e81c6b20865281104dcb640e29dc116daae2e884f1fe6730d639dbe0e19a532be4fb337bf52ae8408446deb393d224eee7cfa50 +84291a42f991bfb36358eedead3699d9176a38f6f63757742fdbb7f631f2c70178b1aedef4912fed7b6cf27e88ddc7eb0e2a6aa4b999f3eb4b662b93f386c8d78e9ac9929e21f4c5e63b12991fcde93aa64a735b75b535e730ff8dd2abb16e04 +a1b7fcacae181495d91765dfddf26581e8e39421579c9cbd0dd27a40ea4c54af3444a36bf85a11dda2114246eaddbdd619397424bb1eb41b5a15004b902a590ede5742cd850cf312555be24d2df8becf48f5afba5a8cd087cb7be0a521728386 +92feaaf540dbd84719a4889a87cdd125b7e995a6782911931fef26da9afcfbe6f86aaf5328fe1f77631491ce6239c5470f44c7791506c6ef1626803a5794e76d2be0af92f7052c29ac6264b7b9b51f267ad820afc6f881460521428496c6a5f1 +a525c925bfae1b89320a5054acc1fa11820f73d0cf28d273092b305467b2831fab53b6daf75fb926f332782d50e2522a19edcd85be5eb72f1497193c952d8cd0bcc5d43b39363b206eae4cb1e61668bde28a3fb2fc1e0d3d113f6dfadb799717 +98752bb6f5a44213f40eda6aa4ff124057c1b13b6529ab42fe575b9afa66e59b9c0ed563fb20dff62130c436c3e905ee17dd8433ba02c445b1d67182ab6504a90bbe12c26a754bbf734665c622f76c62fe2e11dd43ce04fd2b91a8463679058b +a9aa9a84729f7c44219ff9e00e651e50ddea3735ef2a73fdf8ed8cd271961d8ed7af5cd724b713a89a097a3fe65a3c0202f69458a8b4c157c62a85668b12fc0d3957774bc9b35f86c184dd03bfefd5c325da717d74192cc9751c2073fe9d170e +b221c1fd335a4362eff504cd95145f122bf93ea02ae162a3fb39c75583fc13a932d26050e164da97cff3e91f9a7f6ff80302c19dd1916f24acf6b93b62f36e9665a8785413b0c7d930c7f1668549910f849bca319b00e59dd01e5dec8d2edacc +a71e2b1e0b16d754b848f05eda90f67bedab37709550171551050c94efba0bfc282f72aeaaa1f0330041461f5e6aa4d11537237e955e1609a469d38ed17f5c2a35a1752f546db89bfeff9eab78ec944266f1cb94c1db3334ab48df716ce408ef +b990ae72768779ba0b2e66df4dd29b3dbd00f901c23b2b4a53419226ef9232acedeb498b0d0687c463e3f1eead58b20b09efcefa566fbfdfe1c6e48d32367936142d0a734143e5e63cdf86be7457723535b787a9cfcfa32fe1d61ad5a2617220 +8d27e7fbff77d5b9b9bbc864d5231fecf817238a6433db668d5a62a2c1ee1e5694fdd90c3293c06cc0cb15f7cbeab44d0d42be632cb9ff41fc3f6628b4b62897797d7b56126d65b694dcf3e298e3561ac8813fbd7296593ced33850426df42db +a92039a08b5502d5b211a7744099c9f93fa8c90cedcb1d05e92f01886219dd464eb5fb0337496ad96ed09c987da4e5f019035c5b01cc09b2a18b8a8dd419bc5895388a07e26958f6bd26751929c25f89b8eb4a299d822e2d26fec9ef350e0d3c +92dcc5a1c8c3e1b28b1524e3dd6dbecd63017c9201da9dbe077f1b82adc08c50169f56fc7b5a3b28ec6b89254de3e2fd12838a761053437883c3e01ba616670cea843754548ef84bcc397de2369adcca2ab54cd73c55dc68d87aec3fc2fe4f10 +97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb +ad3eb50121139aa34db1d545093ac9374ab7bca2c0f3bf28e27c8dcd8fc7cb42d25926fc0c97b336e9f0fb35e5a04c81 +8029c8ce0d2dce761a7f29c2df2290850c85bdfaec2955626d7acc8864aeb01fe16c9e156863dc63b6c22553910e27c1 +b1386c995d3101d10639e49b9e5d39b9a280dcf0f135c2e6c6928bb3ab8309a9da7178f33925768c324f11c3762cfdd5 +9596d929610e6d2ed3502b1bb0f1ea010f6b6605c95d4859f5e53e09fa68dc71dfd5874905447b5ec6cd156a76d6b6e8 +851e3c3d4b5b7cdbba25d72abf9812cf3d7c5a9dbdec42b6635e2add706cbeea18f985afe5247459f6c908620322f434 +b10f4cf8ec6e02491bbe6d9084d88c16306fdaf399fef3cd1453f58a4f7633f80dc60b100f9236c3103eaf727468374f +ade11ec630127e04d17e70db0237d55f2ff2a2094881a483797e8cddb98b622245e1f608e5dcd1172b9870e733b4a32f +af58c8a2f58f904ce20db81005331bf2d251e227e7d1bef575d691bdca842e6233eb2e26c2e116a61a78594772b38d25 +b3c1313c31ec82da5a7a09e9cf6656ca598c243345fe8d4828e520ade91787ffb8b9867db789b34ad67cef47b26ff86d +a8ed8a235355948e0b04be080b7b3e145293accefb4704d1da9050796b2f6870516c1ebf77ae6a65359edcfd016c0f36 +80e792d5ba24b8058f6d7291a2ec5cb68aab1e16e96d793128e86815631baf42c56b6205c19e25ce9727bd1fd6f9defb +816288c5d726b094e3fdf95cb8882f442c4d9d1101b92c7938a7dfd49bc50636d73ea1b05f75eb731c908c8fd8dee717 +ae009128d128ba2e1519bfa7a0c01ed494a7d461c3aba60f8a301701fed61fe4e31d6c79ce189542ae51df91e73ce1b3 +96a866d60a9007d05825c332476a83e869e15b11d7257172a67690ea9bd3efea44bf9c8d42191454eb04fcf110b16396 +8b250a2a06419adb9b611e89f7f8f2990aa301949b533ad3bf17c4a61ab5f5be0b1d5e2b571864d13f1bb75805c7795d +8450f49facf2e620fa45ee90e1801178842d927a2a25fc6ed7ba99a4eec7ae40eebfee41028eaa84f107f4a777694976 +91049080cf659c0985a22d1366e59191bb89663f922e8168b9b7d85c8a73d74a6d9dceefd855d3d858b493670c750581 +a1e167aeb2008087f3195926f1985c0a459d6ec57237255b1473a96de4e2c1cf766127c862c7dc853a6909e67cb06cf7 +b667c0d4e26e20698b07567358625d5f003839c92de8088e12dbd74a6f6a3156b4ea8d252c9ad62af5f6c4fec1cf6cc7 +8e4b5e304c0b1b161ae3e4b68b5e3ac66c42acd7c1ee2458044f6527c508a93995e50894d72d57c1350f91afe72775ff +8c642640aa7915421cdc21fd639f88a42052b1cfa358ff7702e60793a92b7b5926dae15a0c8f8f59cd3013f01c159ba3 +a356f35e713cfc283056bf539de54a21731e61efb4c47319f20de4a4b723d76a33b65f4a67d298b9ec5c2a1579418657 +93ce204146ce95f484dc79c27919a16c9e3fc14a9111c6c63d44491158d5838117d20851cc3227a5e8ba6ccf79e77f39 +b585664cbb9a84b52f89114e1cf0cf1171bea78a136dc1404ac88a11210b2debc3b7a55e702da93ff629095c134a295e +b6dfd444ec7fdceb14c6328f26ca12c3f9fc4327d8d8c68948e92e7e61262b82d833a65a9e3af6353ffa832b6da25705 +b4d4b8eb9ecfffe3f0d48fb4149c7b31aec1da7041ec03bd0750c52a2a7cbc3a7cfbf09d5bfdc56e3860826a62d0bb91 +a4e248e3d61db52da9683fef188579c470d65e2df9064726847b1599fc774049ffdc6ef2ae578d5ed7874f1298ecdf69 +a68a0fffc2e37d3183feb01b42234c0f4e510f9dc29d09c571e6da00fecad9da224cd0f31550070148667e226c4ca413 +86adda2ffecb77236c18005051f31f9657a0d50fef2a1175dfda32e74d5d53df825c10f289eb0ad39df0c64fc9bc7729 +998266d5c9c3764ed97d66fa9ed176af043999652bae19f0657c8328629d30af453230e3681c5a38e2f01e389ed8d825 +a05261554d3c620af0c914cf27ab98f5d3593c33ab313c198e0c40d6c72022eb5943778cd4f73e9fe8383392a7004976 +ad243fb3631bf90fedb9d679fd71fc0cf06bda028591ded2bd4c634ea7b3c2bd22eca2ab318fcdaa6c2cda1e63e1c57b +89b9859a04f903c95e97fb2951f01cc6418a2505eee0b5bc7266b4d33e01b69b9fe7dc56fa9ebb5856095be0925a422d +a68d118343a5bbfbbab95ff9bfe53aeb7fdbaf16db983e6f4456366df2aa01fbdb6ee9901cb102fc7d2bd099be2f1f3e +b49301f25d5a9dd2ec60ddb0b4b477291958487efea9e54dc0e4ef388f03b8bbadd13259d191f7a0b7513876767d8282 +8b93df7fb4513f67749905fd43db78f7026589b704ebb9ea3255d0ad6415437799f40f02e07efccda1e6fd5e8cd0a721 +ad88769ace96455da37c3c9019a9f523c694643be3f6b37b1e9dcc5053d1fe8e463abebdb1b3ef2f2fb801528a01c47c +80f0eb5dcbfaaf421bf59a8b9bd5245c4823c94510093e23e0b0534647fb5525a25ea3aeea0a927a1ee20c057f2c9234 +b10ad82ea6a5aeabe345d00eb17910d6942b6862f7f3773c7d321194e67c9cced0b3310425662606634dcd7f8b976c04 +82f6fd91f87822f6cc977808eeac77889f4a32fb0d618e784b2331263d0ffa820b3f70b069d32e0319c9e033ab75d3b4 +9436d3dc6b5e25b1f695f8c6c1c553dab312ccace4dac3afddc141d3506467cd50cb04a49ea96ea7f5a8a7b0fc65ef37 +8e0a9491651d52be8ebf4315fbbb410272f9a74b965d33b79ff1b9e1be3be59e43d9566773560e43280549c348e48f01 +8809137e5d3a22400d6e645a9bd84e21c492371736c7e62c51cef50fee3aa7f2405724367a83fd051ff702d971167f67 +b536a24f31a346de7f9863fc351fa602158404d2f94747eebe43abf1f21bf8f95a64146c02a4bec27b503f546789a388 +b5cdf5a04fc12a0e0ef7545830061dff7fd8abea46e48fbe6235109e6c36ee6bffcb9529e2f3d0d701cf58bbfb6a4197 +ab15377525753467d042b7931f66f862cbbb77464212c9aa72d4e5c04375ef55f619b3a446091c1ba1a3b5d9f05e538f +905a75b943ad017ff78ea6ddd1d28a45c7273ee1c2e5e3353685813793ead3370c09cabd903fcab9d8b1c6961372d486 +8147df4324faddc02fb0896367a7647b719b6499a361aecfdd3a34296fa6768ad31c34f9e873fd1e683386c44651883e +ac91d08570dd91f89d2e01dca67cdc83b640e20f073ea9f0734759c92182bb66c5d645f15ebd91ed705b66486ed2088d +ac6295ef2513bbea7ef4cdcf37d280300c34e63c4b9704663d55891a61bf5c91b04cc1d202a3a0a7c4520c30edc277c7 +b604be776a012095c0d4ebc77797dd8dec62a54c0559fb2185d7bac6b50d4e5fd471ac2d7f4523206d5d8178eabd9a87 +80ead68def272ce3f57951145e71ed6dc26da98e5825ef439af577c0c5de766d4e39207f205d5d21db903d89f37bbb02 +9950b4a830388c897158c7fe3921e2fe24beedc7c84e2024e8b92b9775f8f99593b54a86b8870ec5087734295ba06032 +b89ba714adabf94e658a7d14ac8fc197376a416841c2a80e1a6dde4f438d5f747d1fb90b39e8ea435c59d6ecda13dea1 +b0c78e7cc60bd05be46d48fbb0421a678c7f14b8d93730deb66fbe1647613b2c62b5075126d917047820c57fc3509cb9 +a860c4acc5444e9ae987e8c93cb9a5f17d954d63c060cc616f724e26bc73d2c54cd36e0492d1fde173847278e55942ba +8fb8269c9d5c15428e8d45da1251e4c4a4b600d47da0caea29fef246854d8fb6acae86a8e6440d0c429d8dd9c2dfee0c +96c5d8eb6fd5c525b348ee4335d200139e437e4be83690af0f35b7f336a7cda8c6d2958647988b84da9f2dd7bbb7710b +a7f62141c4346cc14e9823dc38ac7d587b0427022afc1498d12ee2c43f6ac3a82167057e670dd524b74137f8c3ceb56d +956aac50d06b46a3e94397f163f593f5010d366aa2d816c2205c7d0f47f90cf0f36c169e964f9bcf698d49182d47d91f +b812899bcdc0e70d79ca729cb01104bf60e1357b9085a10f64f3ba9865d57e9abd0a505a502d4de07afb46f4d266be2f +abce02c7e1372e25d40944dc9ece2904a8f59c8854c5f2875fe63ace8ce37d97881f4f9ab4f7bad070ec8e0daee58d3f +8fb13c515b2d6abb4e14ed753fad5cc36c3631dfe21a23d0f603aad719423dd5423157eefcbd9a9c6074e155b79eb38d +a9ef67304dc297ab5af778cf8afa849eeac27db4b6978963e97b95ef7a8d3264d0d07775f728c298a2b6daed2ecf5053 +a9b975520adb066e2ff2a4cde53284c23bc84261a22dc43b1634d99eff8e7892e46bb6e6da7319c9e72788aa9ea7a1ea +a6eaea4ab4206294474d9b956d9d3188d558a5633de2bd05df0d3bac03dbcbe4ed85406349c1d2e660b77c6da1f5bf8c +af4a19f77290dddee762e1e0d4bc9945aacea3f75756ae46cd3e58a8f74d1b5db73e4834687946b0f39191e32f2fed0c +aafa6523f58f1a4cabc924c86d842816d606afeea21fa4b2b8b9573425810fdcc41c98888318e868f9c05e2be12178a3 +8ef38fba0a3fa4ebe985239c8b759c22aaef0c57e6f39050a651c869487803b0d1e389c3d958fb5a7f37740f050ac69e +b07dfc9f85913c608ca7596a2e361f05e4853fad00e796fd492d247de6414892ce160f627669b1ba933b6ad726415d4e +94da679ad1d78b2bff5283c938f17b2a7d6e9cbcdf59d340e6dfb652951c7a9e852ac0590f99cfee9631b9410f6f00ea +98a907c9c021a5b034d3720197c160a82c4b7146cb73d48efeed99b9d0c6b831812cf80ac7e19e85a676a8cd3ead72de +adb746595466a12929019d0048cea33236b05c1229d2eba73b259a18a786f2bc3f05fc0598d8ce253cecb80bdf679aaf +a2fbac016996d68f9027a157b0a3f6a336144a798d6113adfcda3a5d05b62c31f108f112aa915906aef22b7f83b9228b +81841dea1904406d1b6fa49b4b3f7f6cb40b7646cf44d36c9fa07e3dee29f8e47324b40d8356ddf653109673c3374e9b +a3edbb8aac5e60c775775cbdb19067341b2e2530de48738e84c2c07151241ee31f0d8333bf20c2bc9dcb7b2e638a6b5e +b8aa6890e22964828787ce86460d3a32f12a655bb5c28de500f2fcf6b61e3334640ec6ba96029a4912af0d18df4b4139 +8ca43169f04243ad0fdb0152de17c60d9e31ee0ab520970fccd98590e05508821a183b4b367967e60d53c2c826ec5dbd +b179fffd9df8c00486c5a8b9327d599f5a11745ef564f06e126849b06fe2f99273c81f65bc941efb0debaadfecbfec1c +acf068f1c2b1926279cc82750ce21b0d6b0bfd0406f0d8bbfa959bd83935932957c7f6b8de318315bf0b75f6ee41a0f2 +b97831da260919c856e9f71a41687f5979bc16f8a53b1037285b4a2f9ce93af5cfe70bf0ad484744827fb55c847b58eb +aff50b0bd907383b0c241727af364fe084d021221bfb1b09fb6c1a7752eeba45d662493d590f1f182764b90b25f17906 +aeeef044c14e3ad41e1235c9e816e1eb49087fd3abe877b89b3bade74459186126e160bb569bcd77779e701b19b5f71a +8483deb2b7001ca7c438fcdca8ca6aba96c9cbc4becfd9b16a6062705eae270011bcaedcae69bb54630d8c78129e57c7 +aeee8d24be4ac0d9784c029e239fb5e64316ce29b88f47394cfaaa8bb966a72061bff72f99d02dc51c9705854686e77f +90ae09525a16bb2422169e15d6831c87968a14ebc0d1d27e11a759839c73c655b9d33ee5b12f275d6f440688146fbd2f +a3a41fc7fefef101422465e506bea7f3ff23c26fe35f5732b86f5f2471fb93b37ebc339f84c6be1e8d22abc812c2e212 +86f4b5293e8aea4af1f1fb05dcf99714cb3aff1cfc849b1bb73524061c921c9da9ad92579a852e1889da29d952f02fe5 +8932ef39d4050a1e9dc0fd8afeaf159472d71c5c27f458c69d2730836606ea56e19c8c4febf2535f930d3260e9bc7637 +86307b9f3696bb21c20e4558e30310389e7367803c353d437e9b696039a0ff054d9a4953b75237ab1d1dd6f71118c189 +96e57730e683ef5b550c91de18b19ac73879f3e26234297db68d28747ed0953beb0f3913cfb720c602720bf9330685d8 +b04a19ee70123782e47b238abde55baf60ac0c66292a998af0d14afc8bbeb1134e557b94cd17a020084631c09a0d3c02 +829abc8718be8139569fcb2c398962f38f4201114d30e2b2fb23566f8a27a5c380f5605cec543415202a12ed859e33f6 +a0744fa488c8fa92a722c5fc4ef5a47dfe824eccd87d26c8bab9c174cbb151d44b1b29082c48652f03d3177e5ec86001 +81d4035ae9fd28bdcd78b135cb54955d3b685a527319df6ee7e904b8e6d796f5f5a5f5035ee1de750c4cb6050e452b9e +b205e8c2ec24d7104fa0106c09ad34b5a912c1adef553fb718838dd627355993c2ec01055c11d00b2c75b68e9516d44b +b12d09da7968fa7394e449624fc7174d1d76c069ccb03e140d4d87a2d3f6d1f7b9cfc930f0c80becc673406ebe63f08e +b23752c158695da85048fdf38b395681cc0e8998630af8a9ed41efbda08c9964c2dc8ae6e53377264be4467d702c0de4 +b0d84582fd73628d96b8c1ec96197697c41a963542451a2ade0890af0d33c7161d0f18e1a1ce2c168ca2dc1e9119d55e +8b877e618b469aa187632e410b125d2999d5738fd66d482000706b51fd904a0c7e7daa8c9b729fa33817bbc4154cba2a +b1cfc8a7551b601723b937d497d01dec3ee7614c2bf13d430b1058d5ebc1406045009ff02c2ac15bf8cf16f860193d1e +b6d9da84f97b21e13175bbb0b5cc8e79e88b470c87a3e115726c1bd98e0288526c58f3faaa8aa170ace0cd6a60852525 +ad2e773c2d527671ca5fab7085dde4da31cd35f45d4315dd95d8893ff5fb900494dca08eccfc1a2fc7bf7c7fd2fcab97 +8d5a79b34aeb761d4a0c73f09f02e9548e6d382c33ee6887a759ab05762b490b8a549ef2933c7e3a46415c154c0221c0 +b6f2cbe81bd0a7298403be392f8456bed30aed7ef30216959357698f789affd2942ae5fbaf3f48ecebeb7c273b20cb57 +b5b6c45d99cea7ce6a1dc134aff4a8f630f299b42bd59592a7592345f8cd35bcbee944e61b0723de732fcad6e4425b63 +8077d64dfcb2418974e956ea6dbf8a4c05b25d2a025333ad7e2a379f1976dc036771403383a51bfa3476c9c619ef8bef +ad2e0a9d479c77a5fb73b3613a177fdaad50dcb50fed50e756ba18164c153af30b07fb2565e80ff7469f1b0338b7b5de +81017d1d80a6b6df4e99d0d7f85a8180b5523e8fa2ea2672fddff604933f8a113cab27fce098dcb454d7d1f7ed266e04 +852355479d68e76c7febf6dfe2ef8e80d575c0d3bd52c983803592021cfa898c571c0b884412c21e66f0dbfe03167b53 +98e1bf8ad48421467c93b9f72b47dded7c41b4fcd36ea55ca43ab24b0d0b876f5a731f422579b7167c7138fad2121266 +803369314abd5422019ed4b0ef652b4dbe97ef5a87b0ea373eec9628b64a12120b2c3d4eb53db405131ff786d14c7ac6 +adf2613fc34f73e1160975c140e925ed84d254e03cc3bc7fc1d19957b499c9ba9d9e4c1639981b594a7095c0a52c6757 +a2f6a68efdff6e4173c00692abcfdfcdaf6f8b62369afad3dafaae4f2f38c4860780b4624d185e20e4f4498b75b5fe94 +8b1658aa0e119fb8401d486ed08d60240d26a8623ef9788e3b45ad09ae31259395b021bd16be395139cbb7149714e764 +a7dd8bf21121285e00672ee8bb84e0cb39b2496fb53a26e35dfbca7f2b04e9a9ff9db15f53fe63fcbeafeb2deeaf2ca4 +b6d8d709e44bc18f3b41d69608edce60c02bcba48d3b7e2fd420842657f0665a7343246dea149a25e8f3416284abae66 +aaf744ca5e9bcb63e3e2939b7a1e96e4a93c88c76bec0cf4294dd7db95cdd3f6a7d92196e352d08680e2328bc4592899 +84434b015a7c398d35f1ec71fce455d62ba4ed4f62da042ec31bb2b4db47073314354cd50bc322297a1cfe35138bf490 +8d70b3a3cd9d5dfefdacfa418c0b775a112a47ce538d33a560a519660009c3f141fd6221c18539129e9c0acdaceeeb80 +b8c6903412a800ec78a4c15f31c24385a267b0c0ece32fd31bbbb557fd70c3b2d60d8fc0f90fbd70f43baa1928ea30ba +8e391dd445ea06cabb433f057853f8159511b2f9bef41aed9ccd14e0a6fcd912bbaebd38fd5fb736cfde0fa34b7a4874 +a40cd988f70613df32babbd1bbc2f1b29ff1ab0147b01161555a81d56c9621657999bcdb1df38485f687afc51d5d0f23 +b6a008b4426b3d7b28ae04eee4698fc8ef6a35d89008ef5394da39ce582ce1a45dcfae9a33b90f6fa4237f3667803873 +8987280debfb175c3b44a2f152ea82548e4f680966f1fcbee9bf7d714e31bf8080c33f52705ef3aeee70544b22516aba +a78a51a2c11eea7680a5a0ae417a2981f8c69c396e06da621eadd7510a3664ade49d065617bec67b3de779548a4f4509 +a4d9163f0a1bc048385e94d5e0bcafeee1b18f28eb23505623b9e8ef16f3df76408254dfbe790e45f2884198060d388d +83dcae2568a0c518793c0f6e38b42f9ceb50673d100b556a17ec8bd9faeec84afe50b8d72422c6b2356959667bb8e2de +874731941be4474b4576226e5906b5dee89fc9b56a9870dcc7289c1a7d494d345ba6aba31f7546a16f9963283c05f744 +82c1cfab1f501189ac20147fc4631075dbf1abf9125b7d42fcb4f31cf73f3d6461b1bd08fdf6e45cc54bc08a7d5d51d1 +b978228286f5d4a10ce027b6bea3021affcaa805340ca4b5192c69e8c56db59f48e4a14a284ec015f53baf97389f62b2 +af125f4fdccd1c1b64fdffecb5ec7cf8c7392bbe476e1b89a5b5329c5ba4a526e58c11e72ab9de8a38d60af648d75adc +8411a41ec14295acab0d36389013535a80dfff6e024bffeb32fb3070762f61256419e8c51b2ad6de9dbe4f1e8e286912 +8ea67a91112a41f9c65515cd496f4b0cdefa1400fc06568eef000c9eae6dc250fb7622eb3f2deca10b37287cd96fa463 +8da99b6c55c31dee6a49aabb54da249d348a31d4416201a10c45a3b04b11e99d4ae9813632f0ee36c523b5cca62f6f49 +8b44656341e039e2bd83a19c3bb9a88f6209482e274f8cd4f8557b728e5948dd80b5745f621b96f4562928689314e8c2 +a02d424a615ba0dce8ed91f477e79852215a3a39d025059826fa278e7eebef19824b2a2844f5b3865a0f471b609a23f5 +a1f115cebc3fff3bcf233da27cef19eae791660f155d088003460f75567a550bef0722885010ddc384acdeac635939dc +b61a55ce9d143c17876776e064b58a10baf0ba13553c785c1e47f57b5f94c0cda8bc89d43d73386e57816c15b61a8ec8 +b4073f47041e20a8e548c7fb00e07ba3b9056c34eb4ab63bb0e7b48f8e338e8b56a17611a1b5f4c03b352450b86f1d69 +a7b1a07b213205b682fc5b6acb7e76fdf97b280c26621d8f3b76b7c1deb3511957da33a4e358c8e8f3d98b2a8855d67e +b797e67c2670fbd9844e8a68c585f404b035dc14bd4ec75c3f95f932c777f9db5d5f5df7629164af488fc1213035cc5f +99618200797b945f595794d6468e5c618649554ad9ba896330f1cc844090eb956ae9fc23132912f9047085c5f0c3bf7b +81194aa1319abf534cb3927af9adfb178a99d0e3e8c99ab1105f1d3b4fed40ec2971caf1d6647acb0c8d681eca53097b +80673f18e4978dbc226a6cd4b128a1259d9a7f833879c6e2fbe24d69fef2c3c23a51a4f3e8d88fa4533434bbb0723661 +8125bf6c7dbb2fb63aaa3f53283559f172c788223674adbeb6d5bd17cfe888e6b87a79aec774917f20ce911c1f85f8e7 +884bcdb1878b14fc38adc9fb8b4dd0b3afde404fbeb664f26ddfebc81736018551f23e75ce4cfe4865f610bcd454fbd7 +aec65c8d4be8316e98aa54888af01bc6703a0c5d04b69756ff39a0a947b66817ec59d76afe9f61a25749b5e890f03e02 +aa457aaa1b014a4c5a8992847a187a23321bb43452c98745987d038e3b04046102ae859b7a8e980eea978a39d76a88ef +a9832ee63b08e19123f719bfe2fe742125f32463efa966c7709a98ebfc65277670e9ea1fa2d2d78b96bdc7523b0c4c3e +a87b6b1b7858f96d55064274f29fbde56067064962cf3c3e2ba3110b22ea633bc037a74d23543ce3307a46208855d74f +897cbe4ab68a753020fec732dfcc052c7ed9905342b5a6fe0aa25c631f9ad9b659e0ee75d46f0df6507b6720675ee28c +97c3b5f0d54c1fc45e79445c3ff30458959e406a069f5bbf7979d684195b4fa0406b87c1c008f4075bc9e602ed863152 +921e65d582ea9322ddfad1c855331c3cac81f53c700b96db5305a643c084eb6793094e07944bfd41dc02c3b3cf671530 +8f23ef1aca02a260a3b65d25b110f28d3bafca44727448c8f2d03c5e77eda620c1721b06681bd816ee6027664d76352a +946a89b132ec0795aea9ff9dde7b77e7feafffe6e4a2f093042a7e6c71cd6ab87ce0ca914a1b5fabad4e1f96a795f163 +a01e2de9db33df6511172123ad6f7c64074237471df646b32dd9aff8c15278e2723108e4facaedca97e9f49503f8c792 +99dcdcde45b2ea3f15279936feede5f7d3b63ca4972f335b0559c2fa6f9faabd8127aa892a36deb114357ca906553ed8 +a3f8af37bfcf66b04d1896a4bd5d343f4733d4c3305369ac7e75a08f20f2004c10c642d2c7577f4e5c4d1f2cd851ac3b +b7294d15a3d674a56099f97a1adc9e82c15e90832eaf1722df110fc2abc8634c51515e5ad8522015498a3753b1fa8c49 +b4f27f5062ba7a04ea0048b3025b5e3d5b5d319a9e80310c808a5fb4e8e77b38c10a0f3172cb805cadbcc8bc66d36ec7 +aefe5decee0ae2dc372cc6cf4217daf97c4c908d145f100f0daf1ccdfdf641c78432c2e473e7e4b77dcdf2d4c2bb05f0 +acc84af7648a535ffd218c0cc95c8f7b092418c548815f1bafc286b1fe14f6ccb51b2044db3bff864d0bb70e88604084 +84d8e3dac0df6a22beb03742e1d4af684f139f07e2ea0f7fb27fc2d7d4f1e89b5e89f71af32ff115ed5e6092133535f0 +8ada001e1a03a823c4c056f636e77adc0f9dc08689d28de0d99e0feecab5db13abf37b41ec268dbdb42c75419a046c68 +87dac6c798d1744dff81d8bc3e0e04f3c9bf260e811685ddb9a9a8d6eda73927439b344f9a818d2103fad633de5a4a17 +ad9929a7d8a7d5d5954e48281a87e5c84f67e19110d73296b9989a09c76767a57a8115629239ffb4d99dfdf9c52ef6d9 +81ac7cbeef8ec35a5c3b61cc887080c29e6cd3e08af37e45830d17400dbacfb374dd07bf370b979828c3875b2027d5c6 +97f92c9182953b7e10f7a1bbb6b5b5c40b8275eb5a6eec1e29874c4712814749aa8c409651380216e1ff01d7b8511041 +a09794d0bbe7db013045d3fd857c1544fe6231d21afa3495fa300371f6301a3a0f4b8ea175b281503dd06078ff371ae4 +839bb58d320aa08116dd387a57a2b9bd9efc89c4cdfd82d0e47a00cabe644631d09be5436bd485df3b61b75ddf81a3ef +b1cdaa344f783757e8b9c1f84421da3c5be4c69f019a8fd4c1aa5bf1a63e8970c99e35c22cf3b48a0e6738bc6ba7ce8d +92af68e3216c78998208fb24b5ba0e645d0d3f5e28222b805668d7e9cdd6c033d3b22fd6df4c2d745d7f910d133cd226 +87640a4ea4e605e2204e5232b29a6c1c31152d83547eef14122cb76a0da52b8653801af48455a3ed713b9dcfee7b1ef1 +8147e5bf0c8f4731155ca0517ef3fae5a32b4d5d2d98ed0007b23893d8dbb7f8a1199c50c1750c2fa7c9cebe594b1bb0 +a76b4473c63c3ab6103c729afd2482822e4150f3155af39983b0ff0766c71cb622455ce6304e23853661eaa322219d18 +b3e2f05ca551bc3adec0067e4034aaffd72e0b64ac18ae25452c996927976c6727966e26d213b032521889be2170800d +a8414cd14cb3be658e9e0004ce511ef7063439b1cbc3166a11de030613fde4b59caad4e91d426927863c55382afbf476 +b2f0f8ab99f4d0ea785ac84fdbc00b20217b1df59b30b51d9d209d489d53b69dd5d82cdacc16fd1dd15c3a4001595f50 +8b2025d5fd658c9bbed619f3e3f6ac8efe7aeff8aa9401bd66a7ceb0062c44b353608ca073f95be99204f0a913bb77eb +94a46bc5a87291b42024b2137e623c70115b9c6b196604106bfbfa20f3f56ac7779763f56b580190d3cb2f1c648cada1 +aca9355545118d0769cacf69c4b23d6d68d229cd8f68f1bc0c847c05569c5af6bbbd8c4dceb637b4a6b3b5c83841bf5e +b0731992cab87c7116406b283a84707a34838bfa3284b0f6082dfabeaf41c5ac2b0ddc1b420547a1b0955aee92de2dc0 +b671f77588c0f69f6830a5b28e7d07ed161b81fa9791bb3a24aae6638e3aa5e186df74978a82549c370c18ebee04d4f0 +b5621ed841780f3e6681d880a76cf519cdd20d35197b112eeaa686764d57b5dfa78ffe1a294b6bc76b6e3949cd2a2369 +afeba2524659d00caecf089645611553187a6ed7102050f6dd20f5a19bed08ac7065912d88371ee06242897d58d652a4 +b78bfb83d44ced14a20135804aba3f00128c3ce1f302e95567ce4097b0d973414153fb305b9f156882a5a0554bf25973 +98510aede95d26b1adf214053eae051ffaf24894e2fa37961a91d0ff5392dd09388196648d95b73e90bd88f2587cc4bf +b35c682d49c295946b9f120fbc47b95abd9ee86d294abb003a92139fb825b509209562575015856a270eb3eea86397a7 +b9641bf685571dd9c478dd2033a1f1b11cd3a662b26502c78595863b8e536a189674a9a85f7a253453ebfd1b99fbd841 +b2ad37036a59b1c9b8457972665720a6868422ed8157b6810a9c0783006103be34ab732d7aeb8629653edd18fd0f1717 +af0920cff05179a3896ea6ea322c39adf91ada5bc40fe3f6fb1b1b4e121e907c904bbaa8ca00468b3749f3da144d71f3 +8e269672818ef1e2f9e0c8aa65c84442fcd9151d74bb8e870cee8c0e3fe24526e1a5388b430cef47b67f79b4e4056bcc +aa29a16fe00ea3d143b1032b1dd26b8ce638f37f95c085c7e777e8e2784bd724bd5c38b1583c61a6ec7c451dd78fd3fb +87452b7435911cc5f513b0c81b15aa04972ecbe3d7bbd0a5d676c96a8a311301c0e07fac925c53a350b46fbd3d4d0fc1 +869a81c351096f47748e41566ae7b77a454b1cdfaa41d34a5742f80df38fbf5cbb08924b6fdff58e3b18f05c62bbbbb1 +8b7bc1b0486300981147a40a449ada9a41afc06d735cce8bf0fab3ee94ba2e2ea57b1397e3cd31bc295352beb8334ef7 +93e93fc41adb2df279d95654921b4c2edf0d293dab58d0afefb221f777349ef88d0985b3447e3b935954a81f1580a92c +970fa7cdca8324faf3e62348bb50d78f580b4f43f2e1c11bd8382d48d0074a3c55c6407203a0c9cb1c5f2163ba421ef4 +924983929e608d27e4a36d4ed919297869e3c64de51aca794d32d6e90aea546bf898d98ceca28a0b2187734821b78504 +8d395332529c703d943d68415d443332b5c1342ca9d9a59bfa8bd4ab63e93358c4b0dde6ce1f2e8ea9dc8f52ad7ebd95 +80200dda853e588256599e7f905add5d5ee7c74272780317694fbae39318ae9be05d5bcd7b20cf460069743f3d4ef240 +a287d51d6359c9ef7c7ac1b20e479ce7d0146dba5606397bd04b7a622cec642508d5b45d51b31de71f9763595b6ac88e +a320396c075175d6599225cf2e1de8c7cab549f6316c07feb0f6eaa21f06b2dd29ab14fbdf2af4543b4890ec0fd08a4d +b1e9fe230418d20368691058adcbbe30011bab3000422f0371015ff8bd09c60fb5fa85d18550d35b1c900977ca48f58b +9718fc26a51783b971744933f20490e9b5cd9162f86b84788c4c5217f5409e37b5a39d628b18e5b35a757acf67596321 +a0cf81fdb161f4f1b419c5e4caa36d4bdca2325f0cd25b119a30178016f171bd6fb88403e4e3aec026c4089f180d540e +8ab1e36bd04625ee794ef04c4dcb8e004d61aceb2b62438377f49ad95dcf025ba25eb799280004941e555bf7172af6fe +9257b9e3d14d37fc7efae49b0c68d36eaac546035f4a2654d566b3ce1b2c4564cbb03dc8ec66efceb768559a8a507a18 +945d1123b839637ab5154a1972c3c83a0ff34a3b1a3465de6ef0416b1950f649869a3ef88d7f1036648ee385265ce2df +81449639d708860fc0229c94f754f7262e8a3c7f67960ff12dfd15df95f57a9ffcee2013e81978b7703dd42bd5d0816f +a865481deaae5a690fd53892791e5fa729db283b75a525a11cdfee1ce17e8e7f0b449d25f20b3c1b43da128dbdf98a8b +98766812a65fcd25b853546e3bba618a3edc9fd61510e4f8ab60c038a7fa50d197abeec8776109df0f2119be9445ad00 +b1b8dd5379d903dc41d74e999b1ab693607a0d2905692f4fb96adf08f738e5d31f9d00df28ccb8b5856145ca552c3e3c +99d20be7b511bec78a8ed03c207aa4aa9097ba39d85e18f1b8d52f65431ab7e9a773c7b9ac3e8d8b25458bc91bd00703 +b1b7c3563fe8cb33c7d3e0b89d00bdd13e86452ff507c2e69db7b3af06f247f139155396e9b0278753310dc63940a10b +b3dc9c08451b1de7c9969b1e47574bffff50490f4a16c51e12390195d9e9c72f794790caf7b0a835d64e01fec995d3ac +aaaa4761a00022ede0809d7063d3532b7bfae90ff16f45e17a340ad4ebaa2fbac40728ccc5fbe36a67ab0e707566c5dc +8319a1903314eab01f5442d2aee6ae9c3f6edfda0d9a88b416d0f874d7d1d05d08bb482102f8ca70a4fa34836d0840c1 +932949a6e9edfec344932a74d4f81eec3667ece1e8b8ca840ce07ffd4b5d6d8f01657c764d64ac1b9190f876b136490e +904db1568128487e312fe629dd8bb920cecafd3bb9cad8b63e269ae0129f2f5c80cd82f0d81e7feca9835c3945a72d28 +a17280693d30dcd43c85de8f6b02d5f30cb9097274ad680cede1ef105c903615b4c40f3c6aaca478642de324972514e0 +8d5f76e093aee71d0cdeb017fdfcb13bd068039746de90690ce150a0bfdbe7ddc4d539df0f82c2d2890a40b191900594 +96fa1f2196a3883cdd73c66d28403cbbb58f6a939a3697ee0d308d8a076393cbb4be86255af986869230ee410c01bcfa +a8b74438dc5cabd70a91bf25601af915c4418d074327a9b01e0190c27d3922c89bb9b41e0b366e82e313edda8f21983d +ac9fdc1a9b2e3ff379eb2370979372e13c4177bf4574f1490fadf05a7073e6d61e703e2d8eed9ce984aba317d411e219 +a45a6c9b958169f2f8df70143e6ac3e2f6f969a4eed6fd9f1c620711bc2454739bb69f0094079464790c5429c0d8aedd +8901cbdd1009864386577842c1e3d37835fddf834064d9613b4559ea9aef3084204e1f863c4306f874141f4374f449ff +b6c582161691e3635536686825be9c4d7399d668a7675738417e0363e064dfd28acdbd8dbc9e34c1dab8a1990f1f0eba +89e89ddaf3cacc78428f3168549c161283ca8337345750667c98212717b21e7d994eae4e45bbddacc832a18df1d79276 +84be275627eed8e1a73c7af8a20cee1ef5cc568cfeea7ec323d7f91b44e9653e9aeed47c1896a8240b99dde545f0e1fa +a779a54ab4f40228f6e2539595fb8d509b70aab7c19e1928c1be69ec1dc19285c3898cf15e5f8b8bc725e13af177fe17 +92e2a49d2b9b36349d442283b17d46f8f9bf5932c34223015ce62d2f285e7363b2c12232be4a838b5b6cf08e694c094c +8b4e28c6f3f36caa2cfb82ba88066c830f8017bd35608b077143dff236f3181230166f5a5c02fa0e5272297331726aed +85fd77d46162ffac4b8adb25baff0eb0512a53a3d01638b3a376ea34702279ce21c8e7d8884308c03e00c9bcc1a9fd29 +aad5e46916ff1be29009b595d1d8fa160cc7aa01c7fbf3a68f445c87615790dcab1fcdbdceda533d182b6541f09f2f73 +948df7654726250dae393325addd3c0a20431c81f00470962190335ea4b6d9f7463d6f308cda46b92084c1f24390b1da +8f577474dea132676504376c5542b730b6604fe3d965eaa194659fd11c52233bd0b11ab62e198c0f442327ff1c00e501 +ae2f1001546db3e0c19700adad997cd9f765fe7a51a502cbcd9a2a07a3a5db79c8f603e05cf96d80b688cb6c9b6cd3ae +953b68e5d9561088dd20406ea7fb6894cba33868a38ace38fc30b5813140cb15dd6dd2171befae5b4df2e4a9658889d8 +86c52901655ff11419b084a04da8fc3596eae59d81d3461601c0baff59ba59e3d1dd0b7ce719e741a3e97c013e898579 +b9a72dd5eff73f9912a28b55de073568efb3eb0241a10b77a2bfd4f30c2aa4fbfe0c89eb345c9f07fb725660873cb515 +8e7353f5f2932e4ffd95811caf46c9bd1a53643c27eb41a4ebd211f230955cd71a8b27e17cfe8aa708d8514c0de67a66 +a096b8e66312a92fb10839ebe60189a8d1bd34dff55f7dfae85e4d2f53a1a4a88211c19fc84494f066358ddce82be131 +931c5cd82719d76596832b007969b5f75d65cffabb41b9dac7910300db677c1309abe77eeb9837a68c760bb72013b73a +8ba10f5118d778085122065b55dd1918fddb650cce7854d15a8f0da747da44d7b12d44fc29ad7dc38f174be803db74c6 +8c971deec679372a328587d91fd24ab91043e936ca709c333453d7afd43ee256d08c71cb89f0ab0e89ae119831df6d86 +a2ac28a58034fbd8fd518f409221bad0efec52670880f202e09c0530e2aabc2171ed95e99891790596ffad163d86c110 +b3354e3dfa8068aba4f3741152b9204baa4e342c1cc77e6dd1419cbaf8da1d118be605846b8609e997d6a62a11f3423a +a12ab65a213c9d95c24865fddc2dffe0cf9fc527dd6bcdacc1bd7271e79929a4ab3427a231f4f49d0530474e6cbc88f9 +90afd65b7e6973f8aafbe74da0f42441840d3c93bd69bc1bec8fa56824e7ca97ad1b427c8a85da7d588469bd4ccc50c3 +a09175940c59489bac3d3da3a4091270d9118948cbbdd57f2bcc63fbf45b8010651c801d3e58dccf42733ce1d6b446a3 +a843bbf286e3cecc1fe370ff1bcf5f1001bc2e95b34246625ff50d48ee62343e82fba2d25b8a4bd5f7b5ffe90920efa2 +a3c4d1003219157fdbee2707ce07afa6c2a64ae8e450182c307ed7f070024071f30b12c4b0032960ff913c74e73a9976 +b24af3f68d66f825d06fc3ff94fcccebe28b1a0d4ba29c48d3a3c953b9bf7ae6707f193fef25e2dcbd2b74e483c774f0 +b0f657f7723184ef7d7e4381143f1ac8020d8c6c6f2dcbebb0eaf9870d61a81f2d452596503311e46d1b38f625d4756b +b90091004fc8f6205c51bec68547ac82dba0f5525631e7632cf6efe54eecd9020729fbee6105d1b8012402d3b79c54aa +8e3fa187713c60eb0a416d6900a894cdf81e6b6b69dae0bb64f6287f3c3f030cfa85c665f7aace1eab4937f380b8f728 +879bf0784ccf6725c9cd1ea8c49fde31c91c605de1ea664a33c2ce24c277ee45d20b66309f98d989acb2ff3b77e13101 +af3f3a3ddc4e11abd627d5aef8adffa91c25df5f0c68b4d2b5d51e7d9af3395ba4f6f7ae2325a6672847e1ecc6cad628 +973e667289e796d3a40f072e6fea575a9b371a9997cf8961677f8dd934619ddc47c1a3efe91bae9ef95acb11a8fe6d09 +afa81c5606de82f46b93f4bb6db3fc0670f4e0d1091388b138a66b3827322d95a56168c951c30831d59eeadc227500bd +b83eff77db5b4c18574662942eb36f6261c59f655f8a9c3d3731412d0f257c8e80aacc995c4b2303058a1ba32522a434 +912e5ac9234b9445be8260393ff08e4859a7a385e800b74d1534eeb971f58f74cfb518dfdb89f8705d89fbf721439129 +ab27c8ece4a51d23e22c2e22efa43487c941139b37ea1182e96efb54ca4809d8245eae0ebe8ba94f0ed4457896fe11b1 +a6630585d104a745bc79dba266d9292bbdad346449c8ee8140a5e6e8a6194411df9cdbf3d3ef83468a536d4f052e9335 +8b8c128244da48e7fec641a882d0005a2d05c7138d86a293e6a0a97c76bf632b44767d0ce44663c975e7f9f9679e25e3 +87dbcaca67351a4e7d2297d7cdba4796d12f58857e7ee4abd0645563577ff33544a44cd84e50b3a3b420d6998de9b57c +b859ba43df259d7f8e7fac70bfd7aae546d57a5dc90e107b174a95bf7fd3cf00f740c4434848e69b2a7e6061f66c1ef1 +99d6e20978fefc40c6d310187eb2ad3a39296f189ee122ed64d74f81033c3069d44f7a9d3988a1df635b609603a17272 +99a5ddf3420cc0c92b21f71a805245608d4995ead447d8f73a670d26d33e26920d5f07bfe1f6230bd5f15978055b4253 +b936ac0944d3c5e4b494f48f158000abb37b80b5c763f77fe856398c664b0f1ddbcc0a9a2a672db9278f08b4bafbe2ec +b4af85fbf4040e35a686dd016adec037c99b47cc2e4dfccaf7870ee9e8c97bff30f3035992def2a9d4af323c0b3af8ae +a5ee32b8bd5f8fa9000da4da0bf00565659a43285393d37080b555d0166bde64d87317b2eab2d48a0e7b287caa989be2 +894d4ad58ecb1c9ebc4f5a97407082e56cb7358d7a881ba7da72321c5027498454f2c7fa2bd5f67a4b11d38c7f14344a +965be9eeaa0d450dacc1b1cc2fbf0d5d4b0dd188f2c89aaa9260e7307a2a1eb22db6092fccb662269e9a1abfc547cabb +805893c424aec206260c1c2d2509d2cb9e67ee528bd5179a8417a667aa216a3f318ed118b50d28da18e36c01f0805e3f +972d7040d4963b35260ef0cc37cd01746f1a2a87cedc0dc7b0ee7e838c9e4573784ea743f563b5267eb3905d4fa961ba +8c7156991d4c2e561888feaecf501f721b4174e7d14109e9deeac5a9d748301c07e11fb2b04b09799f0d34ff42cb77d1 +894722ac35af3d507e81d737d21e16c5ba04686f8f004aa75934aae5e17acd3e065b96e229eb011c2f34096f4c62048b +81237937c247c88e8e31e2c72412189fe59c1daf65c5513489d86cf29ee922c0bb08e5f7890f09f4ada7e5262083d266 +8cf62cda2fe0d9a6b42aa2a1c483f4ad26378c7cc2c2d1510a76df7560b07dba8528b33aaacb15f7f20b9d4c7c9f61f6 +aaf0921fb3e1920eee5d0acb59dcc268b42f4b435d60d25d30357edd7dd758d035919691bd15311d85489dfa2e5ee696 +92cec07be2247ef42002ebcaf65ec855611b8e893a5675796f2225f55412201b0bf9f4761924d0c8377b9f131e09e39f +8e514a62ac1e91773d99588415426c97ad63e917c10d762fe06ace5277a5c3bf3730e4b9e5d116f8493b9ab8687b70e3 +83932df2d923a5052468a3ea87f7b55c6a80ede3594046ee4fe233046570921822bc16555b92ba6aeabaef9b1dc0805a +a2b5bfb249de3472113fd3f35bfabf3c21d5609da62a27ea6aab5f309c9068d94bc58ba03efb4ec11be06306d59e60e8 +8106cf3ebe6f0507be8c6e8d137987315fe3689ecb75bb27980f36ba5efac504baccea0e7603549b6d126beccc278804 +a73ee70b6fe8c082443972102c453fc0e386852476cf22224fc0bfe554735c12f96037fbf10922795f4502c4f052b5f4 +932b27e175440169958504f3ed6400e7d6dcd5e716c19dcd0f15c56c04503ed133d5a993e111c016f141e32d68b29886 +96f7ce4595318e0b4a6b368f788ff82226aac676aed4ace343867f751de414453a9aaaabef6e6224ce5aedc3d5cf77c4 +a950c1e3bc9a14484997013d44d876374b939af437ae7c821c131fb886063ee9fe7214a25a0c7084f0b07b99412eff75 +a9dba3886ed6855303106a1bdd26010f294218684e1c178afcfea3f37a2f04fd01724a31d82de3449046617e3507a115 +87a2f776b32a6b550cf3ceeaf78db02819be74968d228b1d14e0d74a1cdf994bb500b7abef6619455e98d728701fac5c +8cd887b07e335edc0b27e6a660cebb64d210741395be431d79d570139687b056557159407459799a8197b6079644f666 +b81a61fce00588909c13a90c1caa150f15788786af443ff60ce654b57147601f7e70b95659e01f470334a220b547611b +8aebc51141544c5f3d3b99422250424b9800031a8fdfbf22c430907a3a446fecaa2392105d66d64b1c8e847240da4a6a +90db7dc12baa02f3f86d3edadf9434e2b9318d4f6f0eca08276b765dbb38d8eb0d08be2fe70adf2bf16ceda5db08d3ca +aa1839894152d548cc6ad963de20fb6fcc843bc9af2a2bf967c63626b8ad19e900894d6106265f38f3afccca317c22f0 +848e27b741496988a582515c0c8847b2bfc6a001259396cdeea1e1b1d2828ca3a626693a1bf4adf3a3d7f8b1fa3d75fe +a0aa11754d4ee136ac3ca609b17bcae77758763b2016544ca7921dddedd8aafcc7ad5f2b337c8bf53084eb8e43ea41fb +b8713b7aa1c112178195fdcc9b7024f46e6bc04c4e76c41abe620aa265287809200d98eaed6c9703fa97e81d6964f0ec +8605b5b33309e9ea6823542b85383c496794b8481c577497aaf99ba90496e794dce405be615bf92c7b6361460e6b82e3 +826fa34faa7f83e063a7bf172addfc07badabada59cfc6604fdf481d29085251c0a67a1355b2cbd374e2975934b84cb6 +b45d131082dc16fa53af010d43eefb79200dc23d2f3ee26af95ac6a5cebc49c84a9ed293e534ed16ff3ef9a4a25456ec +91bd6ce3c5396a7a0de489e49f0cdf6dce1cd2d0be7a410326423c3185bd1125ce1e610768be7f15f4e44b62f8834fc3 +903ffbe3d33fbf106c01c727dc3a385201a67ded70d4df623934882f69a3a96c909b027a124f3d70cb072b0046a149e8 +b405359db9d9ef4821a181b440ef2918c240595141d861d19a85867a5afa74d2972d22c988775eab441e734700bae4a3 +8abb756d027233c83751910a832b0ef4d28d100077f1c5d656720c94906f91d85dd0ea94b1cc0ed95b692efee14c786e +a78ee77ab476a41a3454160ba7ca4085d8b1f7057c63e76db8b07cf20afdeddd2250cd00771a6329133bb4ad48ccc20a +a41810271d8c37197aa9b3dfcefe3498e42f5978d3f3d59defff4676d6402d8575b40683834f184f143b6cfbfc859b3a +90c24a0750242660bcc6d487358a3cc015730538a0a8beb00ad5ac2ef33cb8ca8a62121e50bec8f3d2f43900f8e3134a +8b96c39695d864ef5796941754978a1fd612b369f6b77fe5ae6587beac936ee28190af8f0a3822b63060af35e49a5c8b +acde2548883d0e63c0fc257bb9dadd919aba60a985b69ebcfa1bca78acca42fc1322ec30bcc8e7c188818f858d04ad33 +895c86ae9ff8d95f2707d4838a3bc8ddb05b2611f0476f014b9c150d0e8332bc73285037a747426f09ac8179ba4e19fc +821761fe406e18bd86fa9ca9db99d382cd3b5c70c456f471fa3706d57763d147706304c75d54f51ce8f3115aa26e59d9 +a803a80e3e8f47dc3c59ea23eafdec017458eac648b360cd42cbd075e0dde6f6f450b48c7646fb1e178c04f82ae51a12 +91f40e1b6f588bd592829ce937996452c40be0fd6c43793c607866701ac6a8c7227e0891d45c6e7b1599382b0a3fbdbb +9408246d996a634a58689337f2526dfb3ba9ffef1d3ff91c32aa8cbbed900861ef25d6477308b67d76491edfcc70d65e +a492325a427f3df1c9c690c5b553daa8ac41f62f5ae55f425539222bacf959e2f67afabbba1732e120d3e7a6dcdf7049 +8fd0c3e15477cae228613a171b6e9ec29ddc63ef74854d99b638adeffe39f89f34346a42851e8445e855a9f2bbef0f57 +b735ed01fafa051004dbaad5e8c9e2faca8f6049ef9b590f256ea4d75b04594af12764ad4e6031735eae36f83179db93 +a7d35f43fca06c86b3425dcb68a87186834ba9740664fd657915771beca4cdc0fa2fc9b4c2e9d9bdad8ec33543ddfa59 +a1156e71e2db1b17df5da28747c88e091bd687bfee59d89096437ab4dc9a543fe5c5272d5023d72adbaab397a6fc94d1 +ab06a58bd81b33a411bade8d8c5232d38fadc2e38507159edea6e2e104b8ebd65ca02b05335118f691d44197b847a4dd +848b67a10f1e6ff8f5c228f226ef2ffeb67fb8f50925fc94cbb588d61896d9dc79726959e649898fd3354fe3ff7b7ee3 +aa933397361f32b388edcf832f0db172a38e756b34d5f7a4a050fa7325058006c22cede26ee27917e8f1b0f301792bd7 +89e49e7f02cfaae4a4b9c4180c9f6559d76e3a45774955859d4147970b1470dac37bdc9aedca1c32a20b045049161590 +adc1825d5ab94fc719f25d8c9773f4d518134ed88eb13ac33cb910b2be3523ef9ef88d9e4aea2418b806e20108317bf6 +96c4b444c8a023da644f3a343ebeeed19a8392d2ce175992461451c318a54273b76c3574d8f2dceda2947ddd34d1a674 +8aa7e97e87c8c5b29bbd51a6d30396a6be1fb82b716ef83800f2c36d5b85467ade7e0f59d2db82c310fa92a9265f0b03 +9146c32d99f02c3a6f764dcd9b4807f1585f528ac69dc4f84e4380f6fda4f9d5057c375671d51e7aca2b2b4140e83da0 +a10760a533d9bc57536bcaf65f080302086aa50225437efd64e176841544711828c23a15c49c0dd1f357d3f10722ab72 +acb0811777e17f7ae7aaba5f6fce81b759c067a4908730916195a2505c7450d0e6e2194c2ef0f241090597d58e70de47 +b24f161e9bcdbad56665e2490b5e4c7768390d4668cd69a04ed74739062dbe832636dd33cda89e9b0afa8c77e93fc641 +96b4d01106b831868a88ef016500ef2fa42d0ce87a37ca8ca4194a92a22c113edfe04eb2ca037329f3c1acc635148f55 +aebbb95fb4f7adcc8e7a217aeb73f9e037cbb873d08c1cd9d68c6c6834511adf1af8b44567fee84327599bdcb734dedb +a9bd8b17300532fb94d028659bcafbe7bbdf32f8945baf5db4cfaa1bac09e57c94cad0ba046b4514044b8fe81ea8596d +a5557cbda599857c512533e7cadcf27bf8444daa0602aa7499cafc1cf1cf21f9d16429915db7485f0e9a1b5046cf01c5 +8810307c40bc661c478a9747ebf2a30e5a5ead942d1ac0418db36ba5db0709c476f7d19685cabe6959e33ec1f3bff914 +8829b741f41f2c32e10b252d9338deb486dba2f23996a44cf1dd888ad967a589d51329be34d764139f372a1043f6c2e5 +a6b4728d18857c5fa082fa67bfb3b1d801e76b251b1e211a19c87cea5fe7ce757f943c85071f7a03a718388cd5690e95 +86da7f397e2533cd487f962ae58e87bea2cd50af70ef2df9ea0f29f70b5843cde664d30ec207ab84fc817f3851277e02 +8085776ef4ac6d42ab85b9d9135ecc6380720efd274f966544eeedf4684028197de76ecab919fa5414302597e1962bca +b05a065c733033d223ba13d16baa7a97bd8c8b8b1f0e59a9bdd36ee17e9922d48eb39bd180c168b122088a77f0bf321a +a89343fe44a93023dcc7ef71bd3bcb6786f68e1885ad260edc56a52445d34757f476395ba7ad35437f89bc573c7618dc +a114a9cd6105b524f3969c69faa2e09afe21753a93361a296f9e0e3b4e3e63726ddf2e6bfd3ddc046043e50bd44e539e +8a5611fec539cf681c05636bb580f29acc06f628bb012649ffa41ea6c1521194a5643d5dd843f09b6eb2c3bdb4d41acd +ade247c4011ec73ec90b72f35afa59a999e64ba5a7e664a4b30874fea53ba6a14a76a41b58a5f891a20d019e5f091bdb +905b5d96df388160ade1ffe210d0c6d1979081bc3de3b8d93ac0d677cc2fc2dc1ef6dcd49d3947055514292a3fa2932e +a9520796ca9fccd11b7524d866507f731f0f88976f0de04286e68d7cf6dbd192d0d269f0cd60fd3d34011a9fe9e144c2 +989a1edf4d7dae811eb57a865c8e64297837ffeeaae6ee6ac3af0f1044f023f1ca552bf00f1642491f0f0f20e820632e +879c8e63713f4935ed6e020559e140ea3073ced79d3096c152c430141272117b4fd9a9fc3eef012e81262df02ea14bd7 +95074738ac1540c0312274333acd1ecad9c5509fee883c4d9295fa8d8200f6e637c363de395f9fa612f05c0dc58fae88 +a770e4fc595269eb806b113ab3187ea75c8f96b57bf9fcfaf535f3eedc1d4d7e6285a20990575de0ff09f62d06ed0692 +81283e5dfb6423439ff513eca1cc316941d196df8da2d1069d2d0b63f5289e630af2fd4119bc0144c002d33313372dab +abd1b108e743887b78f698f2aba9d5492f87a22868d1351d705d93a1084fd45be67170c68a6e18b07f400d9a01cda8c2 +8509c3f67b92908cea8144f4e2a71631a66a61ac3547601c788907e52e380e5fe8ae4110aed95d13c67d3bcdd5b55a61 +8fa5a790ec5cce6d4114128c295390120869aac5490a82feebd3c37a167120df2e7fdfaf2a4050a7dfebf48fb093212f +944753e1ea7d8bc727d46a7702077dc01dc0c6574e8263a16579b57ee155ca5901f71bb347a01a9a922b329d3ff75135 +b46bc1fd4590b7a6275e20036d247c5909fc549c78e95b64ae7ed96e3b05bb044840f19f7650ebfe7008ba09fa83c3c9 +b1e47e4d88e59a06c465348c6cc4181d40f45b91e5e883966d370c26622c328415c6144aa2f61ddb88ec752482c550ca +8bd4f8e293e3f1815c7e67167618fb3b0ea76424bc0985908957cfcede36109378e41b4d89555b8c2541b4c447e00461 +a70589a867b2bfb63d0106083d58475d506637148549ed35c83f14e5c8de996e1b1f3447ecc80cf5cd134ef4db9d2fb6 +8048b80ba6131d07370162724127b0f7cb17fa7f71855e55e5a75bd0a9e4fd71b0d0ea2d16ec98858e458528df8d06b5 +97326cb94bae7530f4ec3235770c5a7ba042759e789d91c31fedbd979e3c0e6a2c69e2af3c1979c6fe0094274dbd53ce +a18e9c1d3eabd62af4e31a4b8e08494f4167fd4598c95d0123f39c46c53f9e93f76615900246e81a286c782ac37c569f +80309c59d4522b15aba617cd3c6238663e8b1c7ad84456346082c8f281140fc0edf9caa19de411c7e7fb809ca4fa3f4d +8e450c0990e2f65923f252311623038899eeff7b5c2da85b3a224e0ef7132588b291b782d53c477ecb70f34501466178 +87843f96f41484e254e754c681a65681b9ae5c96c292140368743df9e60f7e2ada58ca2bb95fa39abe064b2ebf21eeba +858e8d5bf2a1cf26d8af5036b28b831d450a446026f58a1734b696c18f1f41482796b91cab0e5b443dd2f0b9cffa52b4 +99627dd6bad8c05c5904cd23aa667d664da846496dbbb8452705c4ec01e1480e9c7295504a5a8529e4a0c842306b038d +b64b33256c18b2c886a837a0c0730fdfe73befb0e2796207c4dc592c5a33cd51f8c2ef47c584dd5773abf9ce9c1b0082 +944f6da2a1546f0bfc4d98c3e73c79e935e33d208b6be26b0b5f8df6d0e3b74a5bda649853b99281bd3a3ec799a7dd04 +a266d165435784d4e884640155e35b2a911b3f89e1e715986de419b166a36a341ba724877d80583fa3da566f6a828971 +adff2698409d0756e78c534032ee926560c13d578cb178d5073172d049ebbce32a92692f7e2033ec781b9b0d894ddce0 +a91933f110756c699c28bf9e24fd405bf432002a28c4349e0ca995528e56a5a2d101b8d78afa90a178ff1a9bf2ba515c +8e77839c0eb4da2d01e4053912cd823eddffbdc6b9c42199fba707ca6ab49fc324288b57be959fbfb11d59085d49324a +aa124517c76692036c737e987f27c2660514e12a953e63ff4bcb269dd18fc44dae95e282de8444bed09639ef6577af88 +b285deae99688f1bd80f338772472fa2b35e68887c7eb52c4ef30fc733812444c5cd110050275ad999d5a9b57f782911 +8877b0fa85b44ef31f50bdb70b879fa6df5eb1940e2b304fd0c8f08abb65f3118fa3d97ff93919038c1e452fb1160334 +8a89f3b50dcbca655024542ca7d93df17deff5c7d01c7da2bdb69e76b3e0b4490d85c800fb3debb4b0b4d20c9527f7ad +b7e5dbe36e985354ac2f4ab7730fea01b850af00767a6c4d8ee72e884d0fe539bb81f2e34638fcf5d07b7c8d605f4c06 +a85a1d78f6d4f9d5d83ec0f2a426708342d4e4a5d15625554e8452f6a843d9aa4db0c7e68caebdaf767c5b3a6a6b2124 +a518078a9dac63c5bf511b21ed8e50d1ccede27ebfe9d240937be813f5ee56aef93dc3bf7c08606be1e6172f13f352ce +91144eedebda4d1ad801654ef4ecd46683489b177ba1de7259f7dd8242c8c1700e15938e06c5d29aa69f4660564209a0 +a16c4657bc29d1d3271f507847b5a4f6401cee4ad35583ad6b7a68e6c2b9b462d77b5dd359fd88ea91ce93bb99130173 +85b855778f4b506880a2833b8468871c700440a87112fa6a83fd3ddb7e294b3a232d045dc37dfc7100b36f910d93c2ae +8d86bb149d31bfbf1fabcae1b8183d19087fd601c3826a72a95d2f9cedb8bb0203d1136a754aa2dd61f84b7f515acfa9 +acfe7264eee24e14e9f95251cbcfdd7e7f7112955a1972058444df3c2d2a1070627baefada3574ebd39600f7f2ea7595 +906bd14ecca20ac4ae44bff77cc94eb5a4ecc61eba130de9838e066e8766ed3b58705f32c650e1e222b3100691b3806b +8f2cbc7b8593c4be941dd01b80dc406fe9dfdf813ef87df911763f644f6309d659ea9e3830ff9155e21b195fc3c01c57 +a68eb15ed78fae0060c6d20852db78f31bebb59d4ddc3c5bdd9a38dbe4efa99141b311473033ff8f8ea23af219bc8125 +a95cb76c9d23fc478c7e8a73161f2ff409c1e28a2624c7d5e026e3cee9e488f22225a0c5907264545a73e83260e3a4ec +b76f90e55fa37c9e2732fd6eba890dd9f1958c1a3e990bd0ce26055e22fe422d6f0bcc57a8a9890585717f0479180905 +b80cc95f365fabd9602ec370ca67aa4fb1219a46e44adf039d63c432e786835bb6b80756b38f80d0864ecb80e4acb453 +b753c86c82d98a5b04e89de8d005f513f5ea5ea5cf281a561d881ed9ad9d9a4be5febb6438e0dba3d377a7509d839df0 +a664733f3b902fac4d1a65ea0d479bb2b54a4f0e2140ed258570da2e5907746e2ac173ace9120d8de4a5e29657ae6e05 +9479722da1a53446e2559bb0e70c4e5bf3f86c0ce478eede6f686db23be97fcd496f00a9e174ceb89ab27f80621f9b80 +b707fd21b75a8d244d8d578f3302d1b32bb2d09f2bd5247dff638d8b8b678c87d4feab83fe275c5553720a059d403836 +93214c16831c6e1d6e5a1266f09f435bbed5030c3c4c96794b38d4a70871782002e558d960778e4465b1ff296ffedad8 +8648f84e18eb63dad624e5fa0e7a28af2ee6d47c28f191be0918c412bf24b5460c04bf2b7a127c472914a0741843f78b +b67f61e75d6b773a6b58b847d87084b94f3cdac3daa7bef75c2238903a84250355a986b158ff96ba276ca13a6035fdd6 +ae9b094b7b5359ee4239d0858d3755a51aba19fce8ad82b0936cca48017523319c3309409ea6e9883a41bece2077e4d8 +8d1d8e1fba8cebd7a0e1effea785a35e16b1a10842f43e2b161d75add11eccf8f942d2ae91c20eef6c1a0c813731ea9a +b82bd387458e3603782d5e2dec32ae03890a3fc156d7138d953f98eff4200de27c224f626e3648e80cd3dfc684c4790f +a6dd02a89ad1c84e25e91176c26355e21a01b126c1df4d22546159dab9d502dbc69bc0d793a017c1456516e4aa5fa53f +a9ab74a5c5459b8500beb0ad13e9cfe2656e966dc9b4f3f98bec7588023b4ddebf74e4fc722d30423f639f4ee1b2587f +b03e5f33ab7ecec12cbc547038d3fa4f7ea0437e571891c39660c38d148212d191be29e04eb2dc001b674219b7a15a9c +925df4fc6e898ca55090ad1a8f756cc5014167a042affda5b24896eeb6aac408545134920586a8e1a2b997de9758b78a +98c8580fb56ed329fad9665bdf5b1676934ddfb701a339cc52c2c051e006f8202e1b2b0f5de01127c2cacf3b84deb384 +afc3765d374c60fac209abd976fe2c6f03ce5cc5c392f664bb8fac01be6d5a6e6251ac5fb54cfcd73e3b2db6af587cbb +8e7e98fb5a0b5b50d1a64a411f216c6738baaca97e06d1eba1c561e5c52809b9dab1da9f378b5f7d56a01af077e4f8cf +b724bf90309651afb2c5babaa62dc6eac2b8a565701520fe0508cee937f4f7b6f483fc164b15d4be4e29414ce5d3c7d4 +9665160e7bf73c94f956ecb8ba8c46fe43ae55c354ce36da40ccc7594beae21d48d9c34d1af15228c42d062a84353a0c +8600ab3aa86b408ee6e477c55572573ed8cfb23689bbdadf9fccb00161b921ec66427d9988763a7009b823fa79f8a187 +b0d8d19fd1022e7bc628d456b9bd1a2584dce504eb0bf0802bdb1abd7a069abbeeccdb97ce688f3f84a229342dbc1c33 +8f447d5e5a65bb4b717d6939cbd06485b1d9870fe43d12f2da93ca3bb636133a96e49f46d2658b6c59f0436d4eede857 +b94e327d408d8553a54e263f6daa5f150f9067364ded7406dcb5c32db3c2dffd81d466ee65378db78d1c90bc20b08ab3 +b58c02781b74ef6f57f9d0714a96161d6bfa04aa758473fb4d67cc02094cd0c0f29d0527c37679a62b98771420cf638b +8cfa0a687ea51561713e928271c43324b938aa11bb90f7ffaa0e4a779b3e98899f2af59364ce67b73a46a88748c76efa +95d6d39c814c5362df69116558d81ce6f1c65fb400fc62de037f670d85f23f392c1451d43341c59bc342bc31842c8582 +af888b384c52d9e04e4db6c4e507c2037eb5857e9bcc33acf84fc3a02d93cbde8cce32141fce9f5fec715b5f24d56356 +a7822bbc3c236fd58bd978f0fc15fe0b60933a0c953db6436a233441219418090ae0c07c490a6548e319029771cdaba7 +8c53729f750922e5eb461774be8851a3f40fe42eed170881cc8024d590bf0a161d861f5c967144d15cdcdc3dc6b5cf88 +a052a25a4aeab0d5bb79bc92a6ae14b5ad07d1baca73f4f6684ccecfc7ea69bc21eadeb9510452fdba116c0502dd698f +923946b83d37f60555dbac99f141f5a232728c6eb819a37e568c8c6e4d9e97a4229fb75d1de7e9d81f3356f69e6d36f1 +8cab82cf7e415b64a63bd272fe514d8b1fa03ba29852ec8ef04e9c73d02a2b0d12092a8937756fdec02d27c8080fb125 +b1123314852495e8d2789260e7b3c6f3e38cb068a47bdf54ed05f963258d8bcabaa36ccbea095ba008e07a2678ec85a7 +a685b779514961e2652155af805996ceb15fb45c7af89c5896f161cac18e07b78c9776047c95b196362c9ad5430bcb22 +b734dd88f6cc6329c1cb0316c08ade03369a11dc33191086c6a177cf24540c7ceee8199b7afa86c344d78d513f828e81 +b0bf492fb136ecdb602c37636ed4deef44560ab752c0af5080a79c9f76a1f954eba60a0bf6ba8bd7b8cac21848c29741 +a5c74682323e85ac20f912ab9c1d6e1b9246c4c829dca40c8a7d58ec07ea0ad3524be30623f351269552f49b65a1245c +837403b9cf830fb33ecc11a7c8433e07745973c36acdeb3fc9ea8f7d8d690d462e1250b7410f79f2f4180fe8f3962a4f +b03d64b944d49c83608f2c5b9c14070c025f7568c4c33d4eeb1da31d07f0bc5897e498b35b50d557ee129f0c3c68e254 +827272aab8bf757e2483156e00fbebe1093a58070dd3af9855bbf946c7abfb9c8a850a6a8acda8c620902f391f968b8f +84c4eb863a865282d321302d06b362f8bd11c2bb0090f90ebffedd3eb3e7af704cff00d39a6d48cbea4262942e95200b +b044eb91653dc55dce75c8d636308a5a0dae1298de4382d318e934140a21ca90e8a210e06fdf93aadbbeab1c2ef3904a +a8c08955a4378522e09a351ecb21b54025a90f2936b974068e80862803e7da2b5380c4b83b4b4aad0409df8d6c8cc0cb +a763a5fb32bd6cb7d7c6199041f429782deacac22b6a8467077fab68824dd69343ebca63a11004c637b9cb3129dbf493 +8c44c8afa9a623f05c2e2aba12e381abdb6753bb494da81f238452f24c758c0a0d517982f3999d2537b7279d381625ed +8613f47fda577cd3bda7c99b80cf4b2dd40699edfd3df78acb5e456dd41fd0773bc8da6c5e8cbf726a519b9fb7646ccc +b21a30d49d7e1c52068482b837a4475568d0923d38e813cea429c1000b5f79b8905b08f6db237e2eccf7ef3e29848162 +b9bdf4915f3fbb8d84cdfd0deedf2c9dc5b14f52bf299ef5dca2f816988e66322df078da2c54b934b69728fd3bef40b5 +993b45f389f55eba8e5ba1042d9a87242c383a066cbf19bc871b090abe04de9ff6c1438cb091875d21b8c10fac51db58 +a85a95d14633d52d499727f3939979a498c154fd7ebb444b08f637b32c1caf5cca5e933a2f5d94f26851ae162707b77d +b9874c7c4be1c88a9646e0c2f467cd76bc21765b5ab85d551305f5ec0b4419e39d90703d4ac1bb01feb3b160517e97b7 +ad6771177fc78812904c90594712956357de1533a07fec3082ba707f19c5866596d624efc3e11773b3100547d8f6c202 +a79f31921134f7197f79c43a4b5d5b86736a8d3ad5af1bdf4ad8789c2bfe1c905199c5e9f21e9f446247224f82b334f8 +a7f1b6c45321222a350a86543162c6e4e3d2a7c2dce41aeb94c42c02418f0892dbd70c31700245d78c4d125163b2cd5e +92abafe3ec9dbe55c193fb69042500067eb8f776e9bf0f1cb5ab8eb12e3d34986d1204136856fb115c12784c3b8dea6e +89bc761238a4d989006ca5af5303c910c584fe7e6f22aa9f65f0718a1bc171e452c43695e9f5a591725e870770c0eceb +aa0e44c2b006a27d35e8087779411ba2f9f1966a0f5646ff6871bcf63a8b1a4a7638751b94c9b9798ccd491c940bc53f +8736fe82862b8106e7fdab7b5a964d87ec291a74b8eb1cb5a6c046a648c1b686064ef3d52297043b8940bfe870c712f8 +956a3def1942f05144d8e9c3a82fd2d3610064b53b9eefde3d5594a8f705bf8f6849eb2c22181796beffeba43cc74ee4 +af27416d00cf97d5a1f4a1b6b51c010884cceca294f1151c3b684a3f83c3c8a3c30771df1166d833cbddf6c873c400c3 +aac3b8dca2336fc4ffc63c362df461289e4bbd3418c621bde6c581d3ecedf66e2b3e523d4db39e3d8ba014577bf85efd +94c3a8167f62074e5b28c2bffe4b6ce645439a9a0c5da3ca1b3ee956590a465d6f84a8a4dbbe9070ffbd6bbc734e4d62 +95e23ba6986d25ed4451215da05bd72c5491528271726d79a94c8cb16aef1c85b190d6c5b8a3a1191c7cafbab1dccf0c +953e3dadb5ad68f7de31ac09692948655d174fe16d88b96930ef35b331da7f1dbc4c17863cd07b4ec3135b5205891a27 +915d018f18b5d63cb3301c2bb5c6e85e75a88ba80663c964d06575b6bacbbe59139d030b218ce0998271d5b28c00b26d +8c871ba3dd138a908b2f7effeea0e71df096b23e0dd47cab10b9762b250abfd1221da94a8ee884e05bdf02271fb85a04 +96bad5c6ebc3080ecbe337409ae398bbeada651221c42a43ea3b7c08c21841ddbcfde544c9b8d4772de6f2ce92c0b963 +b5dbcd0b1c44c62108841558ec0a48df4b327a741e208c38b1c052321eda6e6ad01af71d49dfcdd445ab6fa6f0c34e6d +97dba59219b69e8aef2659d1f10bbea98d74aefff1f6451de3f41be39acbac0122b8ff58b02e90554469e88911ec3547 +b7e5682ec306478be4858296f5d03364a61f3260636a4242f984d351a02e8723378496beb30c4ca22def9c9ca193ea70 +9656a7a3df4d11df3d8bc35930dff70a5e78a488ca57bba20bb06814fc390fc6c7cb3f39b22134992aad196cced577de +8b269695aa63eb56d0324ba984279dc4c88e565321f1d61d553622bd4f1910d5eff68393d3a830eb924472bd478c2aa3 +9177bcd04b28c87bc0440268b4c8995c6790cad6039594971b2c177f0e197055231e776927d3fa30d98fb897a2ba401f +ae0e943973482001c4f214b9da82e1c27e38aa254d0555e016095c537c835d3702bc2de5c67b234ab151e02b3b7a43a6 +82fc719a7d38bf4787fe1888019ad89fbf29beb951d2fece8686d2beb9119d0c8c6d13bc598748c72c70d73d488140ca +b716dc66f87eb16b95df8066877353962d91bf98cf7346a7f27056c2a4956fb65e55cb512af278783887ab269e91cd76 +81d58cd8bc6657362d724b966321cd29a1b5cdc4601a49fa06e07e1ad13b05e9f387ca4f053ed42396c508cd065c5219 +b32ad0280df6651c27bb6ddbdc61d5eb8246722140a2e29c02b8b52127de57a970e1ded5c2a67f9491ae9667349f4c46 +b68a2eb64cc43f423be8985b1a068e3814b0d6217837fb8fbfd9c786db9cca91885c86899c50a1242040b53bf304ced9 +85887515d4e371eabb81194cbc070e0c422179e01dbda050b359bd5870449c7950e6b3947b7a4a0eb68199341cc89fc3 +ac5fff3c27dfbab78eb8aad37ac31cc747a82401ebf3644a4f4f5aa98d37b8bf3b3f4bd8a3428b32a127c25c9e19d239 +86fceaa6fbf8913553a9e1e907fcb1f1986d5e401a7eafd353beefd1899d571454fea96ff5b2a21254d9fb693ec94951 +b6778bb296d3f0de2531b67d36fdbfa21475be0ca48b9dfcc38f396c41b557823735ed0b583e525a2bae1fe06e04058c +898088babeb5b9866537d6489f7514524c118704abd66b54210dc40a1c1ddb0a1edf7fe0b6e0db53b836f1828ecf939e +b27854364b97274765f0fb8d1f80d3660d469785d1b68da05e2bd1e4b8cbbe04304804d4c8aabb44cf030eba6c496510 +8c55bbf3603dc11cb78b6395ccbc01e08afcef13611f7c52956b7a65ccf9c70551bff3ae274367200be9fc2d5cb26506 +947726f73cd6281cd448d94f21d3b91b96de7ad3ff039f9153befbb5f172db9f53cacb4f88c80a3db26e6a0f7a846eb0 +a7b733a05e97528812d71cecb4f638a90d51acf6b8fcbc054787d6deb7e2595b7b8d1cbe1aa09d78375b5e684a2019bc +8d5ca6d161341461544c533314fe0a6655cde032c2d96f0e4ea7e41098b8b39fa075d38e2d8c74e2d0308f250d6cf353 +b960e9f081393e2260b41f988935285586a26657a3d00b0692ea85420373b9f279b2f1bb2da2caae72dd2e314045f1bd +852a49c7388c10821b387c6d51617add97ba72485f52be95d347bac44c638c92e9c6a44ba0d32afc4d59178a497d944a +8412162a65147e1334ad5af512982b2b48eef565682b3f3e0bbe93fbc5e1103db9375a0c486bdb1b2c57e4cb3a8e7851 +8f52c3eb5d4f1e1e82cfd2b291d4910195427603b796f6c311deb35ef14a01a57a9e6cad39619ad108f3e86f384f9e1c +88d221088f2bf0103c53e44d0d96cd7881ec2b0a965db9121a47481771a8b796edd5ac23c4f9c208a171dab301f7d3bb +b49c3235e8b3617ed08a1891b9e2bcb33dbdacceb94ca96330555b7e00904fe6a749ced9312b8634f88bcb4e76f91cb1 +a85834215e32f284d6dfb0cbfd97f6cffc7b9d354e8f8126d54598bb42d7f858a2b914cf84fa664069632db2ff89a332 +aa3d48eb483c6120c27d9b3e3d0178c1c942632ff54b69f5b3cfbc6ad4ff5b2b9ce6eb771fd1eea8edf4a74c97027265 +a446cfded353cdd9487783b45846402b973cdeddf87e2bf10cf4661610fff35743cc25e8d3b5771dcedfb46b018a5d18 +80998377b3b393ef3073f1a655ad9d1e34980750e9a5cfb95f53a221b053ddb4d6985747217e9c920735b0c851d7551f +a35ac469790fac6b8b07b486f36d0c02421a5f74ea2f0a20ffc5da8b622ac45dfccabfb737efa6e1689b4bd908234536 +8fb1f6d8e9c463b16ac1d0f36e04544320d5a482dd6ffaec90ea0f02b4611aaca984828bf67f84dcc3506b69af0a00a1 +b6e818d61aea62c5ed39c0a22ccbb327178feebdabda0c9927aa1549d2c5bb0637785c4aed2a6d9a7b4989fa8634c64a +b4e7208d16018bf67caafe996d436113eac619732e3f529a6efb7e6f094d8ebea55b7be0e122be075770f5957b6ea6f0 +b691d38b552befac61f6d367287c38d01fec73b7f2efdb6713ca30314a37fb7c177eb111fe6bee657f2681014e07630a +9817587e418e6e7e8e97ae27067f17b55d25dfb14e98f63f530620c855d9a348c9fa571c8508e2741f902f8b9fdc0c5c +b6a6e5ca779ba140bf1d84cd5394ede8262f7479637ec0087a4b152243a1774ba916d8115ce759a3bebd1b409de5f2fc +b53d1c84ad766ff794bf497db3228efd2cc8ed5fc1958d89c1126efdff361610ecb45ea8e329b39035ab00a66c1259c7 +adc31333c507c8e0f4aa2934fcdca57fd9c786722a50dbd5404e129541f7ac182cc7373bf14e1e4e06e6cf94b31b90eb +a82b7fde4642d982d95cec669efee140ad797a2442c7f6620580527d163accbf021b893446cbb8038ea82fe25b15d029 +91f7acf8a8903979afa281646fdecb54aa4d2ed905748e156e92f0910de268fa29d67107d40863935d677d1de8039be2 +86fea71c6d43a7d93216a92fc24dfce8521fd4534a9558b33762d002081247867a6eff54cad7116023277fb4049403ad +8ae5369a7f9f4c91f3be44b98089efd9c97c08f5bb4cd8b3150c115ecd86288fa0865a046a489c782973a111eb93966e +b6fb9e829aa2c81c2d9eac72bb2fd7f3a08e0cd763532c2ce3287444d33cf48b3621f205e9603ec58525934b61a795a9 +83e35ca808d84e41fc92115e9f6e283e928c3a614e6dfc48fe78c33b6411262e7bfa731eadb1e1937bc03cff60032e1d +832fca5196c95098ad47b7d24ba2f9d042e1c73ad2273edd1c2ce36386796ccc26e8567847697f3fcc2a0536a2a2087a +8fdb7038bc8f462ab2b76bf7053362f9c030019f1b6105cf42219a4e620ecc961e3eacb16a8e581a562a97f1418b0128 +8d3a5a404b51b1ad8ce3b23970e0d5cc57b573922341008e3a952a1dd24a135e19e55b79d86a70cfd82e1c0e9630f874 +ba00c025c1c21c57c03cdfc0bfd094b35422281ff0a64b68b240617aa58c6b18800af5f2047d3ff9068bbe987d6c7980 +b468f0dd51964b3806b0aa04f3fe28a035e8f5567fc7d27555be33d02701a838b8dbfe1348b6422c4eac46d2c75c40c7 +8a73a18c97da9958903c38584b08d0e7e26993a5d9b068a5e0e1ee0d8a873942745cf795f94f7a3d3ba88790a9fbb2f6 +953a0a40c2c8102723736854d13b228698c14a02d85c8d2e61db1a768019ac305faf0d5db62ac976430ce087a5b20f1e +8998219da6b34f657cb8a621c890a52cb98c2bc0f26f26e2af666eebeadadc5e8bdf4f830a91d04aca8ce186190152c8 +8941e08c3155ad432236ed05460420a05dd0aaab30477493ffb364b14c00ea5b9183d30d3442b6321d2d20c36e4f5c7e +93f293ff7fb56cf5b03aee6f3ad2ad78444398ed5b3be56d7bf5b56b5aa5a2b980d13895dd57a5726d1b067c20cc55e2 +84a16f313e3f75e31824f58d19ab24c6611fb4c75140a7cadc3c166f68819547c1d0ff7f7d13f5d8ae30dff1d80e2aa4 +b6e3e830b15039d3e28b08f5465bb089eade11ee3bd80afe39e010df7db1fcf0c56d698717677a41ddbc91eeaf6544d3 +95e928e6dfff51351281568ae72da7d1edeb6e9fe01f30af0499e7505ba35a22b5bb919d41bb809a432dce83f3977663 +aabeeb60ca46f9b0232ff82ea7766dcab8cc5aaf9d23539f30174f9486640bc9312868ca493b59b314519fc399973e47 +b393a11e957d0bbb3ecf617b075b5906a3450b348e62916c04791b366f0a7397cccd6648440ac544bc30526e1f95aad8 +abb5bfc3964a6d246da60bd809d0ea6daf4f8222efdc12ceb6730194e85f413ee7eb03bae300abf7ea900dbbc3d08971 +96c1bd1d1d216a4bfbcf000c123f296c0d31e1684e9e3884c14df23bf528c8d599f82bb98fcea491716b617216a8e0be +92d1e570a56f1741fd9f3d9f488cc336421c6256c14a08d340a63720be49b0029e3780e3e193a2e22bf66cc652fa22a3 +8769c08551e3a730e46f8e5d0db9cf38e565a001dfb50db3c30fa7fa0e98b19438edc23c6e03c8c144581b720d7b33a4 +b850bd67fdf5d77d9288680b2f6b3bc0f210580447fb6c404eb01139a43fccb7ed20051999ae2323ea5a58de9676bfb4 +80285da7a0aaf72c4528a137182d89a4db22a446e6c4a488cf3411937f4e83f7b00ec7549b0b4417682e283f91225dfe +80520368a80b97d80feb09dbc6908096c40ff7120f415702c1614d7112b0b57f6729581c71f4a3ce794ac959a46494ff +9817b4c27a490b1cd5a6337e7bc7e8005fa075dd980c6bf075ddfa46cd51cc307ad1d9f24e613b762a20fc6c877eab41 +ad66bda1a3034ec5e420b78107896ecf36126ce3ef9705163db259072dfa438c6107717a33572272062b9f60cb89557c +876114ef078c2915288e29c9abe6b0ad6a756b5ee2930ba1b8a17257f3f0557602d1225e8aa41ce8606af71ada2a971b +aa3d6cde4c3b9d3d5d0c77a33e67f182a3e1cf89b0921423b2024236171955b34afc52b1f25b1dad9da9b001371771d7 +984d3e3a72412d290e3459339757af7520d1739c7af0cbcf659c71999328db44f407d92e8a69fea11625612c49eac927 +ae890d0faf5bd3280dcad20a5f90e23a206661be8842375fea2ab22aadc500849ffbc52fe743b376d46bb926cedae6a6 +b1f231f3f4d710c3fe80099faeb56dac67c1baf53b8fe67a9920fe4f90e52cb9a4bf19211249a6456613b28efe337f18 +8caa54b418ba609d16520af3dff2e96d5f2eeb162c065a1763beb926547b2cfb3ae41d738db2c5681a9bc8bc9e6b9a1a +932157ff56c5ac29cf6cf44f450c882b3acfbb9f43d12d118da3d6256bde4e6eb3183aea304ab6967f37baa718ffec99 +9360bed8fc5b6aac36aa69473040689bfc30411d20ffb7275ef39b9ff5789f9055d149383ce9f0f7709a1f9d683adbfe +98b5b33209068335da72782179d0c7aeeabe94b5560a19d72088fe8323e56db7ce65debe37a97536b6b8a0ca3b840b61 +89a385c11be40064160b030a1bb28c3921fc8078522618a238c7ea0f86f34717ed9af9b4e2e20f5128e5f7fc66ad841e +b615703cbc64b4192990cc7e4903b74aed6a0076ce113b59ef7719197ffa46fb29eb78ca56b49873487432d0625c0faa +90f0d77abae9d3ad73a218e5ccec505ad108ea098451461567ae8ef9661606ca8e78df53b5d628b20b7037bd24622330 +92e0e7cc4dfadc5fa0ee6da0c8de0493030db6e54ba0317f52f232a6708b732068b6077bd13a17eb7eb40b88368085b5 +a24dad20094985bfccc6df1343506ed3bf9dcbdf4b2085a87627a5d71f7568db067304e465f8f380c5c88e8a27291a01 +8629a45a10619354c84bdc2f6c42f540eab5a46f53f2ae11970433d7a2aef007897590bf31dfba1c921614c6d6fe1687 +84ac64040d4206f82b08c771f375da4b7d752e41d2aa0da20ce845f6bc1b880a855d3ee966bca19b8ec327b4b43e7f0e +9608e6050c25996c052509f43f24a85cdf184135f46eaac520a9a6e78e0d44a6cee50ebc054048c708aefde8cd6651c2 +a32032b0e0d7cc35e480c328f315327f9385adb102a708c9ba637878deb74582ae26bb6d6e5f8c9e3a839b0e0154b82a +b7e3c78d63acc6564a49e9f00b0a820b56d4f37a2374af1f7f1d016268011df9e7af0670ed2b0eee961f15aa948328dd +8b88bfdd353acc91ad0d308a43e5fb40da22c228f2fe093c6d6904d70f69c6203f56636ed898b05df51d33f1095ef609 +b1d7a430c51fc857af55047683fc18c453b013527196c5e1bf776819a3dffca802217e9249ae03f084e2ea03ad67fcc2 +80558e28a819ddb5e72e97c54be0f57c173ccf78038d360d190b7f1350a19577b8e3f43fa2f7bf113a228cd3b965b2e4 +b4b2ec44e746c00dfc5661ba2514930934fc805cdc29adc531c02d28ce3cc754414b0485d4ee593232cd1175f357ad66 +b57cee5d32835f76572330f61ccd25a203f0e4a7e5053d32965db283aad92f287645533e8e615137208383ec51b1fd99 +930256086b419a8a6581c52590d0dbd9f8a3564c79424198fca3866b786df2f6098a18c50dc4abd20853a7184b1ce15d +8e75fd01181cffcd618a983492390f486e8c889972a46c1f34a4e1b38f384e8e4efc7e3c18533aa2057da9f9623e2238 +b375d927dd988429f9e2764e5943916131092c394fce13b311baa10f34b023dd3571da02553176091a0738cc23771b9a +b9e28e4c0d0477518034d000e32464852e6951c8db6f64ccdb1d2566f5094716213fbf2fc0e29ac88d0e79f725e3c926 +963981e99392afbd2b8318d5a6b2b0cc69c7f2f2f13f4b38dddbfedb2b0eaf0584aecfcbda20a4c60789c15d77970a58 +a7804e1977aa77c263c7c001afa6cf568032dea940e350d6a58ce4614f1a91c13ae1c78bfea740c229dce2444556976a +8787204177da3cde6d35cd3497fa8774d244f9faa9f4bd91b636a613a32ce2ea0326378cf9c4cf475e73ef751b355c4b +895aeef46a07152a04ec812f1aa1fd431389fa0ef6c6e96a5b833e70ea14073bc9984757a8ee456dbec9788e74e6f0ca +8d17f0e5826783440d1f0ec868003510a4d9952bfe4a638e44a36d94482ac18ba70ef7ff773bdf7a3b62d714dcf0fcba +810d5e36b31310b2e054a666d3b3f7ed16dfcb1765532d87ca2a3920316f0187303c27dd113db145d47e8961062a6c03 +b4e2fb48ae04cf8580bb6a28095076c9b95e5f13122b917328f334d4ac8a8648ce442919e28319a40148987350ab5303 +b85549a313544fa1eb3ceb78473b7d3d717fc85b808de7b79db7dbd0af838ebb020622a7503f1cbacab688dddb648f84 +80665adee057088eae827a5fe904ec3ad77d8843cdce0322d535e0659b4abc74a4d7ddd8a94c27f2def5c34ac2c038ee +ad72fc19c2ce99b5b717e35528fe7d3ac8add340b02ebeb4889d9a94c32f312a0b45ea84d21c54f84cc40ee4958b72e1 +99d530c843dff89a47a5ee8c87303ab18f8a82b0d5b808fca050354b35da5c5a5594d55921c6362d6cc917d75bdc18dc +99c7286c293e1be21c5b2a669dfdfcd5aa587105d2886fc5a8eaf8984da4e907f7d7b8c2362d64a4f1621b077a2a08a0 +b4a39e1a9ed5d80c9563c3ca3fadf76f5478c63a98f4346a61b930c9c733e002f3ff02bc16abfdb53d776184cc3f87ba +9378ea71b941979404c92d01fb70b33fa68d085bf15d60eb1c9fc2b5fcdee6379f5583389a3660a756a50019a2f19a69 +b68e17344a2bc45b8e2e19466b86dc139afefbf9bad2e2e28276a725099ebac7f5763f3cb52002261e3abe45ef51eb1a +819e64dc412b2d194d693b9b3157c1070a226af35c629837df145ea12ad52fa8eabd65b025a63c1fb0726207a58cdde8 +a5e8ff8748419466ff6df5d389125f3d46aedacf44eaf12cbfe2f68d218c7d5ab6de4a8279d13aecc25f3b1d98230894 +91560d54a9715cfda9cf7133ae51c432d0bf7fcbaeb468004994e6838bfc5ddcfa30e4e780667d0c4c0376780b083017 +ae8adb3309cc89d79a55ff74f129bb311fe4f5351a8b87600a87e0c3ba60825f71fccf67eadcf7e4b243c619417540fd +8d92cc1a6baa7bfa96fbce9940e7187b3d142f1888bdcb09bb5c8abf63355e9fb942ac4b4819d9be0e0e822d3e8e2e08 +a6e8b79fdd90c34735bb8fbef02165ccbe55ea726dc203b15e7a015bf311c9cac56efd84d221cc55eaa710ee749dbdfe +a409b151de37bddf39ce5f8aa3def60ee91d6f03ddd533fce9bf7bdbeac618cc982c4f1ffbf6e302b8353d8f28f8c479 +b9693975ef82171b3b9fc318ca296e4fe6110b26cbdfd653418f7754563fa7b6e22d64f8025ee4243483fa321572bfe4 +a039ebe0d9ee4a03ade08e2104ffd7169975b224061924cca2aae71464d250851e9f5f6f6cb288b5bf15df9e252712a6 +b27834db422395bd330e53736a001341ce02c9b148c277dabac67dc422741bfa983c28d47c27e8214cd861f2bad8c6f6 +a2bafaf4e2daf629fd27d7d5ac09fb5efc930ff2ae610f37519808683aa583fe1c6f37207daf73de1d8a164f79a0c981 +b856cee1cfcf5e50db9af4ab0aed3db2f43c936eaea369b5bba65582f61f383c285efbda97b1c068c5d230cbe94f7722 +a61ab205554c0550fa267e46a3d454cd1b0a631646b3df140623ff1bfffaa118e9abe6b62814968cc2a506e9c03ea9a0 +8c78edcd106377b9cbdfa2abd5278724aed0d9e4ae5869b5d2b568fdabb7804c953bae96294fcc70ef3cd52ba2cbe4ed +8570869a9bbf6cc84966545a36586a60be4d694839f367b73dfc40b5f623fc4e246b39b9a3090694aa2e17e652d07fd1 +a905b82c4da8d866a894da72315a95dc98faa3c7b3d809aef18f3b2be4801e736a1b79a406179e8cac8f74d27e71ac52 +a8eb8679ff1a64908515f6720ff69434cb33d63aeb22d565fde506618908b1d37585e3bd4d044fd0838b55787af06b42 +af4d86b2fbd1684a657dffe4210321a71e6ae560c144d44668d1f324dc9630e98348c3d444622a689327c1a59cc169dd +80359c6eab16954559ab0e6a1fee9a0526c45d3cae1a371159a2e3aa9b893afdc3a785c9559a5fd9cd8cd774234bf819 +8d4e5ff81eb5d17bbe8ae6416538ca51a9427ce142b311f5cbb14febbbbb9c1ffc6489fd625b9266264c366c12a9d997 +92e181c66489c5fa063ba2a1a354b6fd3439b8b4365a8c90e42e169bfaa1fb5766bf3e0fe804399d18bc8fbcafb5c3b1 +a9ddf229360a095393885083716cb69c819b2d7cfb100e459c2e6beb999ff04446d1e4a0534832ae3b178cbe29f4f1d3 +8e085ef7d919302a1cc797857b75cff194bdbc1c5216434fa808c3dea0cf666f39d9b00f6d12b409693d7a9bd50a912c +916dc4dc89e5e6acf69e4485a09fc66968f9b292eac61a146df1b750aa3da2425a0743d492179f90a543a0d4cd72c980 +b9cbf17e32c43d7863150d4811b974882da338cf0ed1313765b431b89457021dd1e421eeaa52840ef00551bb630962dc +a6fb875786daec1a91484481787093d8d691dd07e15c9c0c6ae0404bf9dc26083ed15d03c6d3fe03e29f28e20da21269 +a870fcb54b9a029e8086de9b08da8782c64ad2cc2e7fdf955b913d294038bb8136193256b85267e75a4ca205808a76b4 +99883f057e09b88bf0e316f9814c091837fd5c26eeb16fec108c9fed4b7a2bd1c783dac0e4242b5a906621ab606c1e50 +85d89069ca3190577dab39bbec43c16bf6dbca439ad3eebd8f5e9f507d84c3c43e77fd6323224582566a3aa2c8018951 +9363ba219e0003f6e8a9d8937b9e1449e4b2c5cd57194563b758bea39deab88778e8f8e4f7816970a617fb077e1e1d42 +820622f25553c035326145c1d2d537dc9cfd064c2f5bdf6d4ec97814de5fe9a0fbd443345fa2ea0a9d40d81d3936aa56 +87e31110aaf447e70c3316459250e4f7f8c24420c97828f9eb33b22107542c5535bdb48b0e58682dd842edea2886ff08 +95bf80cac6f42029d843d1246588acb40a74802f9e94b2bf69b1833936767e701ef7b0e099e22ab9f20f8c0c4a794b6c +a46ecf612b2763d099b27fb814bd8fdbaee51d6b9ac277ad6f28350b843ce91d701371adfaaf4509400dc11628089b58 +8604decf299fb17e073969708be5befeb1090ab688ad9f3f97a0847a40ea9a11bbcfc7a91e8dc27bc67a155123f3bd02 +8eb765c8dc509061825f3688cb2d78b6fef90cf44db33783d256f09be284bc7282205279725b78882688a514247c4976 +b5c30b2244fa109d66b3a5270b178960fdec47d31e63db0b374b80d2b626409eb76d2e8d1ebf47ef96c166743032fc5e +aab01e76290a7e936989530221646160bf8f64e61e79282e980c8c5dcaaa805ff096efd01d075a2c75917a3f4bf15041 +b9d79671debd0b83d0c7c7c3e64c0fb1274300564b262771f839b49218501e7f38ef80cae1f7e5a3c34acdc74c89dab6 +92c0eaceadf036b3b9dfd2712013aba3dd7c30b7760f501f52141618265baa31840fe77850a7014dc528f71f8cf39ce6 +b3cdd098059980455dd5b1c04182df1bd12fa844a866f02a9f8a86aab95b59945baa9af99f687410bffc5b07153cb23c +b361b73a62f71256b7f6ea8e0f6615e14fc5a06ee98b928ab3c9dd3eef9d9d30070e9855c82b7facb639cacb3401e01f +b9c85fc0f25a3271cf28b1ca900078eaaa66cbab0a3e677606e898ac32781a2dfce4d9cbd07404599e2c3c02fa161c9d +ac5b4fdac2a0b2e6430d9fc72bde4249d72183b197fc7347bb1546ae6f544426686bbe0caec3ee973b6836da5e831c44 +b675aebf24b92e398e166f171a6df442b3f5919b6bee192f31675a5e8eeb77d34c6590a6f0c0857417e0f78cfb085db8 +a9bef942044d8d62e6a40169f7dc7b49e40cd0d77f8678dd7c7bae6f46c46786f9b1e319a3fa408f22a54fd2a4d70804 +a20d19cd917d5102ae9ca0cf532127d2b953aa3303310e8a8c4b3da025dded993a47e3a28e6b02acfadb6d65dc2d41a3 +a47fdb04059b83b2afb86a47b2368bbd7247c337a36d3333b6e5ef2cc9476a92c4907e4c58a845c9ef9b497621e0b714 +94a9e9ffc14b411e11a4ffa59878d59460263589003dc7b6915247c549f67feede279bf3645fdd92379022fb21e3caeb +b92e1177dd9ecdaf1370c71b14954219cf0851f309bc216d5907a4e2e84e0df3457018224150c142cc6bf86644bb4b73 +8bc57fadd68a265b7df9b42227a9c0968db7b1bb50dc12f7d755505779f1ff2c408672b3091e903366acc9ce15d19fb6 +b6b5efbe1ac4e1bd2e8447c45000d09397b772ca5496acc447b881022608a41c4f60388814607a01890190105bee7be3 +95f7c85fd614df968f8ccf8d086579c9e1cec4644ecf06da26e3511cb39635a7326b3cec47bd51cf5646f1c660425e9c +b81765fb319bcdc74b4d608383ccb4af7dd84413b23af637be12e2827a75f7e4bcd14441cf979ed9038ae366fbb6f022 +a120ea76cda8c6c50c97035078f6648afe6537809bdba26e7c9e61de8f3070d2347160f9d34010effbf2ec7e94f5749f +92c1b8631953b40d3cc77eee2c72a064b999c09a9b92c11d8fa7b4072966273901c9dba25f9f79f384d9f11a56f3fc7a +a4b00dc0ab67b2300abc9c516e34daf444d6497b066a90cfe3381ed2812304ed37b14f3b948990443dc6c1cf1bed460c +a9e9f7e13c9f031bc7b9e6f1417c7abcc38894fe7d3f54869ee277afd2efa3e6fb50757dd36c8c94d591e0abdea322cc +84f3e98f831792b5ad14bcfe62a4c9f296476c6087c4c1ec7767fc642fbca141ff6a3deeb8b4d4106a9cda5a9937eea0 +8eb1a7931bbea9a714226fd74b0100ab88355287d9b0a349c095e9b5809b98f237ffd706bce7d67a770da355fb9cec7b +9738ef8739e1742c1f26b51a1621be0b89d37406a370c531e236f635c7064c661818817bb3858908986aa687b28b21be +a9cf3ce8501b003ccaf57552a4c4ec31081e44526d3aa3791d3dc4a7e438a357c0956f93c500356186d8fd4588ffac5e +a7af6a219cca59225839a9de5b19263cb23d75557d448bc7d677b62591a2e068c45e5f4457cceb3e9efa01d0601fc18a +972a24ece5eda7692cbb6fb727f92740451bc1281835e2a02931b2b05824a16b01dbe5edd03a0ed5b441ff25a5cc0188 +b21d1ec7597ce95a42f759c9a8d79c8275d7e29047a22e08150f0f65014702f10b7edce8c03f6e7ab578ce8c3b0ec665 +a13a1c7df341bd689e1f8116b7afc149c1ef39161e778aa7903e3df2569356ad31834fa58ceb191485585ce5ef6835c3 +a57bdb08119dc3bc089b5b2b5383455c4de0c2fcdac2dcfa21c7ac5071a61635ff83eceb7412f53fab42d1a01991de32 +b2968748fa4a6921ee752d97aa225d289f599a7db7a222450e69706533573ded450380c87f8cdd4a8b8c8db1b42b5c97 +8718ec04e0d5f38e3034ecd2f13dfde840add500f43a5e13457a1c73db0d18138f938690c8c315b5bcbeb51e8b9a2781 +82094789e26c4a04f2f30bdb97b9aecca9b756cbd28d22ab3c8bed8afc5b2963340ddfc5a5f505e679bf058cbc5dcbb8 +a35b8a566dd6ab67eddc2467906bffc76c345d508e52e9e4bb407b4f2b2c5f39b31d5a4bf5022f87bf7181dc6be2fe41 +a8c93b1e893d4777c0e3a1b4bef3be90c215781501407c4011457fc3240e13524b4d2bea64a6d0a3efe3f3b0dae9b8ab +877095ad18b1e5870818f7a606127ba1736a0b55b0dbcd281ec307c84b08afc0c9117e3a880fe48bfc225fbf37671a97 +84405ee0421ed2db1add3593df8426a9c1fcc8063e875f5311a917febc193748678dd63171d0c21665fb68b6d786c378 +a52cdc8209c3c310bed15a5db260c4f4d4857f19c10e4c4a4cfe9dfc324dfac851421bb801509cf8147f65068d21603c +8f8a028a70dda7285b664722387666274db92230b09b0672f1ead0d778cee79aae60688c3dfd3a8ed1efdeda5784c9d4 +a0be42fecc86f245a45a8ed132d6efc4a0c4e404e1880d14601f5dce3f1c087d8480bad850d18b61629cf0d7b98e0ae0 +83d157445fc45cb963b063f11085746e93ab40ece64648d3d05e33e686770c035022c14fdf3024b32b321abf498689ad +8a72bbf5a732e2d4f02e05f311027c509f228aef3561fc5edac3ef4f93313845d3a9f43c69f42e36f508efcc64a20be0 +b9ca29b0ec8e41c6a02f54d8c16aebf377982488cbe2ed1753090f2db4f804f6269af03e015d647a82ef06ffaa8cba6c +b4df3858d61bbb5ded1cf0be22a79df65ae956e961fbb56c883e1881c4c21fe642e3f5a0c108a882e553ac59595e3241 +86457d8890ac8858d7bab180ef66851247c2bf5e52bf69a4051d1d015252c389684fcc30bb4b664d42fbf670574ab3a3 +86d5576ea6dfa06d9ebce4cd885450f270c88a283e1e0d29cab27851c14ed2f00355e167b52e1539f1218ad11d8f13dd +883ad1364dc2a92388bfafaa9bc943c55b2f813525831e817a6208c666829a40455dde494eba054b2495a95f7ce69e8a +8942371e6925231c2c603b5f5a882d8404d39f0c7c4232557c2610b21c2c07f145466da798ea78b7932da2b774aa3128 +a799eb71496783cc7faf12c9d9804bf6180699a004b2f07fc5cc36840f63ce7eee7dde9275819a9aa3f8d92dc0d47557 +8eb3fb5c769548ee38c7882f51b959c5d5a42b5935269ccf987d6ddbb25a206e80c6000bcc328af149e0727c0b7c02c0 +8f3910d64e421a8f2d8db4c7b352ba5b3fc519d5663973fea5962efe4364fb74448770df944ef37ffe0382648fb56946 +b41413e0c26ff124cf334dab0dc8e538293d8d519d11cc2d10895a96b2064ac60c7da39f08589b38726cffa4c3f0bfef +b46ef2eb10abae0f35fa4c9c7ee2665e8044b8d9f91988a241da40fd5bbc63166925582151941b400006e28bbc5ba22a +b8baa8b4c420bb572a3b6b85479b67d994c49a7ebfe1274687d946a0d0b36dfed7630cfb897350fa166f5e2eff8f9809 +964b46d359c687e0dcfbdab0c2797fc2bd1042af79b7418795b43d32ffca4de89358cee97b9b30401392ff54c7834f9f +8410d0203d382ebf07f200fd02c89b80676957b31d561b76563e4412bebce42ca7cafe795039f46baf5e701171360a85 +b1a8d5d473c1a912ed88ea5cfa37c2aea5c459967546d8f2f5177e04e0813b8d875b525a79c29cb3009c20e7e7292626 +afaab9a1637429251d075e0ba883380043eaf668e001f16d36737028fded6faa6eeed6b5bb340f710961cee1f8801c41 +aef17650003b5185d28d1e2306b2f304279da50925f2704a6a3a68312f29fe5c2f2939f14e08b0ba9dee06ea950ad001 +97bcc442f370804aa4c48c2f8318d6f3452da8389af9335e187482d2e2b83b9382e5c297dce1a0f02935e227b74e09a3 +8a67a27b199f0bcd02d52a3e32f9b76a486b830ec481a49a4e11807e98408b7052b48581b5dd9f0b3e93052ec45dfb68 +b113bf15f430923c9805a5df2709082ab92dcdf686431bbad8c5888ca71cc749290fa4d4388a955c6d6ee3a3b9bc3c53 +8629ca24440740ce86c212afed406026f4ea077e7aa369c4151b6fa57bca7f33f9d026900e5e6e681ae669fd2bd6c186 +933a528371dcecc1ec6ded66b1c7b516bd691b3b8f127c13f948bfbcda3f2c774c7e4a8fbee72139c152064232103bdf +8568ddd01f81a4df34e5fa69c7f4bb8c3c04274147498156aec2e3bd98ea3e57c8a23503925de8fa3de4184563a2b79e +8160874ec030f30fda8f55bcf62613994ff7ed831e4901c7560eac647182b4a9b43bfaff74b916602b9d6ae3bfcaf929 +ae71c48d48cf9459800cdf9f8e96bc22e2d4e37259e5c92a2b24fbe2c6ca42675e312288603c81762f6ceb15400bc4c9 +b05f39bb83fda73e0559db1fd4a71423938a87ad9f060d616d4f4a6c64bf99472a2cbfb95f88b9257c9630fc21a0b81f +80c8479a640ed7a39e67f2db5ad8dfd28979f5443e8e6c23da8087fc24134d4b9e7c94320ffa4154163270f621188c27 +9969ba20ee29c64cb3285a3433a7e56a0fe4ddc6f3d93e147f49fe021bed4a9315266ebb2fb0eb3036bb02001ae015e6 +a198c89fef2ab88e498703b9021becc940a80e32eb897563d65db57cc714eaa0e79092b09dd3a84cfab199250186edcc +8df14a3db8fe558a54d6120bad87405ba9415a92b08c498812c20416c291b09fed33d1e2fcf698eb14471f451e396089 +81e245ef2649b8a5c8d4b27188dd7e985ef6639090bdc03462c081396cf7fc86ed7d01bfe7e649d2b399255e842bdc21 +8659f622c7ab7b40061bcf7a10144b51ad3ab5348567195924f2944e8c4ce137a37f1ba328e4716c10806f3fb7271689 +a575d610fc8fe09334ca619ecdadf02d468ca71dd158a5a913252ca55ea8d8f9ce4548937c239b9cb8ab752a4d5af24a +94744549cd9f29d99f4c8c663997bdfa90e975b31f1086214245de9c87b0c32209f515a0de64d72d5ef49c09b0a031fa +80a8677862b056df59e350c967a27436c671b65d58854e100115bac9824ba177e94c2a1bfcaa191a071b9cefdbee3989 +91be9a5504ec99922440f92a43fe97ddce2f21b9d94cd3a94c085a89b70c903696cec203bbab6d0a70693ba4e558fb01 +8c5a0087bcd370734d12d9b3ab7bc19e9a336d4b49fc42825b2bfedcd73bb85eb47bf8bb8552b9097cc0790e8134d08c +933aa9e6bd86df5d043e0577a48e17eea3352e23befdbb7d7dcac33b5703d5ace230443ac0a40e23bf95da4cc2313478 +984b7ee4bd081ee06c484db6114c2ce0ba356988efb90f4c46ff85ed2865fb37f56a730166c29ef0ae3345a39cdeae7a +ae830f908ea60276c6c949fb8813e2386cf8d1df26dcf8206aa8c849e4467243e074471380ed433465dc8925c138ea4c +874c1df98d45b510b4f22feff46a7e8ed22cfc3fad2ac4094b53b9e6477c8dfc604976ca3cee16c07906dece471aa6c6 +a603eb60d4c0fb90fa000d2913689126849c0261e6a8649218270e22a994902965a4e7f8c9462447259495fe17296093 +a7c73d759a8ad5e3a64c6d050740d444e8d6b6c9ade6fb31cb660fa93dc4a79091230baccb51c888da05c28cb26f6f3f +a4411b79b6a85c79ea173bd9c23d49d19e736475f3d7d53213c5349ebb94a266d510d12ba52b2ac7a62deaaaec7339b8 +943b84f8bbcee53b06266b5c4cd24d649d972593837fe82b0bf5d5e1bbc1a2bf148e1426c366d7c39ab566b10224cadc +8300012096a8b4cefecc080054bf3ceb0918162ba263c6848860423407796b5eb517170c0bad8e4905ac69a383055a21 +8244a1e3ad41908c6f037e2f8db052e81f281646141334829f36c707f307448b9ab79a7f382a1e8d86f877c90b59271c +8eca1b74687802ecc36a5d39e4516a9dee3de61a2047252d9ed737b49e0090c386e9d792ac004c96337681c7f29a16ad +b70fa47535f0524835039a20036c61e77f66146ad79d3d339214d8744742db41ceeb577c829d000011aeafbb12e09579 +84b3abbce48689f3adbb99889c7fd1f3e15ab455d477e34f5151c5c1c358ed77a5b6a581879f7e0f1f34106e0792e547 +ab45ecb58c0ef0dbce3d16afc6ac281e0d90ec48741ea96a141152647e98fcc87f3a3ff07ba81f3179118453ce123156 +90d231a145ba36a59087e259bbfc019fa369201fcfeaa4347d5fd0a22cd8a716e5a797f3cc357f2779edb08f3b666169 +a4f6074d23c6c97e00130bc05f25213ca4fa76c69ca1ace9dece904a2bdd9d987661f5d55023b50028c444af47ff7a08 +933af884939ad0241f3f1f8e8be65f91d77ac0fb234e1134d92713b7cfb927f1933f164aec39177daa13b39c1370fac8 +80d1db6933ce72091332ae47dc691acb2a9038f1239327b26d08ea9d40aa8f2e44410bbda64f2842a398cbe8f74f770f +a7a08605be2241ccc00151b00b3196d9c0717c4150909a2e9cd05538781231762b6cc6994bebbd4cddae7164d048e7b2 +96db0d839765a8fdbbac03430fa800519e11e06c9b402039e9ae8b6503840c7ecac44123df37e3d220ac03e77612f4e4 +96d70f8e9acd5a3151a8a9100ad94f16c289a31d61df681c23b17f21749c9062622d0a90f6d12c52397b609c6e997f76 +8cf8e22273f7459396ff674749ab7e24c94fe8ab36d45d8235e83be98d556f2b8668ba3a4ec1cb98fac3c0925335c295 +97b7e796a822262abc1a1f5a54cb72a1ea12c6c5824ac34cd1310be02d858a3c3aa56a80f340439b60d100e59c25097d +a48208328b08769737aa1a30482563a4a052aea736539eceab148fa6653a80cb6a80542e8b453f1f92a33d0480c20961 +b612184941413fd6c85ff6aa517b58303b9938958aa85a85911e53ed308778624d77eadb27ccf970573e25d3dfd83df7 +b3717068011648c7d03bbd1e2fc9521a86d2c3ae69113d732c2468880a3b932ebec93596957026477b02842ed71a331b +a0ad363e1352dcf035b03830fef4e27d5fd6481d29d5e8c9d51e851e3862d63cdcbaf8e330d61c1b90886921dac2c6fd +8db409fdacfa4bfdaf01cc87c8e97b53ca3a6e3a526d794eaad1c2023f3df4b888f1bf19fee9a990fe6d5c7c3063f30c +b34d6975310ab15938b75ef15020a165fc849949065d32d912554b51ffa1d3f428a6d1a396cb9329367670391de33842 +9117285e9e6762853fc074b8a92b3923864de2c88c13cea7bab574aaf8cdd324843455d2c3f83c00f91f27c7ecc5592a +b4b2e8f190ea0b60819894710c866bf8578dd1b231ae701d430797cc7ede6e216e8ca6a304f3af9484061563645bf2ab +8c493c6853ab135d96a464815dd06cad8b3e8b163849cdefc23d1f20211685753b3d3e147be43e61e92e35d35a0a0697 +9864d7880f778c42d33cf102c425e380d999d55a975a29c2774cad920dfddb80087a446c4f32ed9a6ab5f22ec6f82af0 +90f67fe26f11ca13e0c72b2c2798c0d0569ed6bc4ce5bbaf517c096e7296d5dd5685a25012f6c6d579af5b4f5d400b37 +a228872348966f26e28a962af32e8fa7388d04bc07cfc0224a12be10757ac7ab16a3387c0b8318fcb0c67384b0e8c1a4 +a9d9d64bba3c03b51acf70aeb746a2712ddafe3b3667ae3c25622df377c2b5504e7ab598263bec835ab972283c9a168b +932128971c9d333f32939a1b46c4f7cf7e9d8417bd08dc5bd4573ccbd6ec5b460ac8880fb7f142f7ef8a40eef76d0c6d +964115e7838f2f197d6f09c06fbb2301d6e27c0ecdf208350cf3b36c748436dac50f47f9f9ac651c09ab7ad7221c7e43 +a5941f619e5f55a9cf6e7f1499b1f1bcddcc7cf5e274efedaaad73a75bc71b1fc5c29cd903f6c69dc9a366a6933ca9d1 +a154bf5eaec096029e5fe7c8bf6c695ae51ace356bb1ad234747776c7e1b406dee2d58864c3f4af84ed69f310974125e +b504e6209d48b0338ab1e4bdab663bac343bb6e0433466b70e49dc4464c1ec05f4a98111fd4450393607510ae467c915 +813411918ea79bdde295393284dc378b9bdc6cfcb34678b9733ea8c041ac9a32c1e7906e814887469f2c1e39287e80f8 +8be0369f94e4d72c561e6edb891755368660208853988647c55a8eed60275f2dd6ee27db976de6ecf54ac5c66aaf0ae6 +a7e2701e55b1e7ea9294994c8ad1c080db06a6fc8710cd0c9f804195dce2a97661c566089c80652f27b39018f774f85e +956b537703133b6ddf620d873eac67af058805a8cc4beb70f9c16c6787bf3cc9765e430d57a84a4c3c9fbdd11a007257 +835ae5b3bb3ee5e52e048626e3ddaa49e28a65cb94b7ecdc2e272ff603b7058f1f90b4c75b4b9558f23851f1a5547a35 +85d67c371d1bf6dc72cca7887fa7c886ce988b5d77dc176d767be3205e80f6af2204d6530f7060b1f65d360a0eaeff30 +a84a6647a10fcef8353769ef5f55a701c53870054691a6e9d7e748cbe417b3b41dbb881bae67adc12cb6596c0d8be376 +87ffe271fc0964cb225551c7a61008d8bcb8b3d3942970dbcc2b9f4f9045a767971880368ea254e2038a3a0b94ecf236 +964bb721c51d43ee7dd67c1a2b7dd2cc672ce8fad78c22dcddb43e6aab48d9a4a7dc595d702aa54a6fb0ffabf01f2780 +a89b3f84bb7dcbe3741749776f5b78a269f6b1bebb8e95d3cc80b834fd2177c6be058d16cacfd0d5e1e35e85cde8b811 +b4314538e003a1587b5592ff07355ea03239f17e75c49d51f32babe8e048b90b046a73357bcb9ce382d3e8fbe2f8e68b +86daf4bf201ae5537b5d4f4d734ed2934b9cf74de30513e3280402078f1787871b6973aa60f75858bdf696f19935a0e2 +b1adf5d4f83f089dc4f5dae9dbd215322fa98c964e2eaa409bf8ca3fa5c627880a014ed209492c3894b3df1c117236c4 +b508d52382c5bac5749bc8c89f70c650bb2ed3ef9dc99619468c387c1b6c9ff530a906dfa393f78f34c4f2f31478508a +a8349a5865cb1f191bebb845dfbc25c747681d769dbffd40d8cedf9c9a62fa2cbc14b64bb6121120dab4e24bef8e6b37 +af0500d4af99c83db8890a25f0be1de267a382ec5e9835e2f3503e1bac9412acf9ff83a7b9385708ef8187a38a37bc77 +b76d57a1c1f85b8a8e1722a47057b4c572800957a6b48882d1fc21309c2e45f648a8db0fcff760d1dbc7732cf37c009b +b93c996cec0d3714667b5a5a5f7c05a7dc00bbc9f95ac8e310626b9e41ae4cc5707fac3e5bd86e1e1f2f6d9627b0da94 +93216fdb864217b4c761090a0921cf8d42649ab7c4da1e009ec5450432564cb5a06cb6e8678579202d3985bd9e941cef +8b8be41105186a339987ae3a5f075fbc91f34b9984d222dfed0f0f85d2f684b56a56ab5dc812a411570491743d6c8b18 +959b72782a6b2469e77fe4d492674cc51db148119b0671bd5d1765715f49fa8a87e907646671161586e84979ef16d631 +86b7fc72fb7e7904ea71d5e66ba0d5d898ace7850985c8cc4a1c4902c5bf94351d23ce62eed45e24321fb02adfa49fc8 +a2f244e7c9aa272cb0d067d81d25e5a3045b80b5a520b49fd5996ece267a7f1bea42e53147bbf153d9af215ea605fc9e +81aa2efa5520eebc894ce909ba5ce3250f2d96baa5f4f186a0637a1eea0080dd3a96c2f9fadf92262c1c5566ddb79bab +b607dd110cfe510d087bcff9a18480ba2912662256d0ab7b1d8120b22db4ad036b2266f46152754664c4e08d0fc583f6 +8f588d5f4837e41312744caac5eee9ddc3ad7085871041694f0b5813edf83dc13af7970f7c9b6d234a886e07fa676a04 +924921b903207783b31016cbec4e6c99e70f5244e775755c90d03a8b769738be3ba61577aca70f706a9c2b80040c9485 +ae0a42a222f1a71cd0d3c69ffb2f04c13e1940cce8efabe032629f650be3ceed6abb79651dbb81cb39a33286eb517639 +a07d7d76460f31f5f0e32e40a5ea908d9d2aebf111ac4fadee67ef6540b916733c35a777dcdc05f6417726ca1f2d57dd +88d7f8a31f8c99794291847d28745e5d0b5d3b9684ca4170b686ffbb5bb521a3ef6746c3c8db22e4250a0cdff7939d96 +849573071fd98c020dc9a8622a9eff221cb9f889bde259e7127a8886b73bef7ad430b87750915658918dcfb6b7b4d8d3 +b12d59f732fa47fad175d6263734da8db89230fd340a46ad1cdee51e577041a5c80bf24cd195593e637daf1a66ef5a98 +abbcfb8a4a6d5e269ee1ac5e277df84416c73ca55ec88317f73608201af25af0cb65b943c54684a5651df3a26e3daca2 +ab157f589bdbaf067a6a7ba7513df0492933855d39f3a081196cf2352e0ddc0162d476c433320366e3df601e0556278d +a86c0619b92e5ae4f7daa876a2abc5ba189156afc2fa05eef464dfa342ba37fc670d0dc308ad3822fcb461ab001bac30 +a3f292946476cfe8d5e544a5325439a00e0165a5f9bf3bb6a53f477baeac7697cc0377745536681aa116f326ce911390 +8aecbbfd442a6a0f01c1c09db5d9d50213eb6f1ff6fab674cde3da06a4edff3ed317e804f78300c22ef70c336123e05d +834ed4b58211fcd647d7bf7c0a3ba9085184c5c856b085e8a0fcd5215c661ef43d36f3f0f6329a9f1370501b4e73b6e4 +a114ea5ad2b402a0de6105e5730907f2f1e458d28ae35144cf49836e0ad21325fe3e755cfb67984ae0a32e65402aad1e +a005f12bed97d71cee288b59afe9affb4d256888727343944a99913980df2c963fe02f218e6ea992f88db693a4498066 +a010f286ab06b966e3b91ff8f1bdbe2fe9ab41a27bc392d5787aa02a46e5080e58c62c7d907818caae9f6a8b8123e381 +857bd6df2ddef04dbc7c4f923e0b1696d3016c8bfed07fdfa28a3a3bd62d89b0f9df49aae81cbb6883d5e7b4fadae280 +b3927030da445bc4756ac7230a5d87412a4f7510581fb422212ce2e8cf49689aca7ba71678743af06d4de4914c5aa4a0 +b86403182c98fcce558d995f86752af316b3b2d53ba32075f71c7da2596747b7284c34a1a87de604fcc71e7e117a8add +98dd19b5527733041689b2a4568edaf6aa0fe1a3dd800c290cda157b171e053648a5772c5d3d4c80e5a795bc49adf12e +88a3c227bb7c9bff383f9ad3f7762245939a718ab85ae6e5e13180b12bf724d42054d3852b421c1cd1b3670baddecb63 +b3cfd9ad66b52bbe57b5fff0fad723434d23761409b92c4893124a574acc1e6b1e14b4ec507661551cbbe05e16db362e +923e1bb482cf421dd77801f9780f49c3672b88508a389b94015fd907888dc647ee9ea8ec8d97131d235d066daf1f42b7 +8d5e16240f04f92aa948181d421006bdbc7b215648fb6554193224d00cf337ebbb958f7548cf01b4d828acffb9fbc452 +8b2b8f18ad0559746f6cda3acca294a1467fb1a3bc6b6371bc3a61a3bfe59418934fa8706f78b56005d85d9cb7f90454 +a9316e2a94d6e31426d2ae7312878ba6baaac40f43e2b8a2fa3ab5a774c6918551554b2dbb23dc82f70ba3e0f60b5b0d +9593116d92cf06b8cd6905a2ce569ee6e69a506c897911f43ae80fc66c4914da209fc9347962034eebbc6e3e0fe59517 +887d89d2b2d3c82b30e8f0acf15f0335532bd598b1861755498610cb2dd41ff5376b2a0bb757cb477add0ce8cfe7a9fc +b514cfe17875ecb790ad055271cc240ea4bda39b6cfa6a212908849c0875cb10c3a07826550b24c4b94ea68c6bb9e614 +a563d5187966d1257d2ed71d53c945308f709bcc98e3b13a2a07a1933dc17bcb34b30796bd68c156d91811fbd49da2cb +a7195ccc53b58e65d1088868aeeb9ee208103e8197ad4c317235bb2d0ad3dc56cb7d9a7186416e0b23c226078095d44c +a838e7a368e75b73b5c50fbfedde3481d82c977c3d5a95892ac1b1a3ea6234b3344ad9d9544b5a532ccdef166e861011 +9468ed6942e6b117d76d12d3a36138f5e5fb46e3b87cf6bb830c9b67d73e8176a1511780f55570f52d8cdb51dcf38e8c +8d2fc1899bc3483a77298de0e033085b195caf0e91c8be209fd4f27b60029cbe1f9a801fbd0458b4a686609762108560 +8f4e44f8ca752a56aa96f3602e9234ad905ad9582111daf96a8c4d6f203bf3948f7ce467c555360ad58376ee8effd2ba +8fb88640b656e8f1c7c966c729eb2ba5ccf780c49873f8b873c6971840db7d986bdf1332ba80f8a0bb4b4ee7401468fa +b72aa3235868186913fb5f1d324e748cd3ce1a17d3d6e6ea7639a5076430fe0b08841c95feb19bb94181fe59c483a9eb +b8b102690ebb94fc4148742e7e3fd00f807b745b02cbe92cd92992c9143b6db7bb23a70da64a8b2233e4a6e572fc2054 +8c9ae291f6cd744e2c6afe0719a7fc3e18d79307f781921fb848a0bf222e233879c1eca8236b4b1be217f9440859b6ce +a658ede47e14b3aad789e07f5374402f60e9cacb56b1b57a7c6044ca2418b82c98874e5c8c461898ebd69e38fecd5770 +89c0cb423580e333923eb66bda690f5aca6ec6cba2f92850e54afd882ba608465a7dbb5aa077cd0ca65d9d00909348ab +aed8e28d98d5508bd3818804cf20d296fe050b023db2ed32306f19a7a3f51c7aaafed9d0847a3d2cd5ba5b4dabbc5401 +96a0fcd6235f87568d24fb57269a94402c23d4aa5602572ad361f3f915a5f01be4e6945d576d51be0d37c24b8b0f3d72 +935d0c69edd5dfa8ed07c49661b3e725b50588f814eb38ea31bcc1d36b262fae40d038a90feff42329930f8310348a50 +900518288aa8ea824c7042f76710f2ea358c8bb7657f518a6e13de9123be891fa847c61569035df64605a459dad2ecc8 +947d743a570e84831b4fb5e786024bd752630429d0673bf12028eb4642beb452e133214aff1cfa578a8856c5ebcb1758 +a787266f34d48c13a01b44e02f34a0369c36f7ec0aae3ec92d27a5f4a15b3f7be9b30b8d9dd1217d4eeedff5fd71b2e5 +a24b797214707ccc9e7a7153e94521900c01a1acd7359d4c74b343bfa11ea2cdf96f149802f4669312cd58d5ab159c93 +97f5ee9c743b6845f15c7f0951221468b40e1edaef06328653a0882793f91e8146c26ac76dd613038c5fdcf5448e2948 +80abd843693aed1949b4ea93e0188e281334163a1de150c080e56ca1f655c53eb4e5d65a67bc3fc546ed4445a3c71d00 +908e499eb3d44836808dacff2f6815f883aeced9460913cf8f2fbbb8fe8f5428c6fc9875f60b9996445a032fd514c70f +ae1828ef674730066dc83da8d4dd5fa76fc6eb6fa2f9d91e3a6d03a9e61d7c3a74619f4483fe14cddf31941e5f65420a +a9f4dbe658cd213d77642e4d11385a8f432245b098fccd23587d7b168dbeebe1cca4f37ee8d1725adb0d60af85f8c12f +93e20ee8a314b7772b2439be9d15d0bf30cd612719b64aa2b4c3db48e6df46cea0a22db08ca65a36299a48d547e826a7 +a8746a3e24b08dffa57ae78e53825a9ddbbe12af6e675269d48bff4720babdc24f907fde5f1880a6b31c5d5a51fbb00e +b5e94dfab3c2f5d3aea74a098546aa6a465aa1e3f5989377d0759d1899babf543ad688bb84811d3e891c8713c45886c5 +a3929bada828bd0a72cda8417b0d057ecb2ddd8454086de235540a756e8032f2f47f52001eb1d7b1355339a128f0a53b +b684231711a1612866af1f0b7a9a185a3f8a9dac8bde75c101f3a1022947ceddc472beb95db9d9d42d9f6ccef315edbc +af7809309edbb8eb61ef9e4b62f02a474c04c7c1ffa89543d8c6bf2e4c3d3e5ecbd39ec2fc1a4943a3949b8a09d315a6 +b6f6e224247d9528ef0da4ad9700bee6e040bbf63e4d4c4b5989d0b29a0c17f7b003c60f74332fefa3c8ddbd83cd95c1 +adbcec190a6ac2ddd7c59c6933e5b4e8507ce5fd4e230effc0bd0892fc00e6ac1369a2115f3398dfc074987b3b005c77 +8a735b1bd7f2246d3fa1b729aecf2b1df8e8c3f86220a3a265c23444bdf540d9d6fe9b18ed8e6211fad2e1f25d23dd57 +96b1bf31f46766738c0c687af3893d098d4b798237524cb2c867ed3671775651d5852da6803d0ea7356a6546aa9b33f2 +8036e4c2b4576c9dcf98b810b5739051de4b5dde1e3e734a8e84ab52bc043e2e246a7f6046b07a9a95d8523ec5f7b851 +8a4f4c32ee2203618af3bb603bf10245be0f57f1cfec71037d327fa11c1283b833819cb83b6b522252c39de3ce599fa5 +ad06ed0742c9838e3abaaffdb0ac0a64bad85b058b5be150e4d97d0346ed64fd6e761018d51d4498599669e25a6e3148 +8d91cb427db262b6f912c693db3d0939b5df16bf7d2ab6a7e1bc47f5384371747db89c161b78ff9587259fdb3a49ad91 +ae0a3f84b5acb54729bcd7ef0fbfdcf9ed52da595636777897268d66db3de3f16a9cf237c9f8f6028412d37f73f2dfad +8f774109272dc387de0ca26f434e26bc5584754e71413e35fa4d517ee0f6e845b83d4f503f777fe31c9ec05796b3b4bc +a8670e0db2c537ad387cf8d75c6e42724fae0f16eca8b34018a59a6d539d3c0581e1066053a2ec8a5280ffabad2ca51f +ac4929ed4ecad8124f2a2a482ec72e0ef86d6a4c64ac330dab25d61d1a71e1ee1009d196586ce46293355146086cabba +845d222cb018207976cc2975a9aa3543e46c861486136d57952494eb18029a1ebb0d08b6d7c67c0f37ee82a5c754f26f +b99fa4a29090eac44299f0e4b5a1582eb89b26ed2d4988b36338b9f073851d024b4201cd39a2b176d324f12903c38bee +9138823bc45640b8f77a6464c171af2fe1700bdc2b7b88f4d66b1370b3eafe12f5fbb7b528a7e1d55d9a70ca2f9fc8e6 +8ac387dc4cf52bc48a240f2965ab2531ae3b518d4d1f99c0f520a3d6eb3d5123a35ef96bed8fa71ee2f46793fa5b33b3 +864adec6339d4c2ba2525621fceabd4c455902f6f690f31a26e55413e0722e5711c509dc47ce0bcc27bbdc7651768d2d +a0a52edb72268a15201a968dabc26a22909620bda824bd548fb8c26cc848f704166ed730d958f0173bd3b0a672f367bd +949e445b0459983abd399571a1a7150aab3dd79f4b52a1cd5d733e436c71c1d4b74287c6b0ce6cc90c6711ba4c541586 +858966355dac11369e3b6552f2b381665181693d5a32e596984da3314021710b25a37d8c548b08700eea13d86cb22f21 +974bcbb8d38c5e6518745cc03ad436e585b61f31d705e7e2e5085da9655d768ac4d800904f892c3dab65d6223e3f1fd6 +8092b6506b01308bf6187fde5ebd4fa7448c9a640961ba231be22ac5fa2c7635ef01e8b357722c7695d09b723101ea2a +a5b8ef360bf28533ee17d8cd131fff661d265f609db49599085c0c7d83b0af409a1b5c28e3a5e5d7f8459a368aa121e8 +b031b6d5e3ceab0f0c93314b3b675f55cf18cbc86f70444af266fe39cb22fd7dad75d8c84e07f1c1bfa2cb8283e1361a +93ad489e4f74658320c1cceed0137c023d3001a2c930ed87e6a21dbf02f2eb6ad1c1d8bcb3739c85dcfbecb040928707 +b15e4ec2cdab0d34aec8d6c50338812eb6ecd588cf123a3e9d22a7ca23b5a98662af18289f09e6cdd85a39a2863c945c +b304f71a9717cf40c22073f942618b44bf27cd5e2ed4a386ad45d75b0fcb5a8dafd35158211eaf639495c6f1a651cedb +b82d78d3eaaa7c5101b7a5aae02bd4f002cd5802d18c3abcda0dd53b036661c6d3c8b79e0abe591eab90b6fdc5fef5e3 +abbd1884243a35578b80914a5084449c237ee4e4660c279d1073a4d4217d1b55c6b7e9c087dfd08d94ac1416273d8d07 +92f4b61c62502745e3e198ec29bca2e18696c69dcb914d1f3a73f4998d012b90caf99df46e9bb59942e43cce377fe8fd +906e79df98185820c8208844e1ba6bd86cb96965814b01310bd62f22cbec9b5d379b2ef16772d6fc45a421b60cfd68fe +a0eae2784ef596e2eb270dd40c48d6c508e4394c7d6d08d4cc1b56fde42b604d10ba752b3a80f2c4a737e080ef51b44f +94c084985e276dc249b09029e49a4ef8a369cd1737b51c1772fbb458d61e3fe120d0f517976eba8ffa5711ba93e46976 +83619a0157eff3f480ab91d1d6225fead74c96a6fd685333f1e8e4d746f6273e226bad14232f1d1168a274e889f202f1 +a724fe6a83d05dbbf9bb3f626e96db2c10d6d5c650c0a909415fbda9b5711c8b26e377201fb9ce82e94fa2ab0bf99351 +a8a10c1b91a3a1fa2d7fd1f78a141191987270b13004600601d0f1f357042891010717319489f681aa8a1da79f7f00d5 +a398a2e95b944940b1f8a8e5d697c50e7aa03994a8a640dfad4ea65cfb199a4d97861a3ec62d1c7b2b8d6e26488ca909 +a2eedfe5452513b2a938fffd560798ef81379c5a5032d5b0da7b3bb812addbaad51f564c15d9acbbfc59bb7eddd0b798 +ab31c572f6f145a53e13b962f11320a1f4d411739c86c88989f8f21ab629639905b3eedb0628067942b0dc1814b678ca +ad032736dd0e25652d3566f6763b48b34ea1507922ed162890cd050b1125ec03b6d41d34fccba36ec90336f7cdf788ed +83028a558a5847293147c483b74173eca28578186137df220df747fccd7d769528d7277336ea03c5d9cdd0bc5ae3d666 +ab5d182cd1181de8e14d3ef615580217c165e470b7a094a276b78a3003089123db75c6e1650bf57d23e587c587cd7472 +a4793e089fbdb1597654f43b4f7e02d843d4ab99ee54099c3d9f0bd5c0c5657c90bb076379a055b00c01b12843415251 +98bdc52ee062035356fb2b5c3b41673198ddc60b2d1e546cb44e3bb36094ef3c9cf2e12bbc890feb7d9b15925439d1ea +a4f90cca6f48024a0341bd231797b03693b34e23d3e5b712eb24aba37a27827319b2c16188f97c0636a0c115381dc659 +8888e6c2e4a574d04ba5f4264e77abc24ccc195f1a7e3194169b8a2ceded493740c52db4f9833b3dbf4d67a3c5b252cb +83dc4e302b8b0a76dc0292366520b7d246d73c6aebe1bdd16a02f645c082197bcff24a4369deda60336172cefbcf09af +a4eb2741699febfeb793914da3054337cc05c6fa00d740e5f97cb749ae16802c6256c9d4f0f7297dcdbb8b9f22fc0afa +8b65557d5be273d1cb992a25cfce40d460c3f288d5cb0a54bdef25cbd17cdea5c32ec966e493addf5a74fd8e95b23e63 +97c6577e76c73837bcb398b947cb4d3323d511141e0ddd0b456f59fbb1e8f920a5c20d7827a24309145efddee786140f +abcc0849ffe2a6a72157de907907b0a52deece04cf8317bee6fe1d999444b96e461eac95b6afde3d4fe530344086a625 +9385c0115cb826a49df1917556efa47b5b5e4022b6a0d2082053d498ec9681da904ecf375368bb4e385833116ea61414 +8b868c1841f0cdc175c90a81e610b0652c181db06731f5c8e72f8fafa0191620742e61a00db8215a991d60567b6a81ca +a8df15406f31b8fcf81f8ff98c01f3df73bf9ec84544ddec396bdf7fafa6fe084b3237bf7ef08ad43b26517de8c3cd26 +a9943d21e35464ce54d4cc8b135731265a5d82f9ccf66133effa460ffdb443cdb694a25320506923eede88d972241bf2 +a1378ee107dd7a3abcf269fd828887c288363e9b9ca2711377f2e96d2ed5e7c5ec8d3f1da995a3dcbedf1752d9c088fc +8a230856f9227b834c75bdebc1a57c7298a8351874bf39805c3e0255d6fd0e846f7ad49709b65ec1fd1a309331a83935 +877bcf42549d42610e1780e721f5800972b51ba3b45c95c12b34cb35eeaf7eac8fa752edd7b342411820cf9093fea003 +84c7a0b63842e50905624f1d2662506b16d1f3ea201877dfc76c79181c338b498eceb7cad24c2142c08919120e62f915 +8e18b1bd04b1d65f6ed349b5d33a26fe349219043ead0e350b50ae7a65d6ff5f985dd9d318d3b807d29faa1a7de4fe42 +8ea7b5a7503e1f0b3c3cd01f8e50207044b0a9c50ed1697794048bbe8efd6659e65134d172fb22f95439e1644f662e23 +b1954a2818cad1dad6d343a7b23afa9aa8ad4463edc4eb51e26e087c2010927535020d045d97d44086d76acdb5818cbf +a5271ea85d0d21fa1ff59b027cf88847c0f999bbf578599083ff789a9b5228bc161e1c81deb97e74db1a82a0afd61c50 +aa2fa4c05af3387e2c799315781d1910f69977ec1cfea57a25f1a37c63c4daaa3f0ecd400884a1673e17dd5300853bcf +b1cd2a74ca0b8e6090da29787aef9b037b03b96607983a308b790133bd21297b21ca4e2edec890874096dbf54e9d04c3 +801931607ec66a81272feaa984f0b949ad12d75ecf324ba96627bd4dc5ddead8ebf088f78e836b6587c2b6c0b3366b6c +95d79504710bdf0ad9b9c3da79068c30665818c2f0cdbba02cc0a5e46e29d596032ac984441b429bd62e34535c8d55b0 +9857d41e25e67876510ff8dadf0162019590f902da1897da0ef6fc8556e3c98961edb1eb3a3a5c000f6c494413ded15e +8740c9ffe6bd179c19a400137c3bd3a593b85bd4c264e26b4dfb9e2e17ac73e5b52dfacc1dcb4033cfc0cd04785f4363 +977f98f29d948b4097a4abdf9345f4c1fb0aa94ba0c6bf6faa13b76f3a3efc8f688e1fe96099b71b3e1c05041118c8d1 +a364422b1239126e3e8d7b84953ce2181f9856319b0a29fcab81e17ac27d35798088859c1cfc9fc12b2dbbf54d4f70b3 +a0f6ba637f0db7a48e07439bb92ddb20d590ce9e2ed5bab08d73aa22d82c32a9a370fe934cbe9c08aeb84b11adcf2e0e +a2c548641bd5b677c7748327cca598a98a03a031945276be6d5c4357b6d04f8f40dd1c942ee6ec8499d56a1290ac134d +9863e9cc5fbcdbd105a41d9778d7c402686bfd2d81d9ed107b4fda15e728871c38647529693306855bee33a00d257a7e +a54173bf47b976290c88fd41f99300135de222f1f76293757a438450880e6f13dbde3d5fe7afc687bdfbcfc4fbc1fc47 +b8db413917c60907b73a997b5ab42939abd05552c56a13525e3253eb72b83f0d5cc52b695968a10005c2e2fe13290e61 +a1f8388ef21697c94ba90b1a1c157f0dc138e502379e6fc5dc47890d284563e5db7716266e1b91927e5adf3cde4c0a72 +9949013a59d890eb358eab12e623b2b5edb1acbee238dfad8b7253102abc6173922e188d5b89ec405aa377be8be5f16d +a00fdb7710db992041f6ddb3c00099e1ce311dea43c252c58f560c0d499983a89de67803a8e57baa01ee9d0ee6fa1e44 +a8b1bcbed1951c9cdb974b61078412881b830b48cd6b384db0c00fa68bcc3f4312f8e56c892ea99d3511857ef79d3db9 +8f3ee78404edc08af23b1a28c2012cee0bdf3599a6cb4ea689fc47df4a765ef519191819a72562b91a0fbcdb896a937e +8155bbb7fa8d386848b0a87caae4da3dec1f3dade95c750a64a8e3555166ccc8799f638bd80ed116c74e3a995541587a +abfe30adbc0a6f1fd95c630ed5dac891b85384fa9331e86b83217f29dff0bd7cad19d328485715a7e3df9a19069d4d2f +89d0783e496ee8dbb695764b87fb04cee14d4e96c4ba613a19736971c577d312079048142c12ce5b32b21e4d491d281b +856b8dbc9c5d8f56b6bb7d909f339ca6da9a8787bba91f09130a025ab6d29b64dbf728ba6ed26e160a23c1cdb9bc037b +8a30dd2ea24491141047a7dfe1a4af217661c693edf70b534d52ca547625c7397a0d721e568d5b8398595856e80e9730 +ae7e1412feb68c5721922ed9279fb05549b7ef6812a4fd33dbbbd7effab756ab74634f195d0c072143c9f1fd0e1ee483 +b7ce970e06fa9832b82eef572f2902c263fda29fdce9676f575860aae20863046243558ede2c92343616be5184944844 +85ed0531f0e5c1a5d0bfe819d1aa29d6d5ff7f64ad8a0555560f84b72dee78e66931a594c72e1c01b36a877d48e017ca +b8595be631dc5b7ea55b7eb8f2982c74544b1e5befc4984803b1c69727eac0079558182f109e755df3fd64bee00fcaa5 +99e15a66e5b32468ef8813e106271df4f8ba43a57629162832835b8b89402eb32169f3d2c8de1eb40201ce10e346a025 +844c6f5070a8c73fdfb3ed78d1eddca1be31192797ad53d47f98b10b74cc47a325d2bc07f6ee46f05e26cf46a6433efb +974059da7f13da3694ad33f95829eb1e95f3f3bfc35ef5ef0247547d3d8ee919926c3bd473ab8b877ff4faa07fcc8580 +b6f025aecc5698f6243cc531782b760f946efebe0c79b9a09fe99de1da9986d94fa0057003d0f3631c39783e6d84c7d5 +b0c5358bc9c6dfe181c5fdf853b16149536fbb70f82c3b00db8d854aefe4db26f87332c6117f017386af8b40288d08f9 +a3106be5e52b63119040b167ff9874e2670bd059b924b9817c78199317deb5905ae7bff24a8ff170de54a02c34ff40a4 +ad846eb8953a41c37bcd80ad543955942a47953cbc8fb4d766eac5307892d34e17e5549dc14467724205255bc14e9b39 +b16607e7f0f9d3636e659e907af4a086ad4731488f5703f0917c4ce71a696072a14a067db71a3d103530920e1ec50c16 +8ed820e27116e60c412c608582e9bb262eaaf197197c9b7df6d62b21a28b26d49ea6c8bb77dfde821869d9b58025f939 +97bc25201d98cde389dd5c0c223a6f844393b08f75d3b63326343073e467ac23aacef630ddc68545ea874299ba4a3b4f +b73c9695ad2eefd6cc989a251c433fab7d431f5e19f11d415a901762717d1004bb61e0cc4497af5a8abf2d567e59fef4 +adaabe331eea932533a7cc0cf642e2a5e9d60bbc92dd2924d9b429571cbf0d62d32c207b346607a40643c6909b8727e2 +a7b1bbfe2a5e9e8950c7cb4daab44a40c3ffab01dc012ed7fe445f4af47fa56d774a618fafe332ab99cac4dfb5cf4794 +b4a3c454dcd5af850212e8b9ba5fe5c0d958d6b1cabbf6c6cfe3ccbc4d4c943309c18b047256867daf359006a23f3667 +a5c0b32f6cef993834c1381ec57ad1b6f26ae7a8190dd26af0116e73dadc53bb0eeb1911419d609b79ce98b51fdc33bc +ac2f52de3ecf4c437c06c91f35f7ac7d171121d0b16d294a317897918679f3b9db1cef3dd0f43adb6b89fe3030728415 +94722ae6d328b1f8feaf6f0f78804e9b0219de85d6f14e8626c2845681841b2261d3e6a2c5b124086b7931bf89e26b46 +a841a0602385d17afabca3a1bb6039167d75e5ec870fea60cfcaec4863039b4d745f1a008b40ec07bca4e42cb73f0d21 +8c355f0a1886ffced584b4a002607e58ff3f130e9de827e36d38e57cb618c0cb0b2d2dea2966c461cb3a3887ede9aef1 +a6a9817b0fc2fd1786f5ba1a7b3d8595310987fb8d62f50a752c6bb0b2a95b67d03a4adfd13e10aa6190a280b7ee9a67 +a1d2e552581ecbafeaef08e389eaa0b600a139d446e7d0648ac5db8bbbf3c438d59497e3a2874fc692b4924b87ff2f83 +a1b271c55389f25639fe043e831e2c33a8ba045e07683d1468c6edd81fedb91684e4869becfb164330451cfe699c31a8 +8c263426e7f7e52f299d57d047a09b5eeb893644b86f4d149535a5046afd655a36d9e3fdb35f3201c2ccac2323a9582e +b41c242a7f7880c714241a97d56cce658ee6bcb795aec057a7b7c358d65f809eb901e0d51256826727dc0dc1d1887045 +93001b9445813c82f692f94c0dc1e55298f609936b743cf7aae5ebfa86204f38833d3a73f7b67314be67c06a1de5682d +82087536dc5e78422ad631af6c64c8d44f981c195ddea07d5af9bb0e014cdc949c6fa6e42fce823e0087fdb329d50a34 +8e071861ceba2737792741c031f57e0294c4892684506b7c4a0fc8b2f9a0a6b0a5635de3d1e8716c34df0194d789ae86 +b471c997e1e11774bd053f15609d58838a74073a6c089a7a32c37dd3f933badf98c7e5833263f3e77bc0d156a62dd750 +8d2d8686fb065b61714414bb6878fff3f9e1e303c8e02350fd79e2a7f0555ded05557628152c00166ce71c62c4d2feaa +ae4c75274d21c02380730e91de2056c0262ffcecf0cbdb519f0bdb0b5a10ae2d4996b3dc4b3e16dbaea7f0c63d497fef +97140d819e8ca6330e589c6debdee77041c5a9cedb9b8cbd9c541a49207eeb7f6e6b1c7e736ec8ba6b3ab10f7fcd443a +af6659f31f820291a160be452e64d1293aa68b5074b4c066dac169b8d01d0179139504df867dc56e2a6120354fc1f5be +a5e5d8088a368024617bfde6b731bf9eee35fc362bed3f5dfdd399e23a2495f97f17728fec99ca945b3282d1858aa338 +a59cfc79d15dbdde51ab8e5129c97d3baba5a0a09272e6d2f3862370fdbaf90994e522e8bd99d6b14b3bb2e9e5545c6f +a30499b068083b28d6c7ddcc22f6b39b5ec84c8ee31c5630822c50ea736bb9dca41c265cffc6239f1c9ef2fd21476286 +88ffe103eca84bbe7d1e39a1aa599a5c7c9d5533204d5c4e085402a51441bb8efb8971efe936efbbfa05e5cb0d4b8017 +b202356fbf95a4d699154639e8cb03d02112c3e0128aab54d604645d8510a9ba98936028349b661672c3a4b36b9cb45d +8b89bb6574bf3524473cff1ff743abcf1406bd11fb0a72070ccd7d8fce9493b0069fb0c6655252a5164aee9e446ea772 +93247b1038fa7e26667ee6446561d4882dc808d1015daafb705935ddc3598bb1433182c756465960480f7b2de391649e +b027f94d3358cbb8b6c8c227300293a0dee57bf2fee190a456ad82ecfb6c32f8090afa783e2ab16f8139805e1fb69534 +a18bb1849b2f06c1d2214371031d41c76ffa803ee3aa60920d29dbf3db5fbfac2b7383d5d0080ba29ce25c7baa7c306b +827bf9fd647e238d5ac961c661e5bbf694b4c80b3af8079f94a2484cb8fba2c8cf60e472ebcd0b0024d98ae80ad2ff5a +838e891218c626a7f39b8fd546b013587408e8e366ecc636b54f97fa76f0a758bc1effa1d0f9b6b3bc1a7fcc505970a0 +836523b5e8902d6e430c6a12cff01e417d2bd7b402e03904034e3b39755dee540d382778c1abe851d840d318ebedce7f +850a77dda9ac6c217e2ef00bf386a1adec18b7f462f52801c4f541215690502a77ef7519b690e22fdf54dc2109e0ca38 +a8265c6ae7b29fc2bda6a2f99ced0c1945dd514b1c6ca19da84b5269514f48a4f7b2ccbab65c9107cfd5b30b26e5462f +ab3d02ee1f1267e8d9d8f27cc388e218f3af728f1de811242b10e01de83471a1c8f623e282da5a284d77884d9b8cde0e +831edaf4397e22871ea5ddee1e7036bab9cc72f8d955c7d8a97f5e783f40532edbbb444d0520fefcffeab75677864644 +80484487977e4877738744d67b9a35b6c96be579a9faa4a263e692295bb6e01f6e5a059181f3dd0278e2c3c24d10a451 +aae65a18f28c8812617c11ecf30ad525421f31fb389b8b52d7892415e805a133f46d1feca89923f8f5b8234bd233486a +b3a36fd78979e94288b4cefed82f043a7e24a4a8025479cc7eb39591e34603048a41ee606ee03c0b5781ebe26a424399 +b748b3fc0d1e12e876d626a1ba8ad6ad0c1f41ea89c3948e9f7d2666e90173eb9438027fadcd741d3ae0696bd13840f1 +acdd252d7c216c470683a140a808e011c4d5f1b4e91aeb947f099c717b6a3bad6651142cde988330827eb7d19d5fb25c +b9a25556a6ca35db1ed59a1ec6f23343eab207a3146e4fc3324136e411c8dba77efd567938c63a39c2f1c676b07d8cdb +a8db6aef8f5680d2bdb415d7bcaae11de1458678dcb8c90c441d5986c44f83a9e5855662d0c1aace999172d8628d8fe1 +af58147108e9909c3a9710cc186eab598682dca4bfd22481e040b8c000593ecb22c4ede4253ac9504e964dfa95a9b150 +8dd8bb70f1c9aec0fcc9478f24dfc9c3c36c0bf5ff7a67c017fa4dab2ec633fbd7bc9d8aa41ea63e2696971ed7e375f5 +aa98d600b22aff993a4d7a3ccabd314e1825b200cb598f6b797d7e4d6a76d89e34a4d156c06bddfc62f2ef9b4c809d1d +8a8fc960d6c51294b8205d1dabe430bef59bda69824fa5c3c3105bef22ac77c36d2d0f38ffc95ce63731de5544ccbeff +b6d1020efe01dc8032bd1b35e622325d7b9af9dcd5c9c87c48d7d6ebc58644454294c59b7f4b209204b5b1f899f473bf +8a750dc9fe4891f2dfe5759fb985939810e4cdc0b4e243ff324b6143f87676d8cb4bcb9dfb01b550801cedcaaa5349e2 +98c13142d3a9c5f8d452245c40c6dae4327dd958e0fda85255ea0f87e0bcbaa42a3a0bd50407ed2b23f9f6317a8a4bc5 +99f2b83d9ec4fc46085a6d2a70fd0345df10f4a724c1ba4dee082a1fde9e642e3091992ebf5f90a731abcb6ec11f6d9b +b218546ab2db565b2489ea4205b79daa19ef2acbf772ccaaa5e40150e67ea466090d07198444b48e7109939aa2319148 +84f9d1d868e4b55e535f1016558f1789df0daa0ead2d13153e02f715fe8049b1ce79f5bc1b0bbbb0b7e4dd3c04783f3f +80d870d212fbddfdda943e90d35a5a8aa0509a7a1e7f8909f2fcb09c51c3026be47cc7a22620a3063406872105b4f81a +b5b15138ff6551fac535d4bbce2ea6adc516b6b7734b4601c66ec029da2615e3119dc9ad6a937344acfd7b50e4a1a2ae +95d2f97652086e7ceb54e1d32692b1c867ffba23c4325740c7f10d369283d1b389e8afa0df967831ade55696931e7934 +8a5b580403e1a99cd208f707e8ce0d3f658c8280417683f69008d09cc74d835a85f7380f391b36ead9ac66d9eedd1cbe +a8b0c90bff34c86720637b5a2081f0f144cfe2205c1176cacd87d348609bc67af68aed72414dc9aa6f44a82c92c2a890 +865abbdd96c496892c165a8de0f9e73348bf24fce361d7a9048710178a3625881afb0006e9f5ee39124866b87904c904 +ace67bb994adef4b6f841cdf349195608030044562780a7e9b00b58a4ff117268a03ff01e5a3a9d9d7eff1dd01f5f4bf +b9371d59185b3d2d320d3fefeadb06ba2aa7d164352fb8dc37571509509fa214d736d244ac625a09a033a10d51611e2e +a8ef992771422dcf2d6d84386fde9fe5dba88bfded3dfcd14074ca04331b4fd53a7f316615cdfaf10ed932cbb424a153 +868cbc75f8f789ea45eded2768a1dac0763347e0d8e8028d316a21005f17be179d26d5965903e51b037f2f57fe41765d +b607111bcdfd05fa144aa0281b13ee736079ebbbf384d938a60e5e3579639ed8ef8eb9ca184868cdb220a8e130d4a952 +aca55702af5cae4cae65576769effd98858307a71b011841c563b97c2aa5aeb5c4f8645d254f631ed1582df3dbbf17da +b9b5cbace76246e80c20dfcc6f1e2c757a22ab53f7fd9ff8a1d309538b55174e55e557a13bf68f095ff6a4fa637ef21a +8571b0a96871f254e2397c9be495c76379faf347801cb946b94e63212d6a0da61c80e5d7bebbabcd6eaa7f1029172fe5 +902540326281e6dc9c20d9c4deaaf6fbbbcc3d1869bd0cf7f081c0525bea33df5cfa24ead61430fda47fb964fcc7994b +841af09279d3536a666fa072278950fabf27c59fc15f79bd52acb078675f8087f657929c97b4bc761cbade0ecb955541 +a1f958b147ddf80ab2c0746ba11685c4bae37eb25bfa0442e7e1078a00d5311d25499da30f6d168cb9302ea1f2e35091 +863d939381db37d5a5866964be3392a70be460f0353af799d6b3ed6307176972686bd378f8ad457435a4094d27e8dfb7 +835cd4d7f36eff553d17483eb6c041b14280beb82c7c69bca115929658455a1931212976c619bafb8179aed9940a8cc6 +8d0770e3cb8225e39c454a1fc76954118491b59d97193c72c174ecc7613051e5aed48a534016a8cf0795c524f771a010 +91aa4edb82f6f40db2b7bd4789cc08786f6996ebed3cb6f06248e4884bc949793f04a4c5ea6eefe77984b1cc2a45d699 +8fb494ca2449f659ff4838833507a55500a016be9293e76598bbae0a7cb5687e4693757c2b6d76e62bd6c7f19ed080bb +b59b104449a880a282c1dd6a3d8debb1d8814ef35aab5673c1e500ee4cb0e840fb23e05fa5a0af92509c26b97f098f90 +aca908e3bad65e854ae6be6c5db441a06bcd47f5abafdfa8f5a83c8cd3c6e08c33cab139c45887887a478338e19ceb9f +806f5d802040313a31964fc3eb0ee18ac91b348685bed93c13440984ee46f3d2da7194af18c63dea4196549129660a4e +ae4b2dca75c28d8f23b3ab760b19d839f39ff5a3112e33cb44cff22492604a63c382b88ec67be4b0266924dd438c3183 +99d1c29c6bd8bf384e79cd46e30b8f79f9cbc7d3bf980e9d6ffba048f0fc487cac45c364a8a44bb6027ad90721475482 +a16e861c1af76d35528c25bf804bfc41c4e1e91b2927d07d8e96bffe3a781b4934e9d131ecf173be9399800b8269efac +a253303234fb74f5829060cdcef1d98652441ab6db7344b1e470d195a95722675988048d840201c3b98e794b1e8b037c +905ac8a0ea9ce0eb373fb0f83dd4cbe20afb45b9d21ae307846fd4757d4d891b26a6711924e081e2b8151e14a496da18 +b485315791e775b9856cc5a820b10f1fa5028d5b92c2f0e003ba55134e1eddb3eb25f985f2611a2257acf3e7cfdfab5e +b6189c0458b9a043ebc500abc4d88083a3487b7ac47ed5e13ab2a41e0a1bee50d54a406063f92bc96959f19e822a89a7 +a30e15f995fd099a223fc6dc30dad4b8d40bee00caa2bc3223ba6d53cd717c4968a3e90c4618c711ed37cc4cd4c56cf3 +a1b1ed07fcc350bb12a09cd343768d208fc51a6b3486f0ece8f5a52f8a5810b4bc7ab75582ec0bc2770aed52f68eace5 +88aa739fbae4bece147ba51a863e45d5f7203dbc3138975dc5aef1c32656feb35f014d626e0d5b3d8b1a2bda6f547509 +ab570f3c8eabfca325b3a2ea775ef6b0c6e6138c39d53c2310329e8fb162869fde22b0e55688de9eb63d65c37598fca3 +89d274762c02158e27cb37052e296a78f2b643eb7f9ae409f8dac5c587d8b4d82be4ef7c79344a08ebec16ac4a895714 +99c411d2ad531e64f06e604d44c71c7c384424498ecd0a567d31ec380727fb605af76643d0d5513dd0a8d018076dd087 +80d0777fa9f79f4a0f0f937d6de277eec22b3507e2e398f44b16e11e40edf5feff55b3b07a69e95e7e3a1621add5ed58 +b2430a460783f44feb6e4e342106571ef81ad36e3ddd908ec719febeb7acaf4b833de34998f83a1dab8f0137a3744c11 +b8f38ccfc7279e1e30ad7cefc3ea146b0e2dff62430c50a5c72649a4f38f2bac2996124b03af2079d942b47b078cc4f8 +a178a450a62f30ec2832ac13bbc48789549c64fc9d607b766f6d7998558a0e2fad007ae0148fc5747189b713f654e6ba +98c5ede296f3016f6597f7ccc5f82c88fd38ed6dc3d6da3e4a916bfd7c4c95928722a1d02534fe89387c201d70aa6fd2 +a8cc5e98573705d396576e022b2ba2c3e7c7ece45cd8605cb534b511763682582299e91b4bb4100c967019d9f15bbfaf +848480ea7b7d9536e469da721236d932870b7bbee31ccf7ae31b4d98d91413f59b94a1e0d1786ee7342295aa3734969c +b88ea38f9ee432f49e09e4e013b19dff5a50b65453e17caf612155fff6622198f3cba43b2ea493a87e160935aaaf20a9 +949376934a61e0ef8894339c8913b5f3b228fa0ae5c532ad99b8d783b9e4451e4588541f223d87273c0e96c0020d5372 +96f90bb65ca6b476527d32c415814b9e09061648d34993f72f28fae7dc9c197e04ef979f804076d107bb218dfd9cb299 +a4402da95d9942c8f26617e02a7cef0ebc4b757fac72f222a7958e554c82cc216444de93f659e4a1d643b3e55a95d526 +81179cbc26a33f6d339b05ea3e1d6b9e1190bd44e94161ae36357b9cdf1e37d745d45c61735feed64371fe5384102366 +ad4dc22bdbd60e147fdac57d98166de37c727f090059cfc33e5ee6cf85e23c2643996b75cf1b37c63f3dc9d3c57ffa18 +8a9b1b93dc56e078ce3bb61c2b0088fd6c3e303ba6b943231cc79d4a8e8572f4109bbde5f5aa7333aae3287909cb0fe2 +8876ef583bc1513322457a4807d03381ba1f4d13e179260eaa3bddfede8df677b02b176c6c9f74c8e6eab0e5edee6de6 +b6c67e228bf190fbaeb2b7ec34d4717ce710829c3e4964f56ebb7e64dc85058c30be08030fa87cc94f1734c5206aef5f +a00cb53b804ee9e85ce12c0103f12450d977bc54a41195819973c8a06dcb3f46f2bf83c3102db62c92c57ab4dd1e9218 +a7675a64772eefddf8e94636fb7d1d28f277074327c02eea8fae88989de0c5f2dc1efed010f4992d57b5f59a0ab40d69 +8d42bb915e0bf6a62bcdf2d9330eca9b64f9ec36c21ae14bf1d9b0805e5e0228b8a5872be61be8133ad06f11cb77c363 +a5b134de0d76df71af3001f70e65c6d78bed571bc06bfddf40d0baad7ea2767608b1777b7ef4c836a8445949877eeb34 +aeadbc771eaa5de3a353229d33ed8c66e85efbd498e5be467709cb7ff70d3f1a7640002568b0940e3abd7b2da81d2821 +8c28da8e57a388007bd2620106f6226b011ee716a795c5d9f041c810edf9cf7345b2e2e7d06d8a6b6afa1ee01a5badc1 +8ed070626a4d39ffd952ddb177bc68fd35b325312e7c11694c99b691f92a8ea7734aeb96cf9cc73e05b3c1b1dcad6978 +ada83e18e4842f3d8871881d5dbc81aed88a1328298bfdc9e28275094bd88d71b02e7b8501c380fa8d93096cbc62f4fb +8befc3bec82dcf000a94603b4a35c1950ba5d00d4bed12661e4237afa75062aa5dcef8eac0b9803136c76d2dd424a689 +97c6f36c91ca5ca9230bfcbf109d813728b965a29b62e5f54c8e602d14a52ac38fa1270de8bfe1ab365426f3fc3654c7 +b01d192af3d8dbce2fe2fece231449e70eb9ac194ec98e758da11ca53294a0fa8c29b1d23a5d9064b938b259ea3b4fb5 +819a2c20646178f2f02865340db1c3c6ebc18f4e6559dd93aa604388796a34bd9fed28ad3ccc8afc57a5b60bb5c4e4ec +a9ffc877470afc169fecf9ec2dc33253b677371938b0c4ffa10f77bb80089afa2b4488437be90bb1bcf7586a6f4286e3 +b533051c7ce7107176bcb34ad49fdb41fac32d145854d2fe0a561c200dcf242da484156177e2c8f411c3fdf1559ecf83 +8fe2caff2e4241d353110a3618832f1443f7afe171fd14607009a4a0aa18509a4f1367b67913e1235ac19de15e732eb1 +84705c6370619403b9f498059f9869fdf5f188d9d9231a0cb67b1da2e8c906ead51b934286497293698bba269c48aa59 +899dddf312a37e3b10bdaaacc1789d71d710994b6ee2928ac982ad3fd8a4f6167672bc8bf3419412711c591afe801c28 +b2f7916d946b903ded57b9d57025386143410a41a139b183b70aeca09cf43f5089ead1450fce4e6eb4fba2c8f5c5bbe5 +8d5f742fe27a41623b5820914c5ca59f82246010fa974304204839880e5d0db8bc45ebab2ad19287f0de4ac6af25c09e +b93d4a1f6f73ac34da5ffbd2a4199cf1d51888bc930dc3e481b78806f454fcb700b4021af7525b108d49ebbbaa936309 +8606f8d9121512e0217a70249937e5c7f35fbfe019f02248b035fa3a87d607bc23ae66d0443e26a4324f1f8e57fd6a25 +b21312cdec9c2c30dd7e06e9d3151f3c1aceeb0c2f47cf9800cce41521b9d835cb501f98b410dc1d49a310fdda9bc250 +a56420b64286bdddda1e212bba268e9d1ba6bdb7132484bf7f0b9e38099b94a540884079b07c501c519b0813c184f6b4 +80b2cf0e010118cb2260f9c793cef136f8fa7b5e2711703735524e71d43bce2d296c093be41f2f59118cac71f1c5a2ff +adcb12d65163804d2f66b53f313f97152841c3625dbbda765e889b9937195c6fcd55d45cc48ebffabb56a5e5fe041611 +8b8a42e50dc6b08ab2f69fc0f6d45e1ea3f11ba0c1008ee48448d79d1897356599e84f7f9d8a100329ed384d6787cfc4 +aaa9c74afa2dec7eccfbd8bb0fc6f24ed04e74c9e2566c0755a00afdfdf3c4c7c59e2a037ec89c2f20af3fae1dd83b46 +aa9f6e8fd59187171c6083ae433627d702eb78084f59010ff07aff8f821f7022ef5fbbe23d76814d811b720a8bfa6cc3 +a56a3ded501659ad006d679af3287080b7ee8449e579406c2cae9706ef8bf19c1fc2eb2a6f9eaf2d3c7582cded73e477 +81971e077c1da25845840222b4191e65f6d242b264af4e86800f80072d97d2a27a6adc87c3a1cb1b0dd63d233fbafa81 +a6fa5453c4aaad2947969ee856616bf6448224f7c5bf578f440bcfc85a55beb40bef79df8096c4db59d1bd8ef33293ea +87c545adbfaaf71e0ab4bac9ae4e1419718f52b0060e8bb16b33db6d71b7248ae259d8dd4795b36a4bbb17f8fae9fd86 +b4c7a9bc0910e905713291d549cec5309e2d6c9b5ea96954489b1dff2e490a6c8b1fa1e392232575f0a424ba94202f61 +802350b761bcaba21b7afe82c8c6d36ee892b4524ab67e2161a91bbfa1d8e92e7e771efb1f22c14126218dd2cb583957 +b4e7ddb9143d4d78ea8ea54f1c908879877d3c96ee8b5e1cb738949dcfceb3012a464506d8ae97aa99ea1de2abf34e3d +a49a214065c512ad5b7cc45154657a206ef3979aa753b352f8b334411f096d28fd42bca17e57d4baaafb014ac798fc10 +8a80c70a06792678a97fe307520c0bf8ed3669f2617308752a2ab3c76fdf3726b014335a9b4c9cbcfc1df3b9e983c56f +a34721d9e2a0e4d08995a9d986dc9c266c766296d8d85e7b954651ad2ca07e55abb1b215898ee300da9b67114b036e0d +8cfce4564a526d7dca31e013e0531a9510b63845bbbd868d5783875ed45f92c1c369ce4a01d9d541f55f83c2c0a94f03 +ab3f5f03a5afc727778eb3edf70e4249061810eba06dc3b96b718e194c89429c5bfbec4b06f8bce8a2118a2fdce67b59 +aa80c2529fc19d428342c894d4a30cb876169b1a2df81a723ab313a071cba28321de3511a4de7846207e916b395abcc9 +82b7828249bf535ef24547d6618164b3f72691c17ca1268a5ee9052dba0db2fdd9987c8e083307a54399eab11b0f76b1 +8fbcb56b687adad8655a6cf43364a18a434bf635e60512fad2c435cf046f914228fb314f7d8d24d7e5e774fb5ffb1735 +a3010a61a2642f5ebbce7b4bc5d6ecb3df98722a49eb1655fe43c1d4b08f11dfad4bcec3e3f162d4cc7af6a504f4d47c +b3dcc0fdf531478e7c9ef53190aa5607fd053a7d2af6c24a15d74c279dbb47e3c803a1c6517d7e45d6534bb59e3527f5 +8648f6316c898baaca534dff577c38e046b8dfa8f5a14ee7c7bc95d93ae42aa7794ba0f95688a13b554eeb58aeedf9ba +89fca6fc50407695e9315483b24f8b4e75936edf1475bcf609eed1c4370819abac0e6a7c3c44f669560367d805d9ba63 +a367a17db374f34cd50f66fb31ba5b7de9dbe040f23db2dcc1d6811c0e863606f6c51850af203956f3399000f284d05f +91030f9ca0fff3e2dbd5947dcf2eba95eb3dbca92ee2df0ed83a1f73dbf274611af7daf1bb0c5c2ee46893ab87013771 +84d56181f304ce94015ea575afeef1f84ea0c5dbb5d29fb41f25c7f26077b1a495aff74bd713b83bce48c62d7c36e42d +8fe2f84f178739c3e2a2f7dcac5351c52cbed5fa30255c29b9ae603ffd0c1a181da7fb5da40a4a39eec6ce971c328fcf +a6f9b77b2fdf0b9ee98cb6ff61073260b134eb7a428e14154b3aa34f57628e8980c03664c20f65becfe50d2bdd2751d4 +8c6760865445b9327c34d2a1247583694fbeb876055a6a0a9e5cb460e35d0b2c419e7b14768f1cc388a6468c94fd0a0f +af0350672488a96fe0089d633311ac308978a2b891b6dbb40a73882f1bda7381a1a24a03e115ead2937bf9dcd80572ad +a8e528ec2ee78389dd31d8280e07c3fdd84d49556a0969d9d5c134d9a55cd79e1d65463367b9512389f125ed956bc36a +942c66589b24f93e81fe3a3be3db0cd4d15a93fb75260b1f7419f58d66afaa57c8d2d8e6571536790e2b415eec348fd9 +83fe4184b4b277d8bf65fb747b3c944170824b5832751057e43465526560f60da6e5bbee2f183cb20b896a20197168c7 +88a71aada494e22c48db673d9e203eef7a4e551d25063b126017066c7c241ee82bedaa35741de4bd78a3dd8e21a8af44 +8c642a3186ca264aac16ee5e27bd8da7e40e9c67ae159b5d32daa87b7de394bf2d7e80e7efb1a5506c53bfd6edd8c2c3 +81855d6de9a59cef51bef12c72f07f1e0e8fe324fcc7ec3f850a532e96dcd434c247130610aaee413956f56b31cbb0dc +a01e61390dcd56a58ad2fcdb3275704ddfbedef3ba8b7c5fce4814a6cdd03d19d985dba6fd3383d4db089444ea9b9b4d +96494e89cbf3f9b69488a875434302000c2c49b5d07e5ff048a5b4a8147c98291ae222529b61bb66f1903b2e988e5425 +b9689b3e8dddc6ec9d5c42ba9877f02c1779b2c912bba5183778dc2f022b49aed21c61c8ec7e3c02d74fe3f020a15986 +a2a85e213b80b0511395da318cbb9935c87b82c305f717a264155a28a2ea204e9e726bae04ce6f012e331bd6730cbb9d +91b70f44c7d8c5980ce77e9033a34b05781cbe773854d3f49d2905cc711a3d87c20d5d496801ad6fd82438874ce732b8 +884596417ff741bb4d11925d73852ffeea7161c7f232be3bdce9e6bbe7884c3a784f8f1807356ae49d336b7b53a2b495 +ae2aed8ab6951d8d768789f5bc5d638838d290d33ccc152edfb123e88ba04c6272b44294b0c460880451ad7b3868cc6a +89d8ebfb9beebc77189d27de31c55f823da87798a50bca21622cbf871e5d9f1d3182cf32ee9b90f157e6ce298e9efccf +afd00a4db4c2ed93cf047378c9402914b6b3255779f3bb47ded4ab206acb7eaebba0fd7762928e681b1aebcfee994adc +a2e49b6cd32e95d141ebc29f8c0b398bb5e1a04945f09e7e30a4062142111cd7aa712ac0e3e6394cfb73dd854f41ad77 +ae8e714ab6e01812a4de5828d84060f626358bb2b955f6fb99ae887b0d5ce4f67ebc079ab9e27d189bf1d3f24f7c2014 +a3100c1eebf46d604e75ebf78569c25acf938d112b29ccbe1a91582f6bd8ef5548ae3961c808d3fb73936ac244e28dbc +a9a02dcff0e93d47ead9cdddc4759971c2d848580bf50e117eb100cafca6afeaa7b87208513d5f96b1e1440ffc1b0212 +894ab01462137e1b0db7b84920a3b677fbb46c52b6f4c15320ef64f985e0fc05cec84cd48f389ce039779d5376966ea3 +b1e40e8399ee793e5f501c9c43bde23538e3ce473c20a9f914f4a64f5b565748d13ab2406efe40a048965ee4476113e4 +a5a7d97a19e636238968670a916d007bf2ce6ae8e352345d274101d0bbe3ac9b898f5b85814a7e4c433dd22ac2e000ff +b6394c43b82923231d93fd0aa8124b757163ba62df369898b9481f0118cb85375d0caac979a198ece432dbb4eb7cc357 +82d522ae3ff4fe2c607b34b42af6f39c0cf96fcfe1f5b1812fca21c8d20cece78376da86dcbd6cdb140e23c93ae0bcb2 +b6e0d986383bc4955508d35af92f2993e7e89db745f4525948c5274cfd500880cb5a9d58a5b13d96f6368bb266a4433e +b0b4325772ec156571d740c404e1add233fb693579f653b0fae0042b03157d3b904838f05c321d2d30f2dbd27c4d08ad +ac41367250263a2099006ef80c30bac1d2f25731d4874be623b6e315c45b0dc9a65f530fce82fb3dc25bd0610008c760 +b6c0b1ed7df53da04a6f3e796d3bfa186f9551c523bc67898bc0ecfc6b4a4a22f8c4d3bfc740ebf7b9fa5b0ea9431808 +8e78fca17346601219d01e5cd6a4837161a7c8f86fe2a8d93574d8006da5f06ae7c48eea7d2b70992c2a69184619663c +a21f91f47e04fafbfafacf3185b6863766a2d0c324ccac2c3853a4748af5897dbbe31d91473b480f646121339c9bae2d +a464d68786ab1fc64bd8734fce0be6fbe8dc021d3e771ff492ada76eedff466577c25e282b7c8ab4c1fd95ef5ff3631e +829a24badc7714081e03509ccfb00818ce40430682c1c0e4a399cd10b690bda1f921aabcbf1edfb1d8a2e98e6c0cedd6 +87ccf7e4bbcb818ef525435e7a7f039ecbb9c6670b0af163173da38cbdb07f18bc0b40b7e0c771a74e5a4bc8f12dfe2c +94087bd2af9dbeb449eb7f014cfbf3ee4348c0f47cde7dc0ad401a3c18481a8a33b89322227dee0822244965ae5a2abb +896b83ed78724dac8a3d5a75a99de8e056a083690152c303326aa833618b93ef9ec19ab8c6ef0efe9da2dbcccac54431 +821e6a0d7ccf3c7bd6a6cc67cde6c5b92fb96542cb6b4e65a44bbc90bbc40c51ff9e04702cb69dd2452f39a2ff562898 +b35b2096cda729090663a49cb09656c019fef1fc69a88496028d3a258ad2b3fd6d91ab832163eaa0077989f647e85e7e +b7857ef62c56d8bce62476cdb2ab965eddff24d932e20fc992bd820598686defe6cc0a7232d2be342696c2990d80721a +b343d974dfda3f6589043acd25d53aecf7c34b1e980ae135a55cda554ff55e531bc7c2dfe89b0d2c30e523c7b065dad1 +8d139e16a73cd892b75f3f4e445a10d55d1118f8eeafc75b259d098338419e72e950df6ca49cb45677a3c4e16fb19cdc +817b8535bd759da392b2c5760c51b3952ecf663662a137c997f595c533cd561ed7e655673c11144242160e41d1f2dd71 +817ee0f0819b0ccb794df17982d5b4332abff5fec5e23b69579db2767855642156d9b9acccf6ceab43332ccc8d2744dc +9835d2b652aec9b0eba0c8e3b6169567e257a6a3f274ec705dbc250ee63f0f8e4b342e47b9e0c280c778208483d47af8 +b78c40177f54f0e6d03083a4f50d8e56b5aafdb90f1b047bb504777d6e27be5a58170330aee12fbaa5f1e9d4f944acfc +ab8eebacf3806fac7ab951f6a9f3695545e2e3b839ca399a4ef360a73e77f089bb53d3d31dbd84ddfde55e5f013626e0 +96c411fc6aecca39d07d2aff44d94b40814d8cfc4ee5a192fd23b54589b2801694d820a0dd217e44863ccff31dda891b +8249c424a0caf87d4f7ff255950bbc64064d4d1b093324bfe99583e8457c1f50e6996e3517bf281aa9b252c2a7c5a83a +acf6ed86121821a3dd63f3875b185c5ebe024bdb37878c8a8d558943d36db0616545a60db90789c0925295f45d021225 +a37f155621a789f774dd13e57016b8e91b3a2512b5c75377ec8871b22a66db99655d101f57acaecd93115297caabfc21 +92e60ee245bd4d349f1c656e034b1a7f0c6415a39ac4c54d383112734305488b3b90b0145024255735e0a32f38dba656 +acec614e562ccfc93366309cfdc78c7d7ee0a23e3a7782a4fc4807b8803e6ebfb894a489d03e9a3c817ff2ec14813eba +b912f9dd26ed552cb14b007b893e6ed2494d12517e5761dbeb88521270144f8c3eb9571a0ad444b30a8a65e80bd95996 +8375408dae79c547a29e9a9e5d4ec8241b36b82e45e4ca3b0c36d2227c02d17bb171528d3778eac3bbdc75d6c4e8a367 +8c2d0e6e4406836da112edbbb63996408bb3cda4a2712fd245e4bb29a0100fdc89a2746d859b84a94565bc1cfa681813 +a7431bf59e111c072d28c97626cd54fcdf018421d053a787d2aef454b91251ee8ff9d3702d06b088f92b9ad2bbebff15 +8f3659b0fbeb90b7f30b7a49233325e806551a32911a654dca86e290b314483bbb33fe6482387bc48c35d85c1dd0441c +8dca5ba23f0bb76f7dacabf12886053552ba829a72827b472a2f01e19a893155cdce65f1fb670000f43e8c75ba015a31 +8c1514c083c77624eeb5d995d60994a2866192e15c4474d0be4189fae0e9dbd62494ebb4c02fbc176b53be548abbc5a1 +80498d2ed153381baf3b0f81da839ed0eea6af5796c422b8e59be805dba48c4395bb97824ac308170bb4f14f319c5ddf +84f5ebc3bf96362457993e9fa31493c31c4283075e2403f63d581b6b0db8a3df294b2085643f2007f4de38cb5d627776 +958e6e38774da518193a98397978dbc73d1c3827b4996ec00b4183da2c305a187a0ada9aa306242814b229a395be83c9 +ab8b8fbf73845615e7fab3e09e96cc181159eab09f36b4c1239b3c03313c9aeb4bbb51e16316fe338b2319ed2571b810 +977e4e33b33bd53394e591eba4f9a183e13704c61e467d74b28f4ad0b69aa51501a5221cb1e0e42bcb548ca518caa619 +a9bb7ecb9846cc30d04aad56d253c3df7004cebb272f6adf7b40a84adef9f57291e0d08d64c961b9fc406cdb198aab9b +8d2b72dc36406a545a9da44e1fddfb953d4894710ca026d6421a4ac91e02d0373a599f2acfe41d8258bc9679cf6f43d3 +904192fc8fe250f61ecb8a36abbbccae85f592bbf00c10039c30b5a1c733d752a04e4fd8a1000c6578616f8a16aa83a3 +87f5fdfe20bbbf931b529ec9be77bbfcc398cad9d932d29f62c846e08a91d2f47ae56ad5345122d62a56f629f9a76c4d +84cc3a53b2e7b7e03015f796b6cb7c32d6ded95c5b49c233ac27fafa792994b43c93cda6e618b66fce381f3db69838ba +aab58da10d7bbe091788988d43d66a335644f3d0897bbc98df27dcc0c0fcee0ac72e24f1abdd77e25196a1d0d0728e98 +a10ea8677c2b7da563d84aa91a314a54cab27bb417c257826ebdd3b045d2a0f12729fe630bbbf785d04874f99f26bee8 +acc4970ef2a4435937a9b8a5a5a311226ca188d8f26af1adfcd6efb2376a59155b9a9ff1cff591bde4b684887d5da6e5 +8dc7cf6fcca483c44eb55e7fb924bf3f76cf79b411ae4b01c6c968910877ac9c166b71350f4d935f19bdffb056477961 +ac2dd1182ded2054c2f4dbf27b71a0b517fb57193733a4e4e56aca8a069cff5078ffd3fd033683d076c1c639a4de63c7 +932ec87c450cd0dc678daf8c63cd1bf46124fa472934e517fbbfb78199f288ff7f354b36e0cc6c8739d3f496cfe0913b +b0d631ced213e8492be60ea334dbe3b7799b86d85d5e8e70d02beef3ae87b1d76e1df3bdb5f7ba8a41904c96f6a64455 +929d7239ead7575867e26b536b8badf2e11ca37840034d0e5c77039f8cce122eff5a1bf6e0bcadde6b3858e9f483d475 +aaae5d372d02ee25b14de585af6fbc48f2c7cd2a6af4f08352951b45aa469599eff41e820df642ca1a0f881120e89dbe +b23c411741a6b059f04fa4f5fd9dd10e2a64915f2de6ea31e39c32f2f347a776a953320e5f7613fcb1167efe502f5c5c +a4581b0ae633fe29c6f09928e5efb16db019eeac57f79fef2fa1d3c9bee42ce0e852bc60b9d0133265373747e52a67a4 +81b33afffd7b2575d4a9a1c5dd6eee675c084f82e06b9b3a52a3c9f76e087f12dca6e0ffddc42fb81ce1adb559d47a38 +89cc890f06b424591556aabdfdbb36d7a23700425e90c9cfed7d3da226b4debe414ac5bdf175273828ce6c5355712514 +a4399438be75cfae2bf825496704da5ed9001bed8538d8ac346c8cf0d4407808e9ee67573eb95fe1c6872ac21f639aaa +ad537f7ce74a1ca9a46fc06f15c1c8a6c32363bd6ac78a3c579ed8f84252e38a914cac16709fe65360e822ef47896de4 +8e53b69f5e3e86b86299452e20ea8068b49565d0d0ab5d50ce00158a18403ae44e1b078a3cfd3f919aa81eb049a30c6e +a59f2542c67a430fd3526215c60c02353ee18af2ff87cb6231a2564fe59b8efec421f18d8b8cc7f084675ecf57b3fd05 +b8d9bac93ef56cb4026dd1c731d92260a608fd55b8321e39166678e1dab834d0efddb717685da87786caeb1aaf258089 +aa2df56f4c6fe9e0f899116c37302675f796a1608338700f05a13e779eb7cf278e01947864a8c2c74cc9d9a763804446 +b0108ff2e327dcb6982961232bf7a9a0356d4297902f4b38d380ff1b954bfbcae0093df0f133dd9e84d5966c7b1aada7 +b06b813b01fe7f8cf05b79dc95006f0c01d73101583d456278d71cd78638df2b1115897072b20947943fa263ddab0cd6 +aa41e6c4d50da8abf0ea3c3901412fe9c9dff885383e2c0c0c50ed2f770ada888a27ea08bbb5342b5ff402e7b1230f12 +a48635dbb7debac10cb93d422c2910e5358ba0c584b73f9845028af4a763fd20da8f928b54b27782b27ca47e631ebf38 +80a574c208e994799e4fa9ef895163f33153bc6487491d817c4049e376054c641c4717bda8efbeb09152fa421a7268a7 +b592bfd78ae228afc219c186589b9b0b5c571e314976d1ed5c1642db9159d577679a73c049cfc3dcfefcd5a4f174eeea +aa1f08af3918c61eadf567a5b1a3cdcdfb1b925f23f1f9e3c47889762f4d979d64686ce1ce990055ef8c1030d98daa3b +857df4cfd56d41c6d0c7fcc1c657e83c888253bae58d33b86e0803a37461be5a57140a77fb4b61108d1d8565091ada1c +8fae66a72361df509d253012a94160d84d0b2260822c788927d32fd3c89500500908c8f850ef70df68ddaeb077fd0820 +aa1dbefc9aef1e7b896ff7303837053c63cfb5c8a3d8204680d3228ac16c23636748fe59286468c99699ae668e769a0c +b64b1cb2ba28665ed10bad1dddc42f3f97383c39bad463c6615b527302e2aaf93eb6062946d2150bd41c329697d101be +b6d35e3b524186e9065cee73ea17c082feff1811b5ab5519dd7991cdff2f397e3a79655969755309bd08c7d5a66f5d78 +a4dae7f584270743bbba8bb633bdb8bc4dcc43580e53d3e9e509ff6c327e384f14104b5bdfe5c662dc6568806950da37 +aae84d3d9ad4e237b07c199813a42ed2af3bf641339c342d9abf7ebec29b5bd06249c4488ce5c9277d87f7b71b3ddd37 +b82a463cf643821618a058bddf9f2acb34ac86a8de42a0fa18c9626e51c20351d27a9575398a31227e21e291b0da183e +8b6c921e8707aded3ea693f490322971b1a7f64786ef071bc9826c73a06bd8ae6bf21bc980425769627b529d30b253ce +80724937b27fc50f033c11c50835c632369f0905f413b1713a2b0a2274bec5d7a30438e94193d479ba6679dbe09a65ef +a1d9b259a2ca9cff8af6678b3af0a290c2f51e9cf26d5fe3c6a4fa3d28cbf33cb709b7f78b4f61cb9419427983c61925 +96a3e69a5ed7a98ce59c4481f2ffb75be9542122ad0eb4952c84d4536760df217854d4ec561ce2f4a79d3793c22fa4f4 +990c4d9a4a22d63a8976d34833cafc35936b165f04aed3504e9b435f0de1be4c83b097bbaa062483cf3dee3833b4f5b6 +b9bf5e4b270aec4a0dc219457b5fed984b548892c4b700482525ba1a7df19284464f841dab94abfabcaa9a7b7a757484 +acaecf49cb4786d17cf867d7a93bd4ffee0781766e11b5c1b29089ae0024c859d11b45828fbff5330b888543264d74a9 +b0e1a0865b1e6f9e4a0e31d0c885526ac06678acc526fda5124742a2c303bd0e8871a0cb7951ec8ed9540fc247c8d844 +82b3d327b3d1a631758451e12870816956cd0cef91fcf313a90dd533d5291193a0ff3cc447054564ce68c9b027a7ffd7 +a2843602abb98f0f83e000f3415039788da1e9a096bfe8fed6b99bab96df948c814560424ffebe755cb72f40436fb590 +ab1c7b43cf838798d1e314bc26e04fc021e99a7bfbfc8ffde62fa8d7f92139de86a377289d5177021154229de01ede15 +95e5cf5dd87ae3aed41b03c6c55f9dfad38dc126b17e7e587c156f7745c8da0bd1d60acb718fc1a03b61344f01e3de4d +86f021a3762bb47167f80d4ef1b1c873a91fe83409f9704f192efeebbc3ece0729cd2f92f63419907ea38ae47bc907d2 +aaa1445dafbbcd645d4332d9806225e9346ee5ac6b22ad45e8922134fe12f3d433f567a6a4c19efdd9d5775a7de1e92f +8fd7e15688eef75df7b8bca3d61bc9fca4f56e047cdb6d0b864e7d1c4966eac27d6094b0c8482b49739f83ec51050198 +80aab8b4d394eb011d4ec6a4c2815617308c9b847c6fa6a3d7e6af1c79420ef6ff2a13934a398581c40ee4cf1cac02ac +8970b97ac076a1d8a321ce00eada0edf974a46bf3cc26f6854e4218cdfc8d2b0c32199d9658f254b4fbae5a2c5535f41 +a1aa2ec5b03df0a630e73dd048680ed6d3032c324941423f45cd1f16038789e5e75b876a13948732e9079a422f66a9fc +b5fe5f5e2f2ae2beeb8e95859a02fc45f01f9fb0ebb2bd8ec9ec976b3e806228821a9775096d341d662bc536c4d89452 +a2bc1f170b62d0d5788b02391337b2ab157c38e725694e80aeead7383e05599be0e2f0fa27ef05db007061809356e147 +a8a69701d4a8d0d972390e9f831fd8e9f424b2c2ef069e56bd763e9e835b3ce5f7cf5de5e5c297c06ace4aa74df1067c +b43d551af4ff3873557efe3f3fb98e5ede9008492f181f4796dd1a6bcda8b9445c155e8146966baa812afae1abe06b48 +b4b1dae44fd596813f30602ab20e9b1fb20cb1bd650daacc97b7e054e5c0178b8131d439a9e5b142ca483cc012a362b3 +b95b8a94c30a831eaaebea98c65cc5d0228c78afd6603d4aa426d8186aecc951f1a11c33951f51df04c7e6fa43ffb5ae +b100059624cf9db371bec80013a57a8f296d006c139a8766308f1ea821c7eccc26cad65bc640ab3f6cef9062653bf17d +8e5a2cb76716e0000d13bce5ef87acac307362a6096f090f5f64e5c5c71a10fddfdee8435e7166ba8c3ad8c3f540f3e4 +93d2c43e21588c1e83c4255c52604b4ac3f40e656352d1827e95dd5222a45aebff9674e34fbbe7ed21eca77bd9b8dcbc +8aeaed611546bb9073b07512a9a1f38a7f436ab45e11775a0f9754baaf63e9bcc7bb59b47546a5ded5e4ba2f698e3b5f +af9e6792e74a1163fe27612f999a2f3cfa9048914c5bef69e3b2a75162bb0ce6ece81af699ad7f0c5278a8df0ba000d2 +850bf2d5d34791c371a36404036ad6fdcd8fb62d1bb17a57e88bda7a78ea322397ce24d1abf4d0c89b9cf0b4cc42feb3 +87f7e2a1625e2b7861b11d593aaac933ed08a7c768aebd00a45d893ed295bbb6ed865037b152bb574d70be006ddc1791 +8dcce8f4ad163b29a2348ea15431c2c6ea1189ece88d2790e9f46b9125bd790b22503ec391bc2dee8f35419863b2c50c +b4bf5266c37f12421dd684b29517982d5e4b65dfdfba5fc7bd7479fd854aabf250627498f1e1188a51c0a88d848ec951 +8651623c690247f747af8fdffdc3e5f73d0662bc3279fa2423a3c654af9b6433b9e5e0155f1ce53857e67388e7e3401d +b155120f196d52760129dde2e2b1990039b99484cdc948fa98095cd23da87679850f522e5955eae34ac267d2144160d3 +aec8115e8d7b6601fbceeccf92e35845a06706d46acd188452c9f7d49abef14c6b3a9a9369a8bab2fd4eb9288e2aaca5 +998a8ca4dc0f145f67a8c456f1d6a7323c4836fe036dcbb0f27eb1c596d121eb97369638a9908cfaf218c7706f266245 +b235fbafac62802742ee3d26b1f4e887f7d2da4d711ba7f9bb6ca024de7beec1de66bb830ce96d69538f7dcb93c51b26 +9258d2ddc21ab4e3edcde7eb7f6a382a29f1b626003cc6fdd8858be90f4ad13240072d8a8d44ef8de51ca4f477fa6c45 +99d038487821c948142c678acd8c792960993dd8cb5e02cb229153a1ee9f88249f4ad9007f08e5d82e2a71fb96bb5f32 +a88ee9dbc73d3d8e0f447b76fdb3a27936bde479a58d5799176885583dc93830ac58bca9087075950ea75100cf51af23 +88b9b15816e5a0387153c1f4b90f613beb3ea4596037da01a81fdd2bcbd0baf5598db99f77e7694e5a0d35e822758108 +907ae4b637d06b15846ee27d08c9c9af42df261c5bdd10cf5bc71f8e5ca34b33ac2405307023c50bdb8dc7b98a2cd5fe +9393d6900e1d2d1a1e42412fefd99578d9ac1d855c90a3e7930a739085496448609d674ca9b34016ad91f22d1cac538e +a28ac56b216730b7dcdb5ab3fc22d424c21a677db99a9897a89ed253ea83acfd9d83125133f5be6d9cd92298df110af8 +b027590ee8766f1e352f831fda732adbaf77152485223ad5489ef3b0ce2d2e9f98d547c111fe133847ebb738987fb928 +a9cc08fbd5c3fee8f77cf6eb996a5cafa195df5134dab000e4d0312f970a5577942ee89794e618074f49841f1f933a42 +a8b3535c3df0b1a409d3fc740527ee7dd5ac21756115cde6f87f98cc7623f50cfcf16790689cab113ee7c35a5bd4879f +b61420227b97e5603ae8a716c6759b619f02b8fdc48acbf854352aa6519dad74b97bacc1723ca564cbf3ca48539ed773 +853762498de80eebf955a6c8ddd259af463e4e25f0b6ba7b6a27b19bdbf4c585de55760a16e2d9345cdba6b2a02610f3 +a711c1b13fc6c30745203c5d06390e6c82bd7c50f61734aa8d99c626faba30119bc910be63ec916c91ba53f8483c05a8 +b488c0a793f4481f46b5875d96eecd73e46209a91677769f0890c5e002ecd7d4b1c9f4ba68c47fbed40e3857b1d8717a +a651c5e812ae65b1c66d92c607e80be330737ea49c1dcfe019c0ecea0f41a320406935bb09206a4abff0d1c24599b9ad +85e34e7d96e4b97db98a43247b6c244383b11ca10bf4777364acf509a6faa618bc973e2136a4693fbc8ab597e308fd5a +99837214102b394fffa7f3883759554c6bb7a070f5c809303595a44195e02b9a169460dc6bbffb62bdc0e7ced5f0a5c1 +a952f89c0afb4bdae8c62b89cc3cfb60d0576ba4fe01a5d99534792f38d8848d919b3fc7577435d8443a044d2ee0bcfa +a1ac1f81acb29798acdfc493854663519e2d1b0e9d23d286ce33882c34b4c1c0bb43dd9638166d8026315a44d9ec92a8 +ac9c58aa38219ae659d23007cc7b97fd25b7b610b2d81a8f9f94ddb089efc49c049a8ea4c56e6eaf7b6498f422a97b3c +87e61d501c242b484fb9a937ef21d485f6678d75257fc8fe831b528979068cadbe7e12b49c34058ec96d70a9d179ab14 +aa45f6852f35cc8b65a4a8b5380641d2602a4fa4e3a035db9664df3ac2e170b1280c4a8b7b55161430063e54de4158a6 +a46975614ddde6d134753c8d82c381966f87203d6e5a5fb99a93b0d43aa461466b37f07b8d0973a1abd6ee2b40f24348 +8d35f97297773422351f4d99564c1359ef1a10cfb60aa0e6c8985a78f39b4268486312c8ebf9dd2ef50a771aa03158eb +8497c6242102d21e8b3ade9a9896c96308ab39171ab74cbd94e304c47598e2c2a7b0a0822492ac5c076ba91d4176481d +973f8fcb5f26915b3a3ef6fe58cc44bc7f4e115cd0ad9727d8d1b8113e126ae2e253a19922c5433be4ab2311a839c214 +ae3ee9f1d765a9baf54b4617a289c3b24930aa8d57658a6b0b113bbf9b000c4a78499296c6f428bbb64755dfd4f795d2 +a5be7a8e522ef3dcf9d2951220faf22bb865d050f4af2880b8483222ff7aad7c0866219fcc573df9d829c6efbb517f98 +a5f3c7fabd7853a57695c5ad6d5b99167d08b5414e35ed1068ae386e0cb1ee2afbbe4d2b9024379b6fc3b10c39024d36 +978d5592d4798c9e6baceff095413589461267d6a5b56cd558ec85011342da16f4365d879b905168256f61d36d891b1f +b7b6eaffa095ecbd76d6e1e88ceebabaf674d9ef7e331e875c6d9b9faa1762c800ff1ea597c214c28080f67a50a96c1e +8a1ab53ae5ceaa42e06e58dd8faf6c215fc09ba111ca9eeb800612334d30d5971448be90fec62ed194328aadd8c8eecc +a9ca532cac8ace9a9e845382f8a7840bf40cb426f2fcad8a2f40aadbb400b3a74021627cc9351b0966b841b30284962e +8dddeda8854c8e7ddc52676dd1d0fed1da610ed5415ddd7d25b835bd8420a6f83d7b67ec682270c9648b2e2186343591 +888906aac64fd41d5c518a832d4e044fdc430cfe142fd431caf4676cafc58853ce576f098910d729011be0a9d50d67b5 +96a3f886a2824e750b1e2ea5c587132f52a0c5e3ff192260d8783c666206bd8ebd539933816d7cdd97e4bc374e0b1edf +a150a29ffb2632cc7ec560983d9804cd6da3596c0c25956d27eb04776508eae809659fc883834269437871735de5f9ed +81f7ad4d2959d9d4009d1dfbc6fee38f930f163eb5eac11e98dc38bd2f7f224e3f5c767583f8e52d58d34f3417a6cf90 +97ccac905ea7d9c6349132dd0397b6a2de9e57fd2d70f55e50860e019de15c20171a50b28a5c00ef90d43b838253b3d1 +95694f00c21e8a205d6cbda09956b5b6ec9242ec8c799a91f515b07dcc7de3b6f573e2c0ba149f5a83700cda2d1df0f5 +82bbc3c4a3b3997584903db30fffd182a266c7d1df3e913f908d5a53122fa12cf5acd11d915d85d5bd110fcc43cee736 +8d3f24b4949aa1b4162c28dfbb9f813dd1d8b330f71325448dc45ea34d59b69ca95059402aae011e1b5aba6e536bc6ec +92c734c19752d24782331e74c9af97a8399ddfdd32954e91cda7363dba876aca4f730b451c50a8913950420682da8121 +8653d2c79f77b8c7dcdf7e8dee42433998aeedf1b583abfca686d47a854de1b75e9a4351580c96d1a2a9532659203361 +886f0e414cb558c1a534a1916d3531320a9b6024639712ffe18164ce6313993a553e2b9aafe9c0716318f81a5d0bb1da +b31b5efaba5a5020c3bcea0f54860e0688c2c3f27b9b0e44b45d745158f484e474d5d3b1a0044dd6753c7fb4bf8ace34 +b2d615bbdfdc042d6f67a6170127392d99f0e77ae17b0e1be6786ff2f281795f1bf11f83f2e0f8723b5cdd1db1856e09 +a6e014cca531e6ac2922239b5bee39d69d9ba6d0fa96a4b812217dd342657d35606f0b9c5a317efd423cdb1047815e3d +a8921736b69c9fbb29f443715174bac753e908251804620c542fad6cfbfda7bdfe287f2902f30b043a8a4b4818cfdeef +8d73a9949a042ec2dcefa476e454cd9877eee543b1a6b3b96a78ffcff87421e8b26dd54d5b3192ac32073cb36497acc3 +b936a71ee8df0e48867f3790adf55dc8efc6585024128de2495f8873bd00fd9fa0984472125e801ed9c3cdce6698f160 +82f69c06209c28f64874e850601dda56af44ffc864f42efa8f9c6a0758207bf0a00f583840982dec0a517ab899a98e5b +b7a0a14411101473406f30e82f14b13e6efc9699e7193c0be04bb43d1b49e8c54812ce0f9b39131a20379c4c39d3bbe3 +81159c969f38107af3b858d7582b22925a7ccced02fae3698482d7e9cdc6c568e959651991c6cf16c53a997442054b61 +8bf1116a206e0ce9199fcab6ed2b44a9e46e8143bff3ed3f1431f8d55508fe2728b8902670cfd8d9b316f575f288ed9d +a279b2149824b64144eb92f5a36b22036d34a52bd5a66e5da4b61fbc95af6eda8e485c7914f448abd8674fc14d268d9d +8b98279b5f3588d1a2f8589d2756458690a502728800f8d94b28e00df842a101c96ab9c5aee87c5bbe65552c0c383b80 +b4a27a351ec54420f94e0a0a79d7c7a7337940399646631baca93eeab5fd429d7fb39428be77dcbce64a13eaa3c8ca1d +90c08baa29ec8338ffce381eae3d23ce3f6ba54e5242dec21dc3caaed69cac13f2ab5e8d9d719bc95720fa182eee399c +85156d65bb4fef69ffd539ab918b3286105ca6f1c36a74351ab3310b339727483433e8f8784791f47b4ba35ca933c379 +923005013c27209d07c06a6b92b0cbb248a69c5e15c600bbcc643e8dcd2402adebd94dd4cafb44ec422a127e9780aaec +863b23eb5463a6ef5a12039edc2f8e18e3c97b244841bc50af02459b1bcc558367edf2f6e4fe69f45f37887469dd536d +87a4a7708a112724ff9b69ebb25d623b5cae362ae0946daed2ec80e917800dbfcd69f999c253542533242e7b9a5cc959 +8bf4347ceea7f94b53564f26b1a4749a16f13bf71a9e03a546f906f7c423089820ff217066159b0637d9d6824e9c101c +ab07eef925d264145971628a39e4dd93ff849767f68ed06065802cf22756fc6bf384cf6d9ab174bfc1a87bcc37b037aa +8e3f10a42fad43887d522dc76b1480063267991c2457c39f1e790e0c16c03e38a4c8e79a0b7622892464957bf517ebd8 +a8722fc7b1acf0be18f6ddf3ee97a5a9b02a98da5bc1126a8b7bf10d18ee415be9a85668eb604ef5a1f48659bc447eb5 +878d6b2a9c0aca8e2bc2a5eb7dd8d842aa839bbd7754860c396a641d5794eab88a55f8448de7dbddf9e201cbc54fe481 +ada881c167d39d368c1e9b283cf50491c6bfc66072815608ba23ab468cfbd31ca1bd7f140e158e0d9e4d7ebfa670bc2d +a2b48578fa899d77a7ee1b9cb1e228b40c20b303b3d403fd6612649c81e7db5a7313ba9702adc89627b5fd7439f8b754 +8e051280e10551558dcb5522120ac9216281c29071c0371aaa9bde52961fe26b21d78de3f98cb8cd63e65cff86d1b25c +a7c5022047930c958e499e8051056c5244ae03beb60d4ba9fe666ab77a913a067324dfb6debcb4da4694645145716c9d +95cff6ec03e38c5ab0f6f8dccde252d91856093d8429b7494efc7772996e7985d2d6965307c7fdfa484559c129cca9f9 +993eb550d5e8661791f63e2fa259ab1f78a0e3edad467eb419b076a70923fede2e00ddc48a961d20001aaae89fad11e8 +abb2826e4d4b381d64787a09934b9c4fe1d5f5742f90858228e484f3c546e16ee8a2a0b0a952d834a93154a8b18f3d16 +a922ca9f2061996e65ef38a7c5c7755e59d8d5ce27d577abcdd8165b23b4877398d735f9cb470a771335fc7d99ecb7fc +90f22862216f6bc1bbf5437740a47605d1ff5147b1f06f7b13fec446e4c5a4a4a84792cb244a1905f3478a36f8d7065b +87f3d9a86afef5b79ea1ca690ee1ee4bb9754b66f7c50a42ad6b99af7c222c853ca161f440a0a2a60b3b5a54e3493240 +80a9ca9a2d33b9cf61976b3860d79f5d00de89a06ef043d2a52931809018aeb4ce70423cbef375b29c2c750c2c8704c2 +b4e798ef1d615896108dae37ac50c1e859216ab6dbac11653e44d06ce5209057b4b0dd6d31dcfcda87664a23c8ef1cbd +aaed6d1e7c5b1db06f80dae6c24857daadfb0268f20e48a98fba4b76de1ebf65fb84c3be95fd6a418b498f8285ec63bd +aeceaa316c6369492c939f94809bc80e0857abac86c0d85be8066bbf61afbaaec67e28c572437a8d35c49dd596b3134f +b791c3d53ed34a7d1c8aa89b7953e3684c3cd529230824dc529739a5fbe74b58b87f01e56e7a169f61c508237ef67160 +9351f8c80634386c45c0050d2f813193f9d839173be941e2092d729be5403632a2f18dffdc323d69eb0dc31fa31c5866 +97693184d5c0056ae244dfb6709cafa23a795dc22d497a307a7f9cf442d7452024023c54a8d6bda5d90a355ba2c84f3a +85362daa003d23511ca174a8caafe83d52b6436dc4e43c4c049e5388d9211b5cbef3885896914d86d39be0dd1f910511 +a2511b5fa34b24eeb0e1bcbcf872a569d1ff5570fe7b0fb48f5542f7fe57bad808d34b50afa87580866a6cb0eba02f27 +b382e3327eb1401f2d378dbb56ac7250adde0961bd718575a64d264ffd44772c20752d4035c3ba60eb435e160b375e20 +afad8a5d40b536c0720556845a6b257ed42165c14fb4b4a874717d107752f49ed9380c5b048df3aca67287bb8fc411a8 +8fad0c98434ca5373c2d767868f679b76b4a8d04bca8240ea3f388558262c2d61b73b16fc1160932652b5688c25fffcf +83898008b5cbb6f08f8ef3ec179427869682bb4e8d38f6e6a687a214d4a307436afc64ee67d70a5a8ba9730bf839aecc +b85232e79913785fd82b06890706972b4ad7a309489930ae23390d51aa5189731f8a2df24800409a8c36b3dd6fc91275 +a24ff26ec792f3701da4c5638c1fca4fa4dae95b01827d6200d583c4caf17ea3171393ba2a8c23d1ee8b88402916f176 +adc5c7a7ff6b41d6cc386b7fc69d7bb04179bdf267864f9aa577f0f6a88438191fa81ebaf13055c2f2d7290be6421ace +a05e835abd502d31454d40a019010ff90b6b0b1f993075a35c9907aeab7a342ac0ba6144dc9379aada6119157970e9b2 +85ff07ba58463e7f153fc83f11302e9061e648a5cbd272bb0545030b20e11facd8b3ff90c9ac8c280a704fbda5c9d1b0 +a6c735ada8f4587da8cdad7ea3ada01650b5a3ecab8d81daa7a5f5de51ef4a6592b524692584306f06be3f6701f2870c +b138deee4e53ae8d677fae104f713ef1b8babfecec16b6a85785a66a72784eb09d44c3b63567222ade714e98f7d1604e +ae79c1a49dafcdd972acd95d8ad0a35c02adc7fd736d4c44c3cd13df5789d339b5ea16bddbbd43e486a061ab31baa5c0 +ab3cf2371a1d7dcd0ffe3869a0178230964b06694bf258b2073ea66a2afccd845b38485da83d02e1d607d4c5c36b78a8 +ab9609f28a325fd01cb39540e3a714506c44e52ef28ee640f361deb5760aadbb23e804663b0fa20a66e239c33f8d8bb8 +8ed95ea8e76e1b42823d7915a6aae77d93746f846bf602841dfce0e47543a36efb9ee7e5b42c73c3209d911225cc471b +a80b6162036d43811482323f0ce59eb18740e33a63d7c7bbbf3be206985919e5342d53a69df537d43e8b7d7f51e8892f +93c03d0a5083408ba00c125a8a9385213d4c860072f0297857b1235045819b904e07f2425c13a661d0a01d2e53347f4b +a6581200f00f96c461621e1d26b14a23687dd97eb9f7df4ba641a84340ee7306dc1796248fba4804f185947ad13b4385 +8be174018fa40f7e0cedc5ae68f38969eb7695f2205e9c573641e533d56f68c20abf38a23d2f0dcac371e60b21b18615 +857ad4ee3218c647c58f09b8ab22bcc8976f00a768ab1f708618e868e6143474be846422ce2710a0ed39b5155b6f13a1 +a490bec40f322d599f26bcefcdddd8f2ef6576aa737d5ce7e8d5d422741abe749e3e6a48489aed8c560633f72857e3c2 +a9c0ee339621f1c4a2410f9b4d2f03f1b558dae2973807b8bccd920e8feb7f65dfde3e79986b72ad21fcc4567240381d +8592251568e750a430f7d2c6ddbb3ec82a4dd9fd83efe389e69aa177fd97ac2c96c59a6e86db20d8e6f125d65b46c4d3 +a4e2f4aa6a682913b423b097c4069c4e46a1f3af9556b1bfd0580d0fc01e3991488458049e0735b2a629684a79271c8f +8c4f6a3e738cf74112b08b1680be08158013ef8a515a81215d8a36c9b756786d1b4cb4563923463f3329292f4b48bf6d +8bace547353c02ea00dd547eeda7259aa354d4772dd5e0c486c723cf88627b7112e196b879c3c92a9561b674d9fc486d +8d372f4901e25e8db64fa098148d4a4e709b0e9dcb756d0f90dad99dea393054193ae1a33d292a3dd772ff7ba05e4b71 +a8c7ea6a6a031ed23d65639f01f5423190775558f479700597df7ae7e338a6ae5e9b32f470aff20787ac8b7eec84df6c +b6e9dcba240fdbbf66033410a79a2dd3e9e1ffdf2eae949b3a9ed720e939d92339991dc3e70a5ac7d5253f317daf0b7d +974dec4cd61af75721071752c664d9c2a5121f06ff1515c56139a177a3ca825f763b69d431d4607e393fa74dcc91cc58 +958863e6ad583a9d370a6db3639066982e44766904e7afa849b132f6666b7d08ab931131b3bec7a506d6583e93d56767 +8b93a33b5da9b3300c20a96d80b894e3789c77041183c2cb21751579c8c96857f60cfc2f075201b64e95a78985c5b321 +b726cb9f7ef34ddbc2fad82b3b0af0b30cc913e26c5a614ae5c19cc9c55c8e6dae069db5315a8dcb6d987415bb550ca8 +a730f515398a71bddd66cab2ff996659d4e47dfbb08ce7958a41021f76d269b91c7498b708cd14b183a8ef469c772803 +a4eb3b18132eb0f5337f14e01d63ca0bec0db6a43870f800e5491db756c2f5fce519d8dba5528b4bcef550d06b33699c +b1ab6621eec1ee6784e632e214693f39a14f3715991996b883d66200963e065c86fa0667f7bc36b93b40b5d90ff708c2 +80486a26c3532ad6e19f76d8c9344e2626c07363fd495264927cb5935fa9565ece670dc98767afb04af6a9a5c9231075 +8ee20e0df3c84a1c6b0e21bcc325cf99235b747ffe47f17fdfba548a358ca75cbcc331dd50db2311b400ae882256a608 +aef4268959e5541e7ec69c921a1e81a8374d7e44bf1bb2debf4101cf3cd6b7d6ca7f441758b388de96b3e0edb5b97be9 +8793629bd29d689ec94b016de8886cac6e2ca6638911babb22db4a787661422da0639a4e4089ebeb689d173abfe75950 +b487b3551c20a29e9a5abbda8c50ff594826283e443c09e3ae09b914e46060b3f9abf70434444ce1487e2a74e562616b +8f11531cfc5997dd04b997cb87ba1831aa7041d5434fe72de66304e3f165d882fac891391fbb1eb955c65319e65293b6 +b195136875fd02a75676c33cb3e60504d5964f7a9e81f4c8c8fd38af62e2145c55f765b3158664566191188ac678f381 +b374174b0b3eb04fa49eb4ece45173f0db5d829eac370a20a62309566e0f98b18f72f3633626893c053b7be6bfbd2366 +b2a2f6b0cf652775679b2d677048f2ed8c31a3269e6cddcc7a10e3e6fee89e486b50d9d55fbe452b79c4157c0270fb77 +892177c364dc59032594e7a6fd032286ffdf4fa0b9e3baeb37ec839faebfd2fd46c57b2c9bfe9977b59c93a9cc0ead1d +8ab7c0038a7dbb2ef200dbbe9acbc875829ecad4883792d5c6ce283de67ccd9aa935a9cc7b30b2bd9de7fca7bf2a9a05 +83745cfc78ca709835aa6c6a233c2b86fb31e3f9f6a8becf63e501f2841c4366fb7d131b746c9d3291afda714ff05579 +a723dcb67925ef007e8339dc578d2622d9bb77cfda87cca0088854a59414c02338752c56116a6c1281917842e8467c38 +8a098142da0af2254c425fdbbd0d1b1a17b2bd781391ab37f181775524b8563c64ab8a1602aee2ac6c0a82ba11a8b1d1 +b13bd7529a9b351c5d395c794c28bcb0a3167f1c992e8c062eef47be9be27895945231d249c73a0b6949daa295e14944 +a20dcd2fc2222eaae467d9f5db861040f58bcb991a26e5663ac3aa5e1ff13d0010657c5af586cc4621757add2b905073 +b818f660c3cc4e9f273c25ceeabe562c8afa8ff88529c26f2cf45ae6b2813cca5f350e3cbd56f6257c4df41722dabd25 +b225d5987108b24411bc389276f12509a45e86d5ad6b6d929af5274df0be11109c0fed329669a0acafdf3b0beaa8f2ec +91fcb6d04576d3c6bae947bb7843b430e5fb0592ae49b0a65dfa5791f4eaa4bf2c7f436c8de7360f217001c2b4e5c67a +8821f7a1424ca3fdc5d4a5606ad10dfaba6094cf36669fa9f84cf7617e50425405d14980780e1e18a1ecea7913cda896 +990dcb7f38f56521a70cb71bf4522649fcd46ac052c7feabb0748dfcac9f9c0f95d29e070d32af3cd0adbf869535e17b +b0fac1029fe2c1100f24e2f4bf10c7672199fce53513c7dde2e8d9b00702edf0143e0e1dc7ceae7dcc6994edc2422b6f +a514ebb1a33451b4915c05114db0b10168393613744df848b24e43e09f0bda23baefd9d731075198aace586615ac7911 +8b77f7953c2e67049fdca3653b8d8cf3f799677f79b954da02bdad8cc4d6c855c1c7c16b4f6f9ba35f46426ec28b2d84 +875520cfbda16ec5b1d1d00f578a910d0fc052f17870ba093e22e310bb07648d34817cc2b8811b6f52de535f7046a0d0 +b8c77b4be0b430851c4ff69e91cb770db1935d848198601393810ef395efab52deb9d5c6525472bab720273d5e0e7a79 +b6d4d437146671bdea62fb6545395ea3df39f1cdef21b8476b68e7a25aa7354f847740576d6c9f187bbae9941f0ae450 +95c642f1bccdb62cd6a2212dcdd6ff8d49aee426ca08b7cf3a9d15249d24a9eed5533f92a70c84498c0797f8a57efa27 +b617978047ed0f748c305aa7f30c2dacd0db00baa67fe0c5ce346ef0e6991dc7e05f18dcb2702467421f8390f27aa815 +86411c7a00b3e8b43bf22fb061b1f54ad9bbf632cd74395a478218389c0f544668acf3dd7726532d080ca7da9a5f8608 +97bf684a8849626c4710a6992f6c11f6b5406fd4dfe9e6aa502425aaafe9827e2c435aaf9a5d3d2ba3a4c0e8aec79ba4 +8b178e2a125b461d3180906ffba0af3dce614c64058501fdd35243ababf892d6fcdea4834ce42c25d5569452b782a709 +8ebed2c8a25c61da6a6a8cb0d8f5ea179e28869753eacc728f2c076f7aed8598cd3aa0981f120f9e7ea55b3a689ae882 +a6f235b8e655ca3d634740b53d8c0a757ecc75d2b8838b7948997c1985473d01943d935f687b86cee56cd47c8e773443 +a7959c465a9646908b9d8032a589e41a7dd999f2ffc54bb42f22e5f8a4d8c493a31bcc7ea2cac6c8dbcc59acace7181b +96d0532df2e12da20a57cadb6cf5f6c4ee1aa4775629358c25f1d51677a3e96d1fe3b232532324b4f02f941952d4cc68 +90f493473d686b639a30d1ddc9c72eae6e983f1236e162e58e967a477c0654973ea2e1bdf4ba1a44d7247bc1befc2cab +8b2d87876d9c4085102a07ebb41c565ba69acab99ffc03efc18f20e48d3f3bbe4fc6ddab9c78fe479d9ada80504d85ba +829a0fb3200a28e09cacd6c5346000e7786116ddfd898f37dfd17bef454a8abc0fe939ed8735c00769f7f2f33cd4f906 +86194ec9e88ddb7150e8b03e7a535b6e99863fc6762835601efd03615aa97aaeb413cb210e86035086ed852b39c9d019 +b02efd116a7189cb317ceae392bc301ae55470f0489fa89934e182aeb8c67e280299b975786fe9a470bff46827defb9b +87d7c3903bd22b12d815506f150373f518d47dfc6e5fd74347d88b518124c9923d1e4c98defeb3a45d53d50b423e2175 +a1a430406b28254a7d6348bc98e697e9bab43839aa05d53faee97546f84541ea0b559162619b2045182938f69bf61cae +99d243c226c61c6697fb3d2594f3533fa5dfd7cfc87107908cacde337d7a077fa5a9dc702d26081b065edb1227498e65 +800ee5006ab6217161f42db0cfc552a81728bb4fbd7af6e4620ea099a65ef6664184af3f65a07fcec7e965529c5b49bf +91bfd307579cadc8f81009558605be3edbcb8dbba271475803484017f40130b2b216aef4f620d960193be681877d3a53 +96a060459dec458d19a6f8af6e49dc6c7c58c55dd18915c5fce5e0f4b4a422fce3b9632f6059388fe760289abf70f173 +9921a37f3e657222c7fda3588418a9071409711d9f1fccede7494429f02a45fbc52d79fbb64e9ccd518f60d06d0520d3 +81052b0d15773cb75975ca9230ebb2579700e489c7e3f07cd9cde206fef38b8139bd4976d2b4a7840495fc645f96df03 +88ac37ba66d1de5e23878c992e4d54023729e97e77351f50dc5918d738b5a73faf1dc6feec7e85784761836ba1c6f778 +ae1e6072c13060775f6086d1ae1f88b627ffcb810fc0e0e97deea1f3a15ef0aaa52a6dce2563e4beedadc131af2a8281 +8b60a340f5e4f90badf83001b495ac9f13974c3d2054ddcb3e6b8ca99dec5cd63a263e05c282454191ab2e087d5a2911 +832e2d56ba69dbf817b2b9dbd25c1538d5b8dbf5d9bc05e6be85054a423ebb66a71b157e166e0b9444ac171b34b7ccc9 +8586036fc7dde1e7e3ecb61663130c4529866ae9f5f5095b9fccd24a4c70eea899aae5f10ea1ba66d1665b2d83be35b0 +a77969453b5c083a207913272b5b69d4ccbd8718bdf54be8fbe11b4bd0a2168aae3ba8f9362afa69c0ffa28d7e5a2340 +b7fe9568c214baad0ac5f83745611b481f744ec1c4fa78a549b180dcf79633e5ba75dc20055012a13d849eb7a9be57d3 +b01cad1d2a6c51c0ce88243d1f52f95fb5ee315a905079688027511f0c4ecd0563a3a81846709d272fa5ccb9665e8043 +8eae0a21adfc569aa57237654021c2bdb2c6f0f52ccc90a126682c21a1f9413c63d285f92b2b2f8649150a9284bf70b7 +942acc947192b5f3cf60e92383e5d35f79e7a5904e8e9fd1c8a351676c83ad29b0afb6578d555457cf909f8f4d27adfd +a74e092f8628fba9abcabc27e2e9f3d5a9a941dfe50a2dfde2ad179aabc73afd196676925c2d98643ab8b3d02bdb66ad +896159daa2afd757cf3f9d34af248ad68bb3c62e4c9ac49919422727479cf669098f270b9e645607a7d11adad4c889b2 +a428d8370813d78e7a2a24eebd36e9da2f8bb3605e5a39b5fcda939b531c35a8ebaaa642ba556250a37bddeec90326fb +a5fa04eb60a1d5ee9820e78f42f7be15e1c02757b539aead995768c6209684d6c183c71d282e0c12a4c15c03f9a89d4d +93c77d5d220e40affa7269a6915c076c9aef4db552c643ae5d560a79c955b491c6346ca4cf11cbb7fe1894e28d47b065 +802e605d2de745eef6981d88e7a57ef4046a2062725e8080995374cea2b3273c27f35b7774d0dcba014710d8d6c501f2 +82f7169e6ec9b3e2bd450f35ea2e66d06bcf900acf5b73139677b48e078ce2e16599103027b2326770c99c0a690f2015 +b0c8581879439f9b997551233fe2de71aa03604f9cec37a7b18c5854342d9b67be468f3cac4bf6f64fe8a0066248c498 +a3f626848a4db6e9fb01cac90d3362ec521e969ebd5228af694ea3671061476149f13d652942ac1e39f65591fed740f9 +88a8e759b9cbe16a7c16e43f4afa2de6100d2eafa4dee75ccd653ec38c919013d0a6b35c1ee1eaee7c1985b58bcc9e92 +a3d5fc7aaea072798490616552d947e95f49cf02a420314307aafb555287ec607d75589ba24b009cd68299dc6f7942fa +a809cceeb84f9bcf3c3ddafde3041e7bc3b1d14df8830ab849002176a0725e6f16f70774d8962cb0b8ac0dc43c4ac66f +b8f2e46c031cc8fa160a08c2ebdfa85345ed14771b06daa9636b0e7792b7fddbc501dfc85cc626a01104a43a7d3230c3 +b5367e2a521c318b802ce16ceac80c4b8139f73ddb10ddf38433397cda70a86ea1f051cc55626a4e99d27f30f3975ff5 +96d963660121c1441cd13141279cd371a6a0aa18b6a20761b18df60aa9c14e13489afd83695a0921d5232efe72045f07 +80818d492fd85d666bd91aaf6257b86527fdd796773c793407df1d4a0f91d74649a6bab4d15155c36ed4c6e0a32c5636 +931e22918905fd6c230d3d867ea42861f3074d320d14e1929031924c8ac209a5c552b679b24563bb12f9749b4ee983bd +a4de2c333e74ed9bfa3c0bf6a0beb90427abd9aa4221294cda74331646b58ef46ed57cccc8798ba2b9309894b17cfd69 +883881554c1d88c0ed8d3b6dec3d200f6fea69a77ace3e4d6f86b41506a23724b4394ec8384075f9c75c3868ba8a8e8e +aa0539ecf6ec9bf06f24443027f8f24b6b3d8c5b2084248eecd4bcad3c9a69716e1a0d01057f09a65bff1006ac5e157a +856d74d44c943c9e809b42dc493dff20eca03cb0cf5ed45108c69b1f90d8592a53ae8100e99380a274fafad23e74cdfc +9188257446661c88da093b7c5ce998135913f63842d7c1586065377b169ee35b062d925367fb9b909ca971f1188667b1 +8d3aa57cdafbe998938787479f5d590c1484c6dbe94e6c487e57a746ef5252be0eaa5976d6270de7db64b6b92e57a0f7 +b8f4d6997240f9eda5aca0c43323a828d1563c491b3db2087f60ac4120a3fcd06075fb42bb19d0339ab5ee3fb7db25d2 +ad247ea94b8ae1e81eae4c9fd7b39e6601b53cff47b2547ff90a3cca87192eae28408082774a1fd14bf9ab459b7a4f1f +9598598070f8bdbcc49056c40971e673726cd8c1bc4baa0b5124dfb5fb750e7baa7a7df18eae2bd91955ddcb1ec67955 +b874131ab1608667fa60ea29092d090859eed1812e90c609afff96d79e82c5ba546f617f4c96fc32c9bba97431c1e9af +b00750a9cdc75c2a54f0d3cc99b0fe02300754f25166f7ac85ff41ab5e9cfcca33a29be76a480f12a2d410c7cd5032e5 +84b5bd1c90bb6c66755b28ba4af493ca1b0c3a4df9f436aac67d2e07289053f925cf6a149a84e74e1027dc8758150179 +99caf64bd9d193ff306e8ab5da3f1bb2a190a60c3a82099b8d03d17fa810dc53d176c21379f479e828f60d25beb3ffd0 +a8fd9de502f1c261d5733430e5a18d8b7892a98c9529a016fc2ee53892ae965dcd9c75850bcda4c7edb980b8d88e60ea +848c02cac636e047028a3fe8c1bf4066fb7591b96b0340f8fbd476ff01b35fa3e37d309333771a134f24800e5f3f9289 +a1eab1a06dcca3439f0166441e7e7f2f5b56f5f8aa9f45e411c561f556e0fb71c514c06c26ac53b49a576caca5faac3d +aa603f970dcbe953e700e61c151182c8d32cbbb53ceef572ac93383db33a4b098b5c7b267e42d514ca66b740c0925efe +b55fd5301bd700ddb0b4f72fabe9a91ad49759506101fa802ed1677e9553595aa4d2c66f7574e78d21ce882ce0120ae7 +829137bc4da7b4886d3d04d2c39cbf4b1dc40c813ac1adb425c7b9abf9142b516314cab79c68454df5d71994ce416144 +b83a3a22735001f783dd48a01c4fb3598a51ff3987e842b8045c71c035b9e43645a55254ca5911a5676ef4a8af12d056 +8ca8d463deb13f9eef5e533bc39efaeb0c15631282c5c0deee1673b0053a7cccd514af09801dd6c158caa159fe9351ac +a9ffb1427828f3c456b9c8cc50782de1ab0029b9233a0fd998bad0fd014d27e15c4a32d1e16ad41bff748378b5abdf49 +9627e29f725ddd86456aff813976bbc4a836f4deabf5ad9f73d1a260ceb30948824df9c8841e6b3c529652202be181b3 +b52c988647fe3d9276eed3c262e1044f57fbb116c64cf4f207235c205b3fda0f3d789bf90f5217401b468d85fdfda404 +833bbd6e2924f5c4446cb76b881d1434a5badce9eb9b003f85d076e297ad7ef45b822069fe54d17427a348c3263fb838 +a067a36352db6f82a116cb87d3db5f60b18576852409e2076cbbfc7843af78866313a4969385a40271051dd195d51116 +902b99545971f9a103f99d7399acc347ac46fe156166e51deefc0e92aebf5893460c69aeeae11f5af9f49418e289ce6c +9206a0e9ce9b9880f29ef0417c96931985f5d83bb17cebdbba4ff2af81a3d37155b04649426f698aed372e4f669599e6 +b54a5d7c976e45c0b1d44433595eae9d1ae9aeabfd58cd5ecb0c5804756a7b01c9a517754423b4714a3695533a3114c8 +91b612131e84580ece228b81ace83da0269b53f94d3c02a1a0879ebbd81bdc252064b3d03a7e140b43a90f237d9a45a0 +a6cead3b8607eaeafe37135bd6de8fbd16f806c131eb71c8d36bfbe295d45b070255e50dabf076e2c3f6b8699be71d6a +931da21e67b11ba6ce438546a24d063bcd51aebe39b4220a78d9c0aab88b2d37969b5ef3502d835507f9c8d6d006714c +8fda408caa9daf01122a2308b7b9d328f52e1e2f138a8bec30492488f4d710e5e52524a6455a3a2ae2818ec8a610b650 +ad8ad5c189644352d90c462731c46145410e5adf38682bb80f95495dd64d9d13782537d68690847bbb06c6be7175dbc7 +87bb5cc466ade60feb0961421c3fabdc8a7e20f11df8437bfff63d3f8bd25305002a396c9d0fa4fb9a9986d4717f12c4 +827cff72870ba00c29064a7d2b4973f322d6b6de7924c93d8bf8825e7a0e8478c7748f90f5c716bf83c55b2795d315d8 +a225895a8e94229776ceb51b05356291f2dce748be17a60d5aeb33ef8507c368bafe5d1d6eea927f28b9d1422b661b9a +8e011323ce670ff51c964241a6b72e0e0ffbb3ff9bb2762492323fc3a4abf4718091be0945287c7329850e4f74462cde +a2c03c2e5f4e9d3ef361f68b188451994ad1b24de9f323370559c8abfcdc7bffd289d92e78a5f6b104b0a12c84dab2ef +a22b4771116ce22276fab1fec6826610707ce8a342f9f60b079c4e0259dac3cc41c96c560dfd0ada6edd2828f7c0e8d6 +97c17441d0af9be83b42097aa8b7cec84a253b9a2b957214b8fa93c26d2add46144faffa7b8a55312059b10690f711f1 +94bdf348849f31a2737cbae5e5848aee711067bac85c11c2e68b44c398cfafbf3493a3226cd1ddf7a916e7613fc7b6f6 +838f59c6e8469a8ec6fd40b978a3607439aaebe1e50ff707eec72c0b8278af05b477bf12a384b56d03e3d4eb91e56f67 +a1940f0db58185e2b3aedd2b0bc2b73b4a65c68e09b046f38e9dcd4e13c94f5406bea92635190bf315e48ec64eceef2f +b2f4e0ae44e1f1210a91d8f280f17091fa994034ba8c991583f8182a323e9b3001a712e3584fc2d64ecbf2d319d076b2 +9342b89c721338d02c7854cd7466fb24d93d7313b6114ea591e6607439c8ddb911d1cf35f01898e9c557982bdff8f9b6 +8583fcab15be1dd14d5a415f4b14d706c8c62f058500f1344b37730c8be6741779691f87ded3cbcf6516468b373cafb0 +8fa9587c7989646571ad9032f34cedd353caee14f5be5cde1e9e0a1710f90c08faf6fa96a60e1f150f761c9c8ae7417d +8d9ff904cc08141f5a9879f5f77dc600e6edbe859082231a4d819953890199bcc5f940b730ea688332f07e5279d49e1c +b5f82b46e5ef9a2df8d144202d6e2e4f3bdae8e2048d2af5ea7deb3f722fbe6d370401954e74ff0d8cb1010ffb1f38d5 +a3b5b57d435b06ed70530e060002a8fea71746ad07d969ca23f22b5e52624527595b6a6d54b4e953fb7b7596bac378f0 +b90f89390df6d4b7879b915aa3c29b8d779d035033f8873bb7ac54a14ec98f0d08c0e3bf696e2ffa7b5730d736f571f8 +8e81e371b92887e43d95c0dbdcc9575282b26ccebdc8cbf46587e4f2a83b61e9bc0c6d7d1f114b9d21e04fd6c180b12a +8d682947c51dffc6e0fe0a486293c9ed121f441805168236393087cf62f2a429cca60bf0e472564844347d32c6bea27e +a8341ec7dd189fa7168759240224192c58209b53fc961c18082deba217928c399bde08ceae42bffd37c1135b4d14a845 +a94bb076dcc5ee5ec82fac57c5b384c690df12631882bd1b960e1eb8c04f787bc22b7bac315b9dc5a8a098f17f051a0b +ab64e1c6f01b87706c88a3bd974454a438722768de7340b834ccf93ea9880c14ee7c2181432acf51f980d56de73832ee +b7b0058bb724d879e5ad7aed6230297c54cb599ef659e86bf2cc84c38225899fb388391df9b2e6fdf063171937fd8c72 +ae856f4fb74c27cc98b67429186e7df4feb01278cd57bfd3170af6e52e0a23b9e926bf9565a890cfb4ae8f2d590b2cd5 +804b9c6702f0596d328f92fc1ed5a30a7ba17b9204524135001b569233fc4937035031d079f52fd04968f37c24013898 +84274ed1af6bd6a968583995622b4d18c6a2bc703ce0d0edce45bb736529b4836343dcd11911a94a134dca7877e6cab8 +88808098463f7505034c3b6328c8a08186b33f7a981c08376e429dd64b79b97753170531ed078dd265ded4ec0a1ed8d5 +92823bfb23a4eb84d3759e7d717f0c8641ece0927cd2ba8c728c26bb35df2629a838002f353c8d3d75eb19520aab5f25 +8db36bae4d960cdb9c51f419d7ddc81f372e56be605bc96a9d4072b829f05527c37c8f255cc6115300a2a0d2e6568d89 +a8fcdbd7f3b4d7ff04149a209feb75e97149e7efceaa42d66a6b8e432590fe7bd01f1a77fa8b47108f670b612e33fee9 +a9f4c53c62db7e5dbdea6918862d3c6d24b5bd8732a218edf0ba61e9d1861182323d8ecd7bef8f895b42970b492f6e40 +8b95bc7f07818f4d7b409aff8da0b2c2ae136cde386f53a71565cae9fd14c73c13cc1cfd79c0f97cd77839fb738c5b9a +adbd1d11adc756b51a571ddbcbf4392415231ddad93da09acfafee03a9e4f9e1ce3826110619e5271feadfaffce3e793 +95d327c8bb195cdf25fd79c98f9406a6b0316214b1630ebcce95bdaeffafa36fc1accc6882e0e5d13a8db5c0f3c0e61c +8cb2f1e2fb25558869afdacc7bb866544cfdd566cefcd048b48d458a886130bd086ecb7600a960a7f2563c61cb326510 +b3aa8c4bf5b933d89cd74ca7f7176d6624d562d7d58b041328b49d7562a30b489cb606abb3c49e85baf04c28e9cd1f44 +97f9053a85250c420599827297453c2cfde087065b823d9e43139e6a9cac3a2ec40a1b6e2f0726bdc870fff215462f0b +878d5dbe6b881389c2ca126ff66d87127c9aaa3f62f0d2c1ec0ea2b279ac95f8a06710dce166415db227655e2345a04d +b2c33a6b4203e3ca5247f0890e475518317ffc44cfbb1da9a1ba02114e8b752bea618050b876de5cf3b1906140a64471 +a56170c8313d2b5541a795bea9934d4425b185b5c409f0484df6f44f0e4bcbf50b860ff46b7245cd99c1cfa8fc1965b7 +96e2b658e2876a14147385fc423d2702a3cb76962b6b437222cf9cea39ebf4bdc03bbf434b747866d4bf72b4ceefa639 +89c4a74fa2f067e7ae49c84ef782c331bcc9245db7e941804e2e99d12e987b4d25cb827778ad4c3566c4fc68018650b6 +a01d30cea7d01c80ff26650020fab02e78fc3842e2398a81b44b21d58d4e9816166ff4ed2418831fa995a28ff35cb6f1 +b960c80b55a8845bbf24bc3f23b0110ca701f9544ab6a5bb7929330213cb471321e55c390ceca3e24bff69bdb0d331c0 +802c5b13f22be7be0e5db11eb3be0f0ea7f9182c932265060ba05fba20ea093dd2810d3b969ee3e387e60fe6ee834e8d +92478f88ef7435d15e39a97916c736abb28ea318394b88678fddbbaab3eaf31776110936abad116a8ff6ca632dd12043 +a6d3da0370c303001d5ed99d1db8bce1f26b0e442f0f042e36db9674e92dcd6e80465e772f1e669f99221caee3392fe9 +938f04f70a8f947d6df2f0c0e9af3cce0c06edbb3c131970dd60884fc0b0a0959c504a2a36c3ff76dfe919905671626a +a7117e55224230822e9983df2132347eb7208cb6798f291df926ab51e04b1a1f78d5568c9a8924ee6f57426134360f20 +b91074c77ad93fe48dc2b10c0c5a62ca3ab7d98345b919c52d84a9dc419b59fc1b267e1c2d4b2e120016ef84bbdb0cbe +aa175c6b6edf02fe8778762c9575581c0ee6efc9dbf99c291a41444a23a056b893be6c45333d907d0bbe9fb0eef84d08 +ad36dcb4e2ab425aa339ae464b038d550cb11186741dcf257f1b8b80ed4f32ffabbece45e2dc1525d4c3eeed819ea04f +91cb35c1ffa9cd5aebef523edb8325078da3eb5cf9e95c675a76446fc7692aaee6f949de064ca2f3e0f082cc3fa93e20 +82622f9410c143a86bc4d756b3c7b324dc295231ce865de020d61cc0868f2c150a473cea3a5b756b36771ce1032415a5 +a5c29996ad3a53468ece9356a5b4ccb68971ea1c89cf39644f1da2d4a477c2ea99bf791ef902b87c225d8c53d67c4c92 +92893eceed1af34fa92b23dcbab175b6a0188a27dbac9ad3317c4e39955a763cb383ab13fb1c519cde311d8a4d12e8b3 +8a093cb191b94b0200e38d31955f9d240e2be1edcd6810a2396a061f17c3ddc9c4f4d56766ddff4e121be7110e03b869 +93981473df0cb1f4b47c7d9b64e3123dcf1593845b401e619f5d7c70b5dbea375d1ca43fca65845fcf0a6b2e0af43791 +a6beb6b0697070f9562910add88d9ba91992f8da127b27be81868b1596d1012f09ea7ed601b4a6474c921a1a1a6d866c +92026b1ee30f2ed61c9f30337c3356844217926aabdff383c19ca3c21e0bc49811ca5b308012bee4ef250cfae1615800 +ac0ebaea6d35f84dac4ce648af096305ba68a7a0aea0a11ab2fbe3162075444a158433c98141bc92ef3b3400d6deb46a +83046f482dee24ac3ca83373f0d1b82ac1c4beda0f229a9011a81ec659ff5fc1fb105e219975b5c744308c77a24f71e4 +aa5a312c47ff7248dcb9c6ffbe5a0628ccd565c07365c4413734d415cd4fb35772622ed833862dddff520a67c509c6a5 +a02fb88805c34018ac33582e19ed0a7e4616acc3dd0867e5f21914c2031c05c6dca30b8b35b57c2b137750f3878a6f8c +a60528f1f14bf0c496491d46a0fbbd6c343e4eb3f1631e92f96a3c5e5c684091aabe5801df7a67f7c6dfd1b0d35269d4 +a1fd8e7fad8ca05a340c05a051bb0eb4197eed345f4104629a9e38e234b09d789cc5537024615feb4a6177d32d39e39e +8e70e36c1aa070815440e19443f1f04aae23b1b59fdbcba43b47b94a026c82c8f66c5dfe54f826f4d95ee1930cdb8008 +8234c1969fa7e9079661e4ca309b71b1aaa10f4372be0b963205c23a81f5a3d52ec08ba9ff65b37f832b52d631580d61 +a18cb4134127fb37c4abca328cd0047378a2e1423490af2bd3eba9ffcc99ca81a3c22404c0886f21f65c7b93c41d7981 +b46fa45fe538816de776eec086e040005706cb3eca097e290abfb6864e745c879868aac8361894f3c3564373ef9ad55c +b96ca43b96c59e95439f75d1e726a35a9362f0dbd34963b156e103e080a8126a8dc3501f9fd541ff3bcf4677f5c4a86b +a8e8c87c7301613818d57387009e601a7ab5cbdc2890f63d985c30c74f9cea2d0584c116baf0d9cd5594386ee93fc661 +b47e4f1b9153ef0981f813948150f283b47a7346fd9921d51fe8e4daedaef78ddeb4fd467c2ccb7cebd9816243da1c6e +a370c202a99c8441ffe96fad0f801086d4d7cc7b960f6e98cca29ceedf492afddfd0f351c9c4d29ac008bc255ec1a2a8 +8f5e6ce1655d1c059b006174e3f5a55c88e1821c97f9702ad8e8455d46c2a83ae4482f2d43edda74a835686ec45a8a15 +a30421e694930a3b65d397b2720d5f8e1eec2b6e2bb5a28d3f9b0a84db9aabd83850268bae64c2b10e313cccf120151b +8abe87163046f7a9b18e2a3c0b66e258facc1b31431420e0b70354b7a60ebd250a784634a76692e7d6f4330b62114945 +894f033cf077d4eb312e3258d9dca414356271abce1d6094ecce6d018c5fadb1c15d8d69451574ad0701a2876db191c5 +b0923d64f88ffc872654e1a294bb1af8681689c21cf08f39afe51448a68e60a9a0a74ccce9969276a932a52c07d095a3 +b9ca23b5be8725fae7fa710eefd45522889c50c29c26384e00b78a962384f0aeff9d15cb5910e9565da12a577eb7e5ba +b242ccf292757197a9f470f2d80ccddc48c7f1235ba026bc68a93be2738bc968e8a200aff3e2f4807216442eb3fc50dc +adc2c3b375b308524b79a024ff87d122055440643fea6fc0a651bdb312c7cbe6a456afa9d342bc76446d77d8daf08bc2 +ab645955356c2ebf2f3df9da275e01daf0b44a52afc309277d6d9ad1b05484e5ae0d9d41ad485fe481e5e362826a86ae +8de96ac587a4449fcc8b7fd0a51b4b5185d9c2eb3434f94cbadd092de1e26b0f6b3f7b15a37e8424b1429121ddca0ecd +94c70ad4e9b871566f3da98170b665a09788d421818299857cde0853789fb943cbcf7d4b2c95246ea7b72edc56a8e36c +b2574be63497843340700b701d5cc8be6d23125bd62058802ee67cce1f3b5f5602b27c93fea5611f27dc695ac563f042 +869ec89da7850cedd88bcb3a50a15cece233119b31b64a61bf6b2310892ce42d8b473b584b11e61db29ed24ce8033f83 +8fbaa269da8e28e9adf4c1b08f109da786dbe9cba871c32eecbfb10619b7a5d65a26f9bb33e201a8ed20b3de94003fbb +8bf7a059c37242caf7f821a6314e4e4adf799e0dd86b37892a7172598892c07272acebd05b534755c57b51556b2d610f +b4e72645fca459898cdd9214892ed08b5c99f82049c0a30d72bac0b9717caa9c6cc16c3dc7aa6ea4d42dcd2a6c175df6 +a39170da87a3495da55bbb9701c5461f3403447174ed6a4af75712f7ba4ac35f51a4234bc4b94da888a0959ee109c0c7 +b45675b2774ea7696089dbf7a0afe6c22e85fd0e4ef3db508fbaf96c9d07f700c991789206da9309fd291be696357c5f +b52899e3e3f6341eefcbe1291db6664bf3b6e8021d32fb9c3e37b6258a35c1da927747b2ce990937d6f4c6c3e7d020d2 +84e5bdb3dfe19700d79dd3fabb0159ccfa084f7288db836c855b827613ce8071067c8d7ac5cc2b4e88ed7f84b690f6e1 +801477d200b6d12fc6e0a9bab1c8211193ab06e44551e037a9b4c36fc2d4f67760b9ff4eba9a3bc7b6e177e891f64ff6 +b6b71a5116d3c22af26a7530f535e9b7851f25a84e562a8f17a125d55b9b3fc1bd8cfe65bdcbeeb328409521e802051c +8687e21c34d7804c12489d30680d131ce2133e2981bfa993afd8a8eeda958ebd5e6881d342d725338659882d9f21cf98 +a024e97a7c4de32b6383c34431994abc533ecdbd6be9bff836ec1af022f5a86773bf345c6f33273797a61fb70a8fd5d6 +83f784f095da20ce5b31f54d6cb14b32a8a12675f0029289c9cd036b7c87a8077be2d04a62618685720e6ee69c875e97 +b4e9dfe7cb9d9efd3fe00d99ae5e48769d4af4bf43d4e05c0b54c9cfd8bc854de96b8d3ebf4dcc06b9dac66b7471a0de +a08b79f9d4673afcf7f38b57f484f88feb7c908f597663a2417f92c348150c2be6b5603f914eba0d9d5bdd4e5c5572c1 +b0eaf919589988798cb01ba0610cd1b7fa3c08715675ece8ecd5f9ef6d5d7b2c4c8ae1ea7dfd202237171aa3e6f9de74 +abff99a98baae4dd0954052503ce81827781694a5ea8c1149f96a3adde75dc2d630e138598cd2ae7fdc7a654aa17df8f +83e369b8680d8b9d995222b033b4f4f3e3b20e782113c941325c7fa9c742feef8747e4a212d9aa23285a259cc4faef8d +b16d5855dd2716613697eba36e2fae0872aaea6999e91cf6552f93f9a0b85ed4f6ff922a91b50816bd6cf8e7a4513fc9 +848373db600e32e741aa1d37726bbb28956783f89ce2d781e95fb1ee1adf4359968a141678af268077eae4c25503204e +93a0dd0fdac18a31875564505b4e28f9e8bb2915faae666538597731ac56cd77f23f2456461e2f672983fb24ad91f6e0 +ab1ebbe49fa56524b564bc2e43784147073e6ea5d27a9540fbf2e04d0f87c645ed2fd28b3e4982cc4c0af1734ee47a6f +b3ee30b733839edab6f61f0738e3f4afaeccf700d8dc7415684f193b36d70d07acd5780cf539f12e0fbf8d4683be773a +88388f2cbdec47a6b3ae460b69eb0d2130ac14de950c22fd86de03e40d02292bb93cebe62432da39d509c1289f785fef +9370c41a54b68ff486b4cc6329c3a851716ebf1d088d77a6c56dec93a18b8a77b596cde74cc17d2adb2b2f411a2e4bbb +b9083b60dc16531f77b05a955b51a237a8f8c0173d72c352c5ca441b55abbc890b14937e457aaec4be5cbbf80cae0099 +aafff8f6c6ebaad952c65054dfc7c829453ec735331bf8135e06406b7a9f740c9a200dc48bb2175516b41f77dc160121 +b43d31fbbaf10526809e9e5bd8bb47a76e0fabd7852ee7744404559ab89f0f215ff518f3271a6aa972a459cab82ac558 +b581ede48c6ef34e678f91dc4b89507413e00e70712e3e8c32a80eed770ec8d8b98caee9702d068aeaca6f704be57bd8 +8cb0a137e68b001a5ccac61de27cac9fb78d4af7b2f5a00b8d95d33ac19cc50c69e760c5e0330a85c0ded1edce0fe6f9 +b947fca07c7aa6c2bf13048275402b00b77b28f1d0ba4b589fbcede13f93b5b931c588560ab8ceba23bb8e748031b55d +81753cced5ff819901740a9a584334e355b497cb699f0be5a52cd555a4c9f149535c7bb355b54407f7f0ec27de6c2e19 +b3d59273951ce97838c4853ec329782a255b5fc7c848e7992ded1be28a5ada7fa3254123afe32607b9991ec6e0659b08 +86b253de246f82be1cb0cef01e87c3d022ca1829d2cc7e6a160a5afbd3ca6b94d75739b122e3bb16f8bde28a8f3223ba +b728b659fa2d8487e061a37f7d14a4c2d70cc37497a8715695d8d332cb274deee2ce23b9b5f6a7408516c02c3d526a49 +81277b46d98848a45abfbe39842495659dcbb80dee985a4fc91d77d52b815487aa8bb455f411fcce4c3879c7a075a93f +b05b6f1fb4a6e654f0ee6b83e08b58b57059bb0b7c490405bc8d963c4a2d6be39c558917977e554e1e9e3169961cbf3e +88f75fa7d016fb6442551ec071cc1e2beeb3ccd213d16d744f573a82f5d70f41dd1b18af71d5f9e73d87f2f6b7dbe889 +81a46434f1bbd65a661a0ff45a0295b8fd8a42a7969c5953721bc98698b64bddee3f806876d1e9983063fdd0c11f99df +8b4f6d33c510a4c9c7d623d9ae0c9aa631fcb987704726b2a4d8519372123bce3c439202f25b5b47045ec14ce39a21a8 +8d5112b330fb63cf6ef3d2164b404c14ff9907d685015701399a260951912b19b8f270f869df317e9050a127763d7980 +aadab394e84dfb82db15ecd2427f39b62352c3e1647c3bcd14fb24ae830ad0116f0fed87ddb63963b424a4741961386e +81ca4e5600d00a3bda24cbdea7a532a4cbbd893c10e7ff10667c15ffa8138b91667abe5466b31a3dcdd60155c48538c1 +ad943af1b8a5fcfcf309ed8f2f916339f254cd555c71a407a47365a139306286a05a8314e1c70e20a65fccd75d36fa12 +b16597a0b437060a390467bbfab94c0bdd695ae898894f4689f939e30cc2119cc08ecb594546304adf876f4e275ebcd9 +a44a4e0a6693be356065891c27eefa040a1a79475be53d54d5fdcea7e0668ff9b35f850974000ed119f6865aa6faa721 +adef27d1b6e6921f4eaf69c79e2e01f5174f7033eaafdd33edcfa5119af23f3a834ffe1bdf19576581b797abd1865b34 +90c1e9202f3ffe28f8e1f58e9650dc4ff4dbc158005b6f2296ec36147e524b4f2f87f8aafc39db5b006fe0c491c92f45 +ac817cd54288b6f7fe6338415344fc9e7b669414051631ab2f27851c052c044be06bf7235d668e194bef695923256368 +ab14944ef653a14456d4ebc12e3196df3f1b4707c4e50b317b5ccc8ca3a0720f0330609f0e7e71793f6ca01583f38c70 +ad5353f2f380837e5ffdf079350b3d42935a0517861d03af98db5ed3ea8501abd68885c8c65f5a66e944b1874826a450 +8b5583863f84af8443ce8970b02e26cc5d959e47efbf8a66a54106ab165f1f76b36423aee74c7b5402fd1c4d7c1adfe6 +b3b46037eed9fc30e4f8f0da8bdbdcc40a38e22e876ce9fde981883017854aba82c18eb00887d92ad847d30082fe7271 +98a2b6fc90b7ad172e4368c1e54675b75c8bf2096d91c9f2b60b3397d3be3b705aed5389845dbd68f0f84438cd0f7687 +b155e800852a5f90a2eac69cc4483428da1dc2c31588a13c924e60a7616ce9baeb7d4b829c772b260277cadd8ed84719 +b8b92c520a1302b0cf7d993a52e1dacd7f27bda9868d59c55687d995ae676b7070af4c0792a9bc1c2635d44a4fee01bb +96dfe9bde526b8fc829eda825f55168b88e8f4e43d4d708cc3060df03437b46e12a8ac70d7788aa75760f6294d3e84d8 +a3fa66c54e2fa084ced3bd838614c6c33042f492a5745d167a723c60d5e7d6020ffd1747981a23f8b68df21ad8f0fa77 +b573ca10cc41fc04a642f6f62c355a4fda69b94b8e95dbb02fd1ccce4bce1191356e1fd66d372159944eb36a7071f005 +acd0a1c9abddfd0ea223eda1722aaada362d34234455bd1c6be115d41e535b16f12ca428da7820a757fa4c98884a385d +96f242eee99c4db383b8754fa7987c0c159652e1866faec905a8d3f010e0a1ad05bd77b9ea8dfd653738959180f58430 +9215a9b672a5d6e435e0e0a45156e0e20f75cbbdf1d14940fed3ddb63d433bef643796c7a4fff881829ebb2b2eba9460 +b8ad9bfceaf08dc5a874387219ddd1170bc3a5e25ed72d321d59ae713be5ddf9fdfbd3aa7ab163be28dfa0dd14614e19 +a19a1050590bc500b32c502f393e407abc3d8e683d6f6b978873aff3e3299b18b1f6b59e2b0fe237d819dbdfcfdc98ca +a6870fb11d4429686e52e1f44c8dcfc7ea24a020df9570c021578dbc1f9bdc8cf797cb3a72d7fc52805dba35d59f2cd0 +a7be733b64d5c06c127bd1c87250e42bfe30ca91ed8ce51e0b6e377f454e8f6fef7f99bff650695df2fd10c375da349b +a1b97145dab30330eea2cdc8739b2446a3704b64505fcea3dd8a9b4a72edf222e98d967d6fd7f76794acfd97aa091065 +b2127049907d2a3b654d1c940b740bfba3dbaf660f86ea79c2f909af7c9fe2a07a1caeb1be12370aeffaf8faa50f1582 +8a207701214bb28e99b0784e9228b1c34afa701966267fe7110f6f29f5bb41eaae6cdb98844d0400787978fabd224de8 +9925147a383b6f5f814520220ffdbf20b214225882c3ef49b1a1ca677709176ec82466fb9c4be2dfbe5640afb63b014a +8416ad93871623fb555b5390b80de99edaaf317350cc0c1ae9d54d59517074d40061f315cce8ba2026d9c1e6f6a1009f +a315f943deebbf0a2cdbcf3f8323e215a406e9cbfbcc3f6288714cb3a6befb1bf71b2a21ff7a2ec4731c65044c45b6b5 +8213e0c2539c24efd186ffa8b6dd401ad2233bc19166a0623b26dd1e93614bbf792823f5599ac116231e2efde9885709 +8e5cafd2f34a127a4a896f05e4d929eef06972a1826b3566446942198df26d62f7679b987db2b3765d9d8058b1cd85c2 +b5302b399c9cdf912fd59007ad4737255552663b1e56dbe64a7b2ddd88d2093c73ea319b45db2dd49d1e03f5bef1a0ae +a0c2bcfbed4b008e1a56e5d2f2419aa59d7dd0ebd990f1c18588de702ad0fa79f445d69965fa9381e700eda13b309378 +80a44eea1ffe24c26b16b8e2e70ee519258b9ad4b3e83cc4e5cca88ebc48d0160066f8b91d0581095b0de2428390c8b3 +84a90cb9c7d2f799f1c4ed060387a4b793ab41c5c3eaffd3b60face9b9c3bae93cd2017283bf3de1e3dac63d0d84dd42 +81d22febca276a05ba9bbc5591ee087b0491beb35b4d9f8fc0d041d642a574667ddc57660b20f5c568f7d61fdcb41bda +a3ac965ac27a28e102a439b74fbfc157e75fd57620e4c0750a466165f8aeecb2191dcf8e656f7525aa50d9c7c69b0b5c +913c17434ff0d9fc52e2ece4fec71b37d4474a18f3ea26925c1be2b250434d49759f58033ba0fce1c6862c6197930dc4 +ac430559c151a5e461f67b49c7786c97e1653fa8698e9759ddbdd99f5daf17fc5a012ae6330739440880728f24eba7c9 +b10d8e9f8aed9361b042d1398ec74364f7c7c1cc5c7f917060572761138bdbe89bf409389ee3879f93bc8032dd67b308 +937271005a4cc6a6ec134870c1b56471aa84ed4f4af1b3d5f334bc0c42762fae0c9a6a2828d3de6151a76dad7b72781c +a10e4dcf51889f69e6bd4c052f8d4036b9571ced98a3d7d779cbcb9fa5c3a82228566ea7cc1d012bf56dea0a40c5a64c +a0ed026528d9a8bb3201bc9dcd20598933e8c72fd315deea8da63d06e97392aa729d98a55a8a60fa4d5573513ba5c9fe +b723fcd04cddbd4c36feae827a03746ffef251c4f4c55a88beedaeeee194430a99f566f483668a0d88b13e7a4a37f1de +84a2cdceed44828c7c05a6a762edec0165e434e7029df617d6646aba48776e6c3b823f40689cee136536f8c93e08a629 +b786264e3a237ac3a1d56c9f4e87438dfed620c867100fd38b01287f5b755c7820937403bfb86644e082094d3e410a00 +92cc35b2065fca157c7bba54410f8bd85907a01c9f760aa0ddb7a82cb55811d24cb4dc6b725367a6a1c293b809a48ead +a12bbf22b117f00164a42515bc57cc9e6c43cc77fb737ee3d0c0cad94cb50cd3847d61cab469cf8ca76f7958bdcfc771 +85985b00de533bde2a757eddf53be79ea39091d16af3fc92327bcd1cd59bf2bf4411a334da29ad775e8ffaf3cea7d7b8 +af9eb24185b0d330d0ea1d0b0fa78af0dcf42ced81cb0128f16cafdea687a9c5582bb6d7c5744117b271cd0b3303f0b5 +8c8aaa1d85ed6327f85d579767c7a9158d209171b3efcb3e8a9d9e534c078e821b6aade255101d2c9ef6d67ba66f10be +a450518a03ffb40e1df89e0f88fd55b5b06f4872cdfb7ec55f40dc40d9424b3b289866336c195bdd54597d95569e0096 +81e61cc69f93c435bd77f155e80626a9c764dd92b6c76af15c41346527948d8a6ca87d6351a0fe7987e2ee3aa66a9625 +b615e0cebf4fdff4cb23a20c8389c370915ba26aa703b28efe4ab070b1603d1c5b6541684acf46b52a915f6aee447539 +a7f51885c7a71885cc84ef734ecd107e8bf5f7a25131415f671d143cc1de92859e65001125323c7985799993af6c410d +abfbf7a46f32066989c32f774edcc68163f085ca81e94fe8c9fb32f8d451bbb2c20ac45cd8d97f9e618ab40186933b1a +8cf35a522b5cac1934004aa9dd236bc77198d43272888afa860cfc79b4b28dabf7a3c74098f84510897566fdd609aa45 +86aa927df78f7a06a4985eb0a4f0b93529cef14f9fd2812d46abffbf25e618ead14d99c70e3c3bb2e17f3f7fabc9c264 +860f1b4f4a398e9a8bb4739587cf96979cfbbe1687b7e91e5bd1198db726391b09b1a261bf12e96698818f60b5bd3537 +8e7c4ee19ff115881051e8637dce1f5d6c65e865d0c757e8ce41b6d7bcd86c7070cce60649692bbf28c868c7e2e1e2f4 +acf7ba01b0220419f09169ac8d16e5cc13dce08e88c90b8fdfaa33aab417f011a20b79a178d8a9f7211589d2e0affd7d +b404bde8e715aefbb9f20a353b911b79173ef3e2cf0aba98b5ae6190b90597d65043b0b4e014ad9ea6c77da2d213ea12 +97e3615d1c77a402253bb55da2d1cdf82de316cefffe42b1022c94b4818d6dc4a313731db85321c537914bdf716a875c +940e950b96a4096a578c6874d747515936652b9b113a5f27f5a834a610867b05f9881e2679b0b289b8527baa0009b6dd +8de15a13ca236a3a285ce6e6826c502ae7365bbe468b6e8ac67b15b0bb49be0e996f1eec81ef69e4b7f54f8e4779a054 +a12244777eacb08ecd42b5676b3a51153022ab97e9353ace0f47c6054c22de9ba60d2a60f59a36841c2a791cb1b7c288 +94f7580203e39a2642ee2e7c969b9911f011d7f3a90c398e1302d26edb3df03df1d0c43baa1c6cf90dde95296d49e742 +82ead33144aaecab965faf63af384565992f38fc1066e71e33d53f43ac93892e27fe78c4eaca1cccbc53364e26ff31e9 +a0c129e9706d354249a7f8aa664ccd7ede89aa1445c5547410814b56d10dc086720953363ab1da8ff5f1ed5d8e575104 +93b3057bf3f74edc95237781ae012cc4b1d3fd0455565ceaac7110290aa518ac32478ba4eb9851555fa87270fcc84f1f +949c2fd0b94f31f7cbf00c679bd3f6ec1a2f4056654708d39edf1a450b4e19a6e251d0bb24eb765087e698f61d3fca2c +99fd2e50e211ccb66b895eb2fc42f260f3ad5767f04c2fe238b81dae98aa6e3977443a51f4fe7b43f499caabe45699a5 +84fe19626503218f327b5325bfd7c0c3d2614b47d34964aa0259d564e769c6c81502132cc1765b0b31fbe39852706927 +b43287ec29d9010bec4284de58fed48dd1e129bac79f09d45153c9949131782f77b11b0c9f8ee06a39e5e9bbaa8e2c6d +908902f3ed45482df2f94415fc8e5a308057a40c8905d7cbbd58ec4848e19276577b7f7e69e5e684a8b981738e10f7ef +85cc7d9c1eae372b4f88758cd6e21604b4bc9f0794e1e74b6d9de96347f81944d01331385fae7a38e5f6096c1dc23465 +af60288c702082fc258b3dbd6952c6b75c1641a623905f491b1e72f49b9d39b33d150a336450abd3911a4c128166acdf +a7d8ac7e589558c4014369ab6f4c1f2196205b03e4278152ec0dbbd7ba54e803c3369a71d364a773aac8dbbd117e4a13 +9833aed34e48c206e9328073597aee1123f5bec085339b4e6839a389a429bf3042798a31fac1464ce963204adface76b +84631a4f012bbb62133030224b57deb32dcf464cacc8ffde7775adbe68707263ab5527a1c75e597e03aa703ba658b889 +a686a61f6467858a2a4c13e70ad81b1901290d3e51bbc0c6e366f9e652f575e91b11c75f640ccef8b0c6c1b05a43c9a0 +b585f0ffd5144907703b41539bfad7f9f058f5985f63db911064ba6b07af8da2796b84b16db42b8d11135c3f846cd9e2 +b525539516c7bb25f1d7e165f269dc8c9eedbba74df44887e178ab8fd798e2a31f39812ca922d6b64d91564f14012a64 +91e480d7568fd2fae39c35b0a8d623e66a3160fee1dd4e9097255004938b11ac1cd3918dc6a1e5fbcb700c95a547e5e8 +936ef55c69b842b6177de71fa48dc5442bf5132116b214302f8f242ca36a273a6bbfbfaf373777104dadbe8e7da5e970 +8e950c0f6688abdff8a3b8bd77be6da6f2565c7b55711f5860ea62a3ab1d51aac31821c602bc11a45e33c69e7dde3ea4 +90eed4595104a0527f8db1e028ff622ff70db4eae99cf47f6c2a0246ec7b103570a6a9a877e32e9647cc74969006743d +b756344f6c4ea05b792e416d9bd9ce9dd4bd904e7622761f28a85628506bfc9d88a25e5f04db62fad30a92fb1d8d8556 +ad79ba76534c1a02ac3e9b7308d390792984cd75b7e1d0e5e4ff123642d99d4ea1825643091aa8117336333c40d5bd94 +832b08144887de0c0341d84f6945450af8d7a4eb32367d7703118186c1be525df9382ce61fed5f3b65a0bb3449185f7f +a322fb944e46d8e47994820890c94af423674716da810ea1da71e0a7733ad72c22114ca39a4b59c98ce4291a5684c154 +b982851a65140dbea79bd3b5487e236feccee051deddcc17c2853032efca289ddb6eaf64be3dd85a73012fdbe9d2d4f3 +8eed5e230e201830b44b9fadca4e156fe1a16bf840cf29da0f381ea0587b20c226de2465c67e6268973e776809af68e1 +81c8f1c04490f36e41a53ee1b5185cb8adbb37c258fd6c3be8c56835bf574c37183a94d55b6554fca35d6e6dd9af0133 +8c4928724107cc16d36f2976677eac0b852fc4c3c0bb2f9cd4d59cd24a113faf33b2faf405c3fcce25be51d41e42c2c4 +8e4ba842636fdfc4d71f0983538ea5037d420acd26abd12efca48c252eea85544b2fa9fccdfec4e7c2a6359baffa112d +b4315b84700e26dec26f3488d308430fdff4809c10d4c24309627911cbb769ffaad0d1ecccd622dd02194eaf5ba59f91 +ab888308f757faef32648c1db01650dbc9aea248b09d06e6efcc996d395f48ec96f2d54a02de441d753fe8737862d991 +805094cfd77e207d5c75f3cad99f41f763ec15443052cfd758c6a82ba422d831a1103a7f9b100da49c28198279c3d3dc +ad857f33243e4a2cd2a773700def21fc7f94939d1a6d2c2125ecd58fc206ccafb07a2c02a1cfce19857d3654aca2c70c +a4d12d40149953daa70b89a329e918e9d93efb4e8004a9357fe76682dab9662c8507e16db83e849340f05cdb4933a373 +a0dbac2ed4b5d03606524245e8a31080eb5bd3e9a0c51dad88c3b18e3e6bc5d64953a81c8e60425b80107ee6b62b1fb4 +86da05355900f327164a78901f6e3db857531b33b1e855df1a67a9ba222c6b05fdb6b0ffbacaeb1ba5b45ff8979b6b68 +932c9873aa3e226dd922b5a616c75153bd0390ce8f332a414b9c8cb6606c2501a37a2aa88097bc7d8e2c4261706eb38c +accd9cdf07ccdd42033ce3b105e00bfd39e2304b1e3d66f8b1128645634452c20f759ec45adcef2fdf04408f62c4cc04 +b75cfdfc1cb48918752eab17eb579820ee6e71e6667abdb64df834ffc8c1362fbbc23ca2c80dee248fe1fbb72d87dfc8 +88b998c73b00638fde7d3dd650a08c5ab996dac6ac34251337fbff3fb5ae4a25dd20c1a16c987ad7ded19eca23cea891 +8afef0956c942571a27f504553fb312cca9e50ce41b44e0466d0516c5abe4d8acf4594cdb03b1ccdbe3f2e6a9093b713 +9042cd83c5ff261e9ebda26398caa16cac2cb840d19062fa8ae50e044c27104972948318f4c866dc4d578798272d3e49 +ad536719a64570a2cd1d72b6590ea1d02c8c49f259a7867be26c8191445165954bcfad50ea12688ace3fdfb0e98143bd +97c86328d63d297b6bc9718dc1ad5a05b908a750d1c455c700d84315589128ce4eea958aef2bcf0fcf4adbd8e3ce58d1 +8e592cf0802e6a9541eeb654dc55055e11f3d757847285197132935ca35bbb1a9156829a39384dfa6f645ff89eb36738 +ac16c614998944f77590bf3913a010e13f2d3bbf6a172293baf5983506c1a2d89989fb72e598f5bba1ea10a691377c93 +ab8e6f5b46baa6632de3621497bcbdd584decb999fe7d8a3364843a1e0b76497600630b6a24dd30119d8bcbfca29f335 +abe1d3af5279e60122d9cea8cc6581c819d7a0e20e3715da0f6da7e02d13a7653db643bd946e2fa9ba338eca81fbe140 +8c33bd831ecfb18d1d0713e16beba768e9c42df62170c1f8a16764912be77f2ac5915623d1d25e8c462aa9c2f6669ca4 +903692becae4a6409f7bdb127d9b11de57a5739fe24218dcbaa0092648d5332dfeef29a908ee9e43e5e0a51a4c3639bc +92591e90347ae286acd365eba32cd9ad8f20f4c9cad2dc579b195147ff290adf0d776bcb3d4b04a25d68a941fc0c781b +b64bbccf860299aec16e1f95c768a1f337c740bde612e6ba260e393edb8b04540127194761c42597abb9bcb771c576c3 +9194f056ccfdfeb78a11c5347e2255d7a7ebd1251f9aebc0b58feb68d3e03a7dbbb74e3ef7309455853adfb4694bd01a +aa4f15f6d6a53ae65b7f6f91e8981d07a5919d2138679a561f7bb608dc4596e45ca06c9441d51fb678b2ad89ae7a17ae +90e3d18507beb30bde08c5001faf489a19ab545c177efb3f73fbf5605f9a0abcdc8bfbc44f832d6028e3e0a834bea98f +8f31dc0118c8c88a6e79e502d10e57652b7aba8409a5bf572ca63fed6b7cbad7f28bbc92ac2264f649792fc1d0715085 +a307d1067ea4c56437b6f8913aa8fcbf4a24580fc1e3336e7f6518f0f3adb9c4733090e459a3f737414ec0048179c30a +b7cc41fdf89595cd81a821669be712cd75f3a6c7a18f95da7d7a73de4f51bb0b44771c1f7cd3cd949e6f711313308716 +a9dc74e197fe60e8c0db06b18f8fe536381946edecdf31e9bd90e1ebfcad7f361544884e2fe83c23b5632912ec284faf +8b3e1e81326d611567e26ed29108f33ddb838c45bbd1355b3ae7e5d463612af64b63fff9fa8e6f2c14c8806021a5a080 +92f6537bca12778866335acc1eb4c3dfc2c8e7e5cf03399743dcea46aa66cac92ac2963b0892784263ad0ebe26ffdbf6 +b5cc0061f7a3e41513199c7dd91ac60d727366482a4c7328527f7bd4fc3509412f711bb722b4413b3736a219b843d15d +b3e9711d68d2c6f6e2cc27e385d5f603d9a1c9a96edeefa1ffdf390439954d19504d6aadc566b47e229ad4940ef020d2 +a09d0d3f0e5dc73a4a0827b72710b514bbfce4a7fcd5141d498a5aad6c38071077f50d3f91af897d9ab677b7041dedda +b177fe260f3b86e9ac21f1bfbe2682ae5dd8c9aecebb84f37054bdab6e39094e611ce582210ceeddde66adf759dadb6d +b0ac6595eba9f5dc4b2fd21856267cfbcfb5b12aa34ec69ca32b80071c5b652e85c25a224d80443d503bf25fbbfe07e9 +81f3c0e11b196bd4a2e8f07f8c037002566dc9037da81f3988add458a520c24dd1be3d43d851e28c0c6a85de4b57a542 +a44308c95615f7fedb2d2127012924468c015df9f48359cc2e36ab4223870b0bfc1e9040baabefdf5266f93afaad896b +8493ec4c32d5a13b81039f1b436eb83f259945dc950e3c6c2ccf5087ec56dd2f60890ed4edf01728b6a54950e19b35c6 +a1a439ec2a6a95bdac9aaa925ff337ba956c0d236ab5318354270e73ed6b73b4ae2d27b4c1686cf97b6526d04e65be81 +b4659b7b53c55a4b2bbe210b53520b392f893500e18990d843b72d7379d45fb44dd1dd2184348d6fd853d6b9ecc6b7c6 +afb2c68d75d00130b0e1b4f250001920213121791698ec04262db714cf7b1408d39f6cc10421f954845aad5b8250b77e +b22b843b40a97210f94043b552f348f66743055a3f274856a738e7d90a625b80e9bbb80cbbb450e1666eb56b8bd5c60f +800895ced82fe13d5fff65a93b0051c3df698bf1221b682accfdb63e3970f669ca37025750697f4e8ff2a3322ad57be4 +b21f598c50d7b9f4a584d548f85e42055ef8e24991906d973749090261584c7f4f5e984b528926f7e75375dd84d51af8 +849b1c68192d18274598dd6d0bf48fb5ee3b1ba25b331cff2d06f345bef3bed49760ca5690848cf33388f6a9a32cd646 +aeb6fd9478b10ef456f6bbb1e6dd19b14475e65497772d12cfc097948383d3fbd191bf95f046b8bf1989954118e483d0 +b1b5e0ea2835f7fc8b66e7731e392b43d16cbce04b52906b6751ab1b91978899db5fecbdabc23a19dabb253005468136 +91b6b1284770cf6f7ef35bc0b872b76c7763ffcfa68f9c8cfabcb2f264a66d47598bb9293f6a40f4c3dd33c265f45176 +b9ffed029846487c2cfb8a4bb61782bd8a878f3afdb73c377a0ebe63139fa070e3fcdc583eec3a53fdc5a421ff1fa877 +998007249d041b0b40ff546131cfc86d0b3598dcedf9a8778a223f7ed68ba4833b97324cbb1de91292b8ff51beab44b3 +8eb77ce9e0e406bf6f002870fb2fd1447646dd240df9bd485f8e0869298a1fc799d8a41b130c04370e9a9cc5c7540ca5 +853db8157462c46f2af7e8f94f2ed1c9b9a7ba2896b4973296898ff3d523d6e29e0b63a5d26cecd5e490b33c87a4cecf +b1436b6f3278768f0979ee852944258f2599977d255bea6fc912ba17c5dff5bdc850cf3e1fc52be9d6d188e868670f4f +a76acbc5832019b3b35667ab027feff49f01199a80016620f5c463dfcbfb51bf276ed17b7b683158ba450660cc7973eb +94540cdb051faf3ae8b8c52662868c2dab66bd02505c4f5f8eb4d6b2e2e5fd9a610890c5dcf8fd887eee796d2b5753a8 +aa35099666bceccf4eb3b65b13bba88e30a8be93693ab6761d8e5523343e8d6dd42d977e66499352fe4e9e9784a1dd0d +894471aad17be54319083c4b5e40adcfacf7c36c4aab0b671030b7ef321c53590a25eccd836efd20f32a93185fd315bb +8f52a9f705bb0dea958fcfbd52e2b6c08ad0f89a07a6b2942c1b4c37eead0d97a38a9e9aeb08d5d59b7fa2a9347f738b +9031c16b4f936c9cab55585dc5064739f696c3347ee2c0792320c9f749e760d120e396e8485ffc79d81c9f3337ad3d1c +82090a0d0d9b05459ec1c328ecd4707c333b784e3aaa0ef0072cee1eac83f9a653a75d83b9f63512a8c41200494826b4 +92c3a9553001f9ea4d67236b8ad1a33275378202cc1babc03f313895458f4b2549bfbbbdd37bfb8fbff0decb6b9f820a +88651868f4da37338a22bc553388df5dd1dd0cb78c4d7d07c637d8f6faef4bed72476fdcd4304d5bedf3514011135f08 +83fa0141bfebd88063f1d787719721b4c6b19ecf565b866de9d7d5d1a890e0e3d859b364bb65f8f8e688654456a40263 +90a7fab753e5d56dfc0e53a6b4e6ab14508220f3a62b3f3f30570c4c9ad225e74122635826c92e8e3227ec45e551432a +8fa375b0345bf6e5e062d108f9feaec91029345ecac67ccf1264eac77b8654cbfdda1f10579f481889c0e210254eadde +b83f06116da9daebdb013b26724523f077debaf6bc618b48a7a68858a98d275f7899c4ec73a0a827219b9248dd81c8c9 +8be1cada55e0c5ebb4fd460b2d209ae5326285a20c8bdd54ed9d1a87302f4063c8730bfda52d9d40e0d6fe43a0628465 +a68ad6f813743ec13a811f2ef3982c82d9d9ac1f7733936aa1e122f8dc7f4a305cc221579ab8fc170c3f123a1576f9ab +8878f1128214fdbbb8a0edd85223741e021508ab6d36c50d38680f2951ee713ea056ed03f62b9461897963d50ceefe0b +acc0d43d1b0260528b7425b260a5dea445b232b37240759fc65fe26f7c9d8e51569c5722bc33e94de6492f4ba1783504 +ad80b1dd717b076910ee5ceabcb762e75e4d094dc83b93b65c16de1f75bc712cef223c05d5579c1561829406c07a97d9 +a6fc9803f9c09d95fc326cc284f42ea5566255eb215dba8a9afb0be155ea11bcc55938b2d16f01cd2f2eda218c715efb +83ad733dbdfbaae8095a403dbf09130513f4ed4f08dcf8dd76ce83d1ea72999b7eea3a7b731da0d2bc80a83c6ee0e3e0 +8748912fbd08cb34a85416b0937d9c4327e9eed20d6e30aeb024a7253f14f1e0d774f3326e54738d71aae080e28da0fe +8997e78d8acf23051428af67183ae9b2c4aa42b503745ffe33df35a35103c589987e1473ab14dcd28ee78ebcb10d8e95 +a2f340502a7eb3c4a36412e6f028321372c4fa18a4743945607424e932af1271fa3e6598a162c872072529576eba6283 +868ccf19b5044ab93b45c9ed3ae34fcb504fe1453d6c4a1d12c325032cf01eb90356de82080ed897e97dba13cae33a02 +ac8867005fe4354d67aa37b866a7e581d2f94f7bd0b9f4efb5c2d1370ec13147a60692051b02fd00ae60b512bce9b1ff +8fd01886b046819c83c12bb779e432b25ba13713f9227be702074ec3abb2bba6be37220a0a26a4bd4171b99b14e32bc4 +a128981ed199f92b5959975c150a93a62fec50b61c80a3fa0634d90fc8058f76f5cbee77aae6889af12d296b30e613cd +81fe618552ff7a36c9235c6d4066cf2f930b5b38de4089e18166e4a06ca5723eadd1976d25e34b74b3ce942300b23e5b +ab1223ea049e6e0fbf9b611de7fd7c15e5e9637cbd73aa0e36aea08a7503ba6804f2aa807186fdc9aa7f4f9195f72e24 +b97285286981b2665f898abc13f3243b63005bef8db4cab3f658bf6167036b61af400f08db0fc3c640a9c623b760690d +ae3ddff7c1f0fbb6a13dbbc667a61e863c2c7c51c2051e33cd61620142e7e30a7e0c4c1f8fbb512aa3a8640267c6ac26 +99c2a89d5bef236060e51c4f952664094c20fbfca647e5d24a55c1fb8df2f3df58244fbbf3635db07b1c29ee3234fa6f +a5010764d4b9cd3b410638334d1f70c5f4843f45b4f4a9316aaea5fbb2c510a97449dd7a07b49f47334a69d37d9955d3 +86706d011dcdc9e9d165d01fea1df68dd74bedaf15a39f92893c030cafe96f4498c4c1fec2d2136354341b3f440a1462 +88fd57eb62bd7dc35722f3a0576c2138403a2f663a2603482e8974a895cf56ddbb02657dc6b89eb2cf5c1f9d1aff6426 +b0dfd4c68e3acb6bb8a776adaa421fc5e268ed4d5964bb90a727091e5113b55b3f9c6d33cedb3ee47ff7acc5df8b1749 +93b92bc942e1a636fc5c2dc1840de5faf158a113d640d5a475b48e2c56ccccaf9db0e37e90ce74c4b3f5c9ac3b2eb523 +b29a16fa1ea95cbfc1873c435ad40dc8495ba6341801b72bd95d908147dcffb1b4bb426dd635f3af4c88984f56594dd8 +b8f367105e1a2d554ac30200c66aeb579d3d30a8953d20fb6ebba2d876ec39c52ea5d654f1bb89b8ddf3d9d651f31cdf +b5fbc228c983d08adf8612eba5b3db3acff604439226f86aa133b02cce4ffde2f977c8dbb8b446b4375673f71634c89d +a399bea37d3056e0559f6644faa0af93063b4b545d504d7e228d3dbbc294af83d3c4cf37fe026b63899b4e7d50fd08f5 +928ef411a36414b24aea26fdbed4bdb1bb6bdc2d967e2553ce54c7c4e077e76869cea590257645c9129dd55ce025295c +9684a4adeed416a9ce82ad79b55c4a3adcfbd43950bc442ed8a340381caedb70f4baaaf821e3a152f483f965d8f56162 +92558a37f214d6f4cb6d72cd2f4ad24dff9d17611b9e4a41ee5c741a5d1ca9e4053b0584533ef4da206110b5dc3e2a35 +973bf0724d1785cc5e85d2a8ee8c354ad4cf557217ced0b7940f6f064024c20b2bfc5b144c820b5083da4bf70690de4d +adaf1389dfa528210ca9c2657c5ff10d51f7e3b18e93a59c37211be0506c3576cb2c04ec80cd0f82605e53c5a3556620 +85b58b223b09fda6f3ab674d75e780c49eb2167837243df049281e8f4fed653811138b398db9cdfe7405fdb8485602fe +849504d3db408d80745a07e850b0a804607b91a59922a5d3bc40da2748c029c029419cda38d2a4485cc0824c6b2504f0 +a3f4afcb353bc2582a02be758ebf0cd18752410ca2e64231176bfa23828423e0a450a65f241a9ed8eab36cae8d9c567b +ae362786cdf121206537af9590d330abbc6dc328b53cdd145dbed0e5df1364c816aae757c4c81f9d619e3698dd32bcdf +9024cfa5b0101eb02ab97866d5a3832944e5aa6888484cfba3d856576b920787b364fba5956bd7c68a305afedc958201 +8a116df09fed923acefb2aecf38a4fbc4b973ee964d67f03791d70bee6356af43ffca117d4e9463ffaf0e0d5d5e5a69f +9163016175c73f1bbc912ddfe03bd4e1db19c64951c8909ee6befe71a1249d838e0db49f03670bb4c5c9b2ab0fb4fef3 +8f6357318d8d16e7240a02b05ce5a4976b6079d49daa258789c6dbf4a47950ebe9de6411780fab06c7c1f35651433380 +8e63cbae8be7341892dbedee3111adf0307c4ee9e375181aa53478f5ba9cdce164d6ae890e5f480119a3a51c6e989165 +a9782f30674a4874d91bfba7eda63aeb5dbe66b040c768d6a925d8ee135f0655ea56276b105239cc0668fc91ddb68cd1 +8d9d94b61ab84ec08665cbe0244ea41756785df019e453ef078c19380bd44c39d2958e8465c72eacf41eed5696037805 +b1470e6f5d2e314474937cb5a3bc30c8bf5fc3f79014945f6ee895fe20028ffc272f9d3a7320aac93e36c96d8a5454e3 +a444911bbafc71179766594f3606b6eaff041826607fd3192f62dec05cd0f01b78598609a530f6930e8440db66f76713 +a9823d44e2638fca7bcc8796cc91c3eb17f46ad6db9f7f6510e093727614aa3a4f9b2c4011ef91dc1c2d224d08d8d05b +ab86020972c359ab98294212558b4b14862040139876c67fc494184b5c9bcea1dbe32fe0c8dd9e60be9daa304acd599a +b7e5cb685bbdcfdb1e48259a5d68d047846c8a35c5b3f90172fb183d1df40d22eaf0edaca2761a07c29c577000ccfed0 +8c88319dae4b28989817e79e6667fd891181e8d2ed91b9c6b614985bca14b12982462ec58b17be0463c24bbb79dd62a1 +8c1c6867e7107fb2178157c991b9c8b0f90c8d57a51220bf3650438ccabccf62da4db8a9916491e730ff3d0c106496e3 +a00a79bd58da6528b9af033087260f9f3d00519eafb4746b355204ee994e89481591b508eaa5402821083e250d38467b +8785abd7c37690f6aa870ee5c799eef72e398a7898b6767f698515be277b9c2fc1af12ea89b0620a848221343a3b5ec3 +8aadae68543db65cef71d0e230a09508d72061398ef2fabec0f856aacff2125b79c70e620744aaf331faf3dfc8afb9bc +8ff0cd437fcad9630b8a2333176a55e178db4142ec841581590594d74d5b53baeac5fb903fdf7bcf83e245b95b58285e +af274e8fad6b190be4e5dc92d2705ba6ac0d7e1ea29e958a5cdd4cb764de46a56d9eef62c999a16e7c50a50b2d9fe3a8 +865e6ec7d1aa848786d6a7a4e87a24d442311f0810b01ef5a74928ab59fdfd651e48880b49680047e5b0df6b3c7c2ecc +800706baaeb35bf3bc33bdea9a8b5cb00d82df407b3b7e1b781a9359cf44fb410ed311591080181b768aae223d9246aa +a9496389d0780b309c6998374ae159f58a8d0fe9a1c24c36cebcb45b27d818e653b51a8ee1f01e30a9b2c46a548126ef +b5fccf4fc3186661939fbee2e89c2aa0e3a6ad4907bcc98c7750520540c4c183b1bbfcdf47f2f1c5e75c3a30cdf30c75 +a90028e39081b736e628c2230cc1338f9210ed01309a40fdf08d39c10cced2cdf71271013bea6dba3a0444fe47963106 +a0815cbb325a8fecf2e1bcc5046644be32d43a8001bd5d8cf0022e4572cd0d481b3e717002f7ab21e16da5f5d16886d6 +b2024787fcda52abc4138150f15e81f4a5be442929b1651ddccbfd558029912be4d61c3c9b467605fff640edf7392494 +ab5aa60032304a584cc9245a33f528eae7157808dedd1ad83ebae00aadc25dbe1cd5917eb8b6b2c800df15e67bdd4c4d +866643847ef512c5119f2f6e4e3b8d3f4abb885f530bb16fcef0edb698a5b0768905e51536283925b6795a5e68b60ddc +806aa99c9a46ee11cc3ebf0db2344b7515db8c45b09a46a85f8b2082940a6f7263f3c9b12214116c88310e706f8e973a +a6eada8b9ff3cd010f3174f3d894eb8bb19efdbff4c6d88976514a5b9968b0f1827d8ac4fe510fb0ba92b64583734a1e +98480db817c3abbc8b7baedf9bf5674ec4afcfd0cd0fd670363510a426dad1bcf1b1cb3bf0f1860e54530deb99460291 +81ab480187af4a3dfbc87be29eca39b342a7e8e1d1df3fc61985e0e43d8d116b8eac2f1021bde4ae4e5e3606c1b67a21 +8a37df12dc997bf9b800f8fd581a614a1d5e32b843f067d63d1ca7fde2e229d24413d3a8308ec1e8389bf88154adb517 +b045a55ca0bb505bd5e8fcc4cfdd5e9af1a7d5fe7a797c7ede3f0b09712b37f493d3fcf6ef0e759d7e0157db1f583c95 +ad502e53a50691238323642e1d8b519b3c2c2f0fd6a0dd29de231f453be730cf1adc672887d97df42af0a300f7631087 +80597648f10c6d8fcd7421caf4e7f126179633078a1724817d2adc41b783723f302eabc947a7ba7767166dacf4ce8fa1 +aefb56427966c81081999dffbe89f8a0c402041929cd4e83d6612866cfbb97744f4ab802578349fbecc641fa9955e81b +a340e493fb3fb604eab864d4b18a6e40ba657003f1f88787e88e48b995da3d0ab4926ce438bdc8d100a41912a47dace0 +a6d777bfc0895eac541a092e14499ff8bf7156689d916a678b50a1460583b38e68158984bea113a0a8e970d8a6799a85 +90ce469410f0e8cfff40472817eb445770833cdcf2895a69bc32bcf959854d41712599ceb2b0422008d7300b05e62e02 +815c51be91d8516d5adc2fd61b6600957ed07cf5fdc809aa652b059bea8ed179638a19077a3f040334032f0e7900ac8b +b3ec6c0c3c007c49c6b7f7fc2ffd3d3a41cdff5ad3ac40831f53bfc0c799ffeed5f440a27acc5f64432e847cc17dd82e +823637abeab5fb19e4810b045254558d98828126e9a2d5895a34b9e4b4f49ab0a5b3ee2422f1f378995ea05df5516057 +ac05412bcf46c254f6548d8107a63928bba19ab6889de5d331eb68cf4d8ce206055b83af4cb7c6c23b50188391e93f84 +88514163c587068178302bc56e9a8b3ad2fa62afd405db92f2478bb730101358c99c0fe40020eeed818c4e251007de9c +b1e657d0f7772795b3f5a84317b889e8ded7a08ea5beb2ab437bebf56bcb508ae7215742819ed1e4ae3969995fe3b35d +a727d4f03027fe858656ca5c51240a65924915bd8bd7ffa3cfc8314a03594738234df717e78bb55a7add61a0a4501836 +b601682830fc4d48ece2bdc9f1a1d5b9a2879c40c46135f00c2c3ae1187c821412f0f0cfbc83d4e144ddd7b702ca8e78 +b5cfea436aa1f29c4446979272a8637cb277f282825674ddb3acac2c280662fb119e6b2bdd52c4b8dbf2c39b1d2070d6 +85c211645ff746669f60aa314093703b9045966604c6aa75aae28422621b256c0c2be835b87e87a00d3f144e8ab7b5f0 +867628d25bab4cb85d448fd50fdd117be1decdd57292e194a8baa0655978fae551912851660a1d5b9de7a2afbb88ef5c +a4e79c55d1b13c959ff93ddcf1747722c6312a7941a3b49f79006b3165334bab369e5469f1bddebadb12bfaff53806d5 +ac61f0973e84546487c5da7991209526c380e3731925b93228d93a93bce1283a3e0807152354f5fe7f3ea44fc447f8fe +a1aa676735a73a671a4e10de2078fd2725660052aa344ca2eb4d56ee0fd04552fe9873ee14a85b09c55708443182183a +8e2f13269f0a264ef2b772d24425bef5b9aa7ea5bbfbefbcc5fd2a5efd4927641c3d2374d0548439a9f6302d7e4ba149 +b0aacdaf27548d4f9de6e1ec3ad80e196761e3fb07c440909524a83880d78c93465aea13040e99de0e60340e5a5503cd +a41b25ae64f66de4726013538411d0ac10fdb974420352f2adb6ce2dcad7b762fd7982c8062a9bac85cdfcc4b577fd18 +b32d87d5d551f93a16ec983fd4ef9c0efcdae4f5e242ce558e77bcde8e472a0df666875af0aeec1a7c10daebebab76ea +b8515795775856e25899e487bf4e5c2b49e04b7fbe40cb3b5c25378bcccde11971da280e8b7ba44d72b8436e2066e20f +91769a608c9a32f39ca9d14d5451e10071de2fd6b0baec9a541c8fad22da75ed4946e7f8b081f79cc2a67bd2452066a9 +87b1e6dbca2b9dbc8ce67fd2f54ffe96dfcce9609210a674a4cb47dd71a8d95a5a24191d87ba4effa4a84d7db51f9ba0 +a95accf3dbcbf3798bab280cabe46e3e3688c5db29944dbe8f9bd8559d70352b0cfac023852adc67c73ce203cbb00a81 +a835f8ce7a8aa772c3d7cfe35971c33fc36aa3333b8fae5225787533a1e4839a36c84c0949410bb6aace6d4085588b1e +8ef7faa2cf93889e7a291713ab39b3a20875576a34a8072a133fed01046f8093ace6b858463e1e8a7f923d57e4e1bc38 +969ecd85643a16d937f148e15fb56c9550aefd68a638425de5058333e8c0f94b1df338eaab1bd683190bfde68460622b +8982f4c76b782b9b47a9c5aeb135278e5c991b1558e47b79328c4fae4b30b2b20c01204ff1afb62b7797879d9dee48e2 +b5098b7ba813178ced68f873c8c223e23a3283d9f1a061c95b68f37310bca4b2934a3a725fff1de1341c79bb3ba6007e +97b160787009f7b9649ed63db9387d48a669e17b2aba8656792eb4f5685bb8e6386f275476b4dfbb1b4cb0c2a69bc752 +88b69369c71daad6b84fa51a0f64a6962d8c77e555b13c035ad6fa1038e7190af455b1bd61ae328b65d6a14cf3d5f0d5 +af88b87801361f0de26bd2533554ee6f4d8067e3122b54161c313c52cc9eafea00661c5c43e2d533485d1f26da4e5510 +98ab18e3bbcb23ac1e34439849e56009bb765ab2f2558ebfd0a57cbe742169f114bceb930533fb911b22cb5a8fe172bc +9027507f1725d81e5ac0f0854c89ab627df3020fe928cb8745f887bf3310086c58fca1119fd5cd18a7d3561c042d58de +a676583f8a26e6f8991a0791916ce785b596ce372812f5eb7b4243ba9367ea95c797170fdac5b0c5e6b7f6519cc2b026 +b91b0ab32638aef3365035a41c6068e36d2303bfee8640565e16c9a56c21703270fd45946ce663238a72c053eb3f2230 +aaf4cd1ac0a30906dcd2b66b37848c6cc443da511e0b0367fd792887fdaf1500551590440e61d837dbee9d24c9801108 +a06f20a02d3cd76029baad5a12592f181738378a83a95e90470fa7cc82a5ae9d2ed824a20eeb1e96e6edc0619f298688 +a465d379c3481b294efc3f2f940b651c45579607cf72d143b99705eae42103a0279eb3595966453130e18935265e35d6 +892a8af7816a806295278027a956663ea1297118ede0f2a7e670483b81fb14dccacc7a652e12f160e531d806ca5f2861 +b480917c0e8b6e00de11b4416a20af6c48a343450a32ee43224559d30e1fecdece52cc699493e1754c0571b84f6c02c2 +b3182da84c81e5a52e22cebed985b0efc3056350ec59e8646e7fd984cdb32e6ac14e76609d0ffaca204a7a3c20e9f95d +a04ea6392f3b5a176fa797ddec3214946962b84a8f729ffbd01ca65767ff6237da8147fc9dc7dd88662ad0faefdb538c +95c0d10a9ba2b0eb1fd7aa60c743b6cf333bb7f3d7adedce055d6cd35b755d326bf9102afabb1634f209d8dacfd47f1a +a1a583d28b07601541fa666767f4f45c954431f8f3cc3f96380364c5044ff9f64114160e5002fb2bbc20812b8cbd36cb +a1a0708af5034545e8fcc771f41e14dff421eed08b4606f6d051f2d7799efd00d3a59a1b9a811fa4eddf5682e63102ea +ab27c7f54096483dd85c866cfb347166abe179dc5ffaca0c29cf3bfe5166864c7fa5f954c919b3ba00bdbab38e03407d +ac8c82271c8ca71125b380ed6c61b326c1cfe5664ccd7f52820e11f2bea334b6f60b1cf1d31599ed94d8218aa6fbf546 +a015ea84237d6aa2adb677ce1ff8a137ef48b460afaca20ae826a53d7e731320ebdd9ee836de7d812178bec010dd6799 +925418cda78a56c5b15d0f2dc66f720bda2885f15ffafb02ce9c9eed7167e68c04ad6ae5aa09c8c1c2f387aa39ad6d1b +87c00bba80a965b3742deacafb269ca94ead4eb57fdb3ed28e776b1d0989e1b1dba289019cfb1a0f849e58668a4f1552 +948d492db131ca194f4e6f9ae1ea6ebc46ebbed5d11f1f305d3d90d6b4995b1218b9606d114f48282a15661a8a8051ca +8179617d64306417d6865add8b7be8452f1759721f97d737ef8a3c90da6551034049af781b6686b2ea99f87d376bce64 +918e3da425b7c41e195ed7b726fa26b15a64299fe12a3c22f51a2a257e847611ac6cfcc99294317523fc491e1cbe60c4 +a339682a37844d15ca37f753599d0a71eedfbbf7b241f231dd93e5d349c6f7130e0d0b97e6abd2d894f8b701da37cb11 +8fc284f37bee79067f473bc8b6de4258930a21c28ac54aaf00b36f5ac28230474250f3aa6a703b6057f7fb79a203c2c1 +a2c474e3a52a48cd1928e755f610fefa52d557eb67974d02287dbb935c4b9aab7227a325424fed65f8f6d556d8a46812 +99b88390fa856aa1b8e615a53f19c83e083f9b50705d8a15922e7c3e8216f808a4cc80744ca12506b1661d31d8d962e4 +a1cbd03e4d4f58fc4d48fa165d824b77838c224765f35d976d3107d44a6cf41e13f661f0e86f87589292721f4de703fb +b3a5dde8a40e55d8d5532beaa5f734ee8e91eafad3696df92399ae10793a8a10319b6dc53495edcc9b5cfd50a389a086 +996e25e1df5c2203647b9a1744bd1b1811857f742aee0801508457a3575666fcc8fc0c047c2b4341d4b507008cd674c2 +93e0a66039e74e324ee6c38809b3608507c492ef752202fff0b2c0e1261ca28f1790b3af4fdb236f0ed7e963e05c1ec0 +b6084e5818d2d860ac1606d3858329fbad4708f79d51a6f072dc370a21fdb1e1b207b74bc265a8547658bfb6a9569bb3 +a5336126a99c0ecfc890584b2a167922a26cae652dfc96a96ab2faf0bf9842f166b39ceaf396cd3d300d0ebb2e6e0ebf +b8b6f13ce9201decaba76d4eca9b9fa2e7445f9bc7dc9f82c262f49b15a40d45d5335819b71ff2ee40465da47d015c47 +b45df257b40c68b7916b768092e91c72b37d3ed2a44b09bf23102a4f33348849026cb3f9fbb484adfea149e2d2a180ff +a50d38ee017e28021229c4bb7d83dd9cdad27ab3aa38980b2423b96aa3f7dc618e3b23895b0e1379ca20299ff1919bbf +97542cf600d34e4fdc07d074e8054e950708284ed99c96c7f15496937242365c66e323b0e09c49c9c38113096640a1b6 +822d198629697dcd663be9c95ff1b39419eae2463fa7e6d996b2c009d746bedc8333be241850153d16c5276749c10b20 +9217bc14974766ebdfbf6b434dd84b32b04658c8d8d3c31b5ff04199795d1cfad583782fd0c7438df865b81b2f116f9c +93477879fa28a89471a2c65ef6e253f30911da44260833dd51030b7a2130a923770ebd60b9120f551ab373f7d9ed80aa +87d89ff7373f795a3a798f03e58a0f0f0e7deab8db2802863fab84a7be64ae4dcf82ece18c4ddbefccd356262c2e8176 +a3ba26bd31d3cc53ceeced422eb9a63c0383cde9476b5f1902b7fe2b19e0bbf420a2172ac5c8c24f1f5c466eecc615d4 +a0fe061c76c90d84bd4353e52e1ef4b0561919769dbabe1679b08ef6c98dcfb6258f122bb440993d976c0ab38854386b +b3070aa470185cb574b3af6c94b4069068b89bb9f7ea7db0a668df0b5e6aabdfe784581f13f0cf35cd4c67726f139a8c +9365e4cdf25e116cbc4a55de89d609bba0eaf0df2a078e624765509f8f5a862e5da41b81883df086a0e5005ce1576223 +a9036081945e3072fa3b5f022df698a8f78e62ab1e9559c88f9c54e00bc091a547467d5e2c7cbf6bc7396acb96dd2c46 +8309890959fcc2a4b3d7232f9062ee51ece20c7e631a00ec151d6b4d5dfccf14c805ce5f9aa569d74fb13ae25f9a6bbe +b1dc43f07303634157f78e213c2fae99435661cc56a24be536ccbd345ef666798b3ac53c438209b47eb62b91d6fea90a +84eb451e0a74ef14a2c2266ff01bd33d9a91163c71f89d0a9c0b8edfcfe918fc549565509cd96eed5720a438ff55f7f2 +9863b85a10db32c4317b19cc9245492b9389b318cf128d9bbc7ec80a694fcbbd3c0d3189a8cad00cc9290e67e5b361ee +8a150ee474ebe48bdfcac1b29e46ac90dcded8abbe4807a165214e66f780f424be367df5ef1e94b09acf4a00cd2e614d +a6677a373130b83e30849af12475e192f817ba4f3226529a9cca8baaefb8811db376e4a044b42bf1481268c249b1a66e +b969cbf444c1297aa50d1dfa0894de4565161cb1fc59ba03af9655c5bf94775006fe8659d3445b546538a22a43be6b93 +8383167e5275e0707e391645dc9dea9e8a19640ecfa23387f7f6fcaddff5cde0b4090dfad7af3c36f8d5c7705568e8d8 +a353ddbc6b6837773e49bb1e33a3e00ca2fb5f7e1dba3a004b0de75f94a4e90860d082a455968851ef050ae5904452e0 +adeccf320d7d2831b495479b4db4aa0e25c5f3574f65a978c112e9981b2663f59de4c2fa88974fdcabb2eedb7adab452 +afa0eacc9fdbe27fb5e640ecad7ecc785df0daf00fc1325af716af61786719dd7f2d9e085a71d8dc059e54fd68a41f24 +a5b803a5bbe0ca77c8b95e1e7bacfd22feae9f053270a191b4fd9bca850ef21a2d4bd9bcd50ecfb971bb458ff2354840 +b023c9c95613d9692a301ef33176b655ba11769a364b787f02b42ceb72338642655ea7a3a55a3eec6e1e3b652c3a179e +8fa616aa7196fc2402f23a19e54620d4cf4cf48e1adfb7ea1f3711c69705481ddcc4c97236d47a92e974984d124589e5 +a49e11e30cb81cb7617935e8a30110b8d241b67df2d603e5acc66af53702cf1e9c3ef4a9b777be49a9f0f576c65dcc30 +8df70b0f19381752fe327c81cce15192389e695586050f26344f56e451df2be0b1cdf7ec0cba7ce5b911dcff2b9325ae +8fbbc21a59d5f5a14ff455ca78a9a393cab91deb61cf1c25117db2714d752e0054ed3e7e13dd36ad423815344140f443 +a9a03285488668ab97836a713c6e608986c571d6a6c21e1adbd99ae4009b3dde43721a705d751f1bd4ebf1ea7511dfed +b2f32b8e19e296e8402251df67bae6066aeefd89047586d887ffa2eacdf38e83d4f9dc32e553799024c7a41818945755 +942cf596b2278ad478be5c0ab6a2ad0ceafe110263cc93d15b9a3f420932104e462cf37586c374f10b1040cb83b862e0 +aaa077a55f501c875ceae0a27ef2b180be9de660ef3d6b2132eb17256771ce609d9bc8aaf687f2b56ae46af34ad12b30 +90ac74885be1448101cf3b957d4486e379673328a006ea42715c39916e9334ea77117ff4a60d858e2ccce9694547a14f +9256cdfc2339e89db56fd04bd9b0611be0eefc5ee30711bcece4aadf2efcc5a6dcc0cfd5f733e0e307e3a58055dff612 +a4c7384e208a0863f4c056248f595473dcde70f019ddaede45b8caf0752575c241bac6e436439f380ac88eee23a858e9 +a3aa67391781e0736dddc389f86b430b2fc293b7bd56bfd5a8ec01d1dd52ed940593c3ad4ce25905061936da062b0af6 +80299275ec322fbb66cc7dce4482ddd846534e92121186b6906c9a5d5834346b7de75909b22b98d73120caec964e7012 +aa3a6cd88e5f98a12738b6688f54478815e26778357bcc2bc9f2648db408d6076ef73cced92a0a6b8b486453c9379f18 +b07c444681dc87b08a7d7c86708b82e82f8f2dbd4001986027b82cfbed17b9043e1104ade612e8e7993a00a4f8128c93 +af40e01b68d908ac2a55dca9b07bb46378c969839c6c822d298a01bc91540ea7a0c07720a098be9a3cfe9c27918e80e8 +abd8947c3bbc3883c80d8c873f8e2dc9b878cbbb4fc4a753a68f5027de6d8c26aa8fbbafeb85519ac94e2db660f31f26 +a234f9d1a8f0cb5d017ccca30b591c95ec416c1cb906bd3e71b13627f27960f61f41ed603ffbcf043fd79974ec3169a8 +835aaf52a6af2bc7da4cf1586c1a27c72ad9de03c88922ad172dce7550d70f6f3efcc3820d38cd56ae3f7fc2f901f7a0 +ae75db982a45ad01f4aa7bc50d642ff188219652bb8d521d13a9877049425d57852f3c9e4d340ffec12a4d0c639e7062 +b88884aa9187c33dc784a96832c86a44d24e9ffe6315544d47fc25428f11337b9ffd56eb0a03ad709d1bf86175059096 +8492ca5afcc6c0187b06453f01ed45fd57eb56facbeea30c93686b9e1dab8eaabd89e0ccb24b5f35d3d19cd7a58b5338 +9350623b6e1592b7ea31b1349724114512c3cce1e5459cd5bddd3d0a9b2accc64ab2bf67a71382d81190c3ab7466ba08 +98e8bf9bed6ae33b7c7e0e49fc43de135bffdba12b5dcb9ff38cb2d2a5368bb570fe7ee8e7fbe68220084d1d3505d5be +ab56144393f55f4c6f80c67e0ab68f445568d68b5aa0118c0c666664a43ba6307ee6508ba0bb5eb17664817bc9749af0 +827d5717a41b8592cfd1b796a30d6b2c3ca2cdc92455f9f4294b051c4c97b7ad6373f692ddafda67884102e6c2a16113 +8445ce2bb81598067edaa2a9e356eda42fb6dc5dd936ccf3d1ff847139e6020310d43d0fec1fe70296e8f9e41a40eb20 +9405178d965ee51e8d76d29101933837a85710961bb61f743d563ef17263f3c2e161d57e133afac209cdb5c46b105e31 +b209f9ed324c0daa68f79800c0a1338bbaf6d37b539871cb7570f2c235caca238a2c4407961fcb7471a103545495ef2c +92ae6437af6bbd97e729b82f5b0d8fb081ca822f340e20fae1875bdc65694cd9b8c037a5a1d49aa9cae3d33f5bad414e +9445bdb666eae03449a38e00851629e29a7415c8274e93343dc0020f439a5df0009cd3c4f5b9ce5c0f79aefa53ceac99 +93fdab5f9f792eada28f75e9ac6042a2c7f3142ba416bfdb1f90aa8461dbe4af524eee6db4f421cb70c7bc204684d043 +a7f4dc949af4c3163953320898104a2b17161f7be5a5615da684f881633174fb0b712d0b7584b76302e811f3fac3c12f +a8ac84da817b3066ba9789bf2a566ccf84ab0a374210b8a215a9dcf493656a3fa0ecf07c4178920245fee0e46de7c3ec +8e6a0ae1273acda3aa50d07d293d580414110a63bc3fb6330bb2ee6f824aff0d8f42b7375a1a5ba85c05bfbe9da88cb5 +a5dea98852bd6f51a84fa06e331ea73a08d9d220cda437f694ad9ad02cf10657882242e20bdf21acbbaa545047da4ce5 +b13f410bf4cfce0827a5dfd1d6b5d8eabc60203b26f4c88238b8000f5b3aaf03242cdeadc2973b33109751da367069e1 +a334315a9d61b692ad919b616df0aa75a9f73e4ea6fc27d216f48964e7daebd84b796418580cf97d4f08d4a4b51037cd +8901ba9e963fcd2f7e08179b6d19c7a3b8193b78ca0e5cf0175916de873ca0d000cd7ac678c0473be371e0ac132f35a2 +b11a445433745f6cb14c9a65314bbf78b852f7b00786501b05d66092b871111cd7bee25f702d9e550d7dd91601620abb +8c2f7b8e7b906c71f2f154cc9f053e8394509c37c07b9d4f21b4495e80484fc5fc8ab4bdc525bd6cfa9518680ba0d1a2 +b9733cebe92b43b899d3d1bfbf4b71d12f40d1853b2c98e36e635fdd8a0603ab03119890a67127e6bc79afae35b0bef2 +a560f6692e88510d9ba940371e1ada344caf0c36440f492a3067ba38e9b7011caac37ba096a8a4accb1c8656d3c019b3 +ac18624339c1487b2626eef00d66b302bdb1526b6340d6847befe2fdfb2b410be5555f82939f8707f756db0e021ed398 +afd9a3b8866a7fe4f7bc13470c0169b9705fcd3073685f5a6dcff3bdbbc2be50ac6d9908f9a10c5104b0bffc2bc14dad +97f15c92fe1f10949ed9def5dd238bc1429706e5037a0e0afb71c2d0e5845e2fed95a171c393e372077a7c7059f8c0e0 +9453a1d4d09c309b70968ea527007d34df9c4cfd3048e5391aac5f9b64ca0c05dde5b8c949c481cfc83ef2e57b687595 +b80e4b7c379ad435c91b20b3706253b763cbc980db78f782f955d2516af44c07bbfa5888cbf3a8439dc3907320feb25a +8939f458d28fefe45320b95d75b006e98330254056d063e4a2f20f04bcb25936024efe8d436d491ed34b482f9b9ae49c +a9ead2e833f71f7e574c766440c4b3c9c3363698c7ade14499a56003a272832ee6d99440887fa43ccdf80265b9d56b97 +b6547a36934f05ce7b779e68049d61351cf229ae72dc211cc96a2a471b2724782f9355fdb415ea6f0ea1eb84fe00e785 +828bfb3099b7b650b29b0f21279f829391f64520a6ab916d1056f647088f1e50fac9253ef7464eceab5380035c5a59c4 +8d714b9ea650be4342ff06c0256189e85c5c125adf6c7aeca3dba9b21d5e01a28b688fc2116ce285a0714a8f1425c0b8 +8a82eda041b2e72a3d73d70d85a568e035fbd6dc32559b6c6cfdf6f4edcb59a6ba85b6294a721aa0a71b07714e0b99ae +af5665ebc83d027173b14ffb0e05af0a192b719177889fadc9ac8c082fda721e9a75d9ce3f5602dbfd516600ee3b6405 +a68fdddf03d77bebdb676e40d93e59bd854408793df2935d0a5600601f7691b879981a398d02658c2da39dbbf61ef96c +8c001ebc84fcf0470b837a08a7b6125126b73a2762db47bbdc38c0e7992b1c66bac7a64faa1bf1020d1c63b40adc3082 +8553889b49f9491109792db0a69347880a9cf2911b4f16f59f7f424e5e6b553687d51282e8f95be6a543635247e2e2c2 +a2c269d6370b541daf1f23cc6b5d2b03a5fa0c7538d53ae500ef875952fe215e74a5010329ff41461f4c58b32ad97b3d +a5dae097285392b4eba83a9fd24baa03d42d0a157a37fae4b6efc3f45be86024b1182e4a6b6eadcf5efe37704c0a1ae5 +89871a77d2032387d19369933cd50a26bda643e40cfd0ce73febe717a51b39fae981406fd41e50f4a837c02a99524ef9 +8a76d495e90093ec2ac22f53759dc1cf36fbb8370fb586acbd3895c56a90bbf3796bcc4fc422ca4058adf337ead1402e +ad4eb7576c4954d20623c1336c63662c2a6fb46ec6ef99b7f8e946aa47488dcb136eab60b35600f98c78c16c10c99013 +894c2b120cec539feb1d281baaadde1e44beafedeeec29b804473fe024e25c1db652f151c956e88d9081fb39d27e0b19 +9196bd5c100878792444c573d02b380a69e1b4b30cb59a48114852085058a5fd952df4afee3ecceb5c4ede21e1ed4a1a +a996fffc910764ea87a1eedc3a3d600e6e0ff70e6a999cb435c9b713a89600fc130d1850174efe9fc18244bb7c6c5936 +8591bb8826befa8bee9663230d9a864a5068589f059e37b450e8c85e15ce9a1992f0ce1ead1d9829b452997727edcf9d +9465e20bb22c41bf1fa728be8e069e25cda3f7c243381ca9973cbedad0c7b07d3dd3e85719d77cf80b1058ce60e16d68 +926b5ce39b6e60b94878ffeae9ff20178656c375fb9cfe160b82318ca500eb3e2e3144608b6c3f8d6c856b8fe1e2fbcf +a1ef29cbc83c45eb28ad468d0ce5d0fdd6b9d8191ba5ffa1a781c2b232ed23db6b7b04de06ef31763a6bfe377fa2f408 +9328e63a3c8acf457c9f1f28b32d90d0eeadb0f650b5d43486a61d7374757a7ada5fc1def2a1e600fa255d8b3f48036f +a9c64880fcb7654f4dd08f4c90baac95712dd6dd407e17ea60606e9a97dc8e54dd25cb72a9bf3fc61f8d0ad569fe369d +a908eb7b940c1963f73046d6b35d40e09013bfbfbeb2ccd64df441867e202b0f3b625fa32dd04987c3d7851360abdffc +b3947b5ed6d59e59e4472cdb1c3261de1b5278fb7cb9b5fca553f328b3b3e094596861ea526eca02395f7b7358155b7b +99da7f190d37bc58945f981cf484d40fcf0855cf8178e2ce8d057c7f0a9d9f77425fdbce9ef8366f44f671b20fd27d0b +913976d77d80e3657977df39571577fdf0be68ba846883705b454f8493578baa741cfaede53783e2c97cc08964395d83 +8d754a61e5164a80b5090c13f3e936056812d4ae8dc5cc649e6c7f37464777249bc4ae760a9806939131f39d92cca5bf +82ffd098480828a90cb221a8c28584e15904bad477c13b2e2d6ef0b96a861ce4a309a328fe44342365349456ad7c654f +89ae3ce4b0357044579ca17be85d8361bb1ce3941f87e82077dd67e43ec0f95edd4bd3426225c90994a81a99e79490b7 +a170892074016d57c9d8e5a529379d7e08d2c1158b9ac4487ac9b95266c4fd51cb18ae768a2f74840137eec05000dd5a +aafd8acd1071103c7af8828a7a08076324d41ea530df90f7d98fafb19735fc27ead91b50c2ca45851545b41d589d0f77 +8623c849e61d8f1696dc9752116a26c8503fd36e2cbbc9650feffdd3a083d8cdbb3b2a4e9743a84b9b2ad91ac33083f2 +ac7166ddd253bb22cdbd8f15b0933c001d1e8bc295e7c38dc1d2be30220e88e2155ecd2274e79848087c05e137e64d01 +a5276b216d3df3273bbfa46210b63b84cfe1e599e9e5d87c4e2e9d58666ecf1af66cb7ae65caebbe74b6806677215bd0 +88792f4aa3597bb0aebadb70f52ee8e9db0f7a9d74f398908024ddda4431221a7783e060e0a93bf1f6338af3d9b18f68 +8f5fafff3ecb3aad94787d1b358ab7d232ded49b15b3636b585aa54212f97dc1d6d567c180682cca895d9876cacb7833 +ab7cb1337290842b33e936162c781aa1093565e1a5b618d1c4d87dd866daea5cebbcc486aaa93d8b8542a27d2f8694c7 +88480a6827699da98642152ebc89941d54b4791fbc66110b7632fb57a5b7d7e79943c19a4b579177c6cf901769563f2f +a725ee6d201b3a610ede3459660658ee391803f770acc639cfc402d1667721089fb24e7598f00e49e81e50d9fd8c2423 +98924372da8aca0f67c8c5cad30fa5324519b014fae7849001dcd51b6286118f12b6c49061219c37714e11142b4d46de +a62c27360221b1a7c99697010dfe1fb31ceb17d3291cf2172624ebeff090cbaa3c3b01ec89fe106dace61d934711d42d +825173c3080be62cfdc50256c3f06fe190bc5f190d0eb827d0af5b99d80936e284a4155b46c0d462ee574fe31d60983d +a28980b97023f9595fadf404ed4aa36898d404fe611c32fd66b70252f01618896f5f3fda71aea5595591176aabf0c619 +a50f5f9def2114f6424ff298f3b128068438f40860c2b44e9a6666f43c438f1780be73cf3de884846f1ba67f9bef0802 +b1eee2d730da715543aeb87f104aff6122cb2bf11de15d2519ff082671330a746445777924521ec98568635f26988d0c +862f6994a1ff4adfd9fb021925cccf542fca4d4b0b80fb794f97e1eb2964ef355608a98eec6e07aadd4b45ee625b2a21 +8ce69a18df2f9b9f6e94a456a7d94842c61dea9b00892da7cf5c08144de9be39b8c304aeca8b2e4222f87ba367e61006 +b5f325b1cecd435f5346b6bc562d92f264f1a6d91be41d612df012684fdd69e86063db077bc11ea4e22c5f2a13ae7bee +85526870a911127835446cb83db8986b12d5637d59e0f139ad6501ac949a397a6c73bd2e7fba731b1bb357efe068242c +8552247d3f7778697f77389717def5a149fc20f677914048e1ed41553b039b5427badc930491c0bae663e67668038fd1 +a545640ee5e51f3fe5de7050e914cfe216202056cd9d642c90e89a166566f909ee575353cb43a331fde17f1c9021414e +8b51229b53cff887d4cab573ba32ec52668d197c084414a9ee5589b285481cea0c3604a50ec133105f661321c3ca50f5 +8cdc0b960522bed284d5c88b1532142863d97bbb7dc344a846dc120397570f7bd507ceb15ed97964d6a80eccfef0f28e +a40683961b0812d9d53906e795e6470addc1f30d09affebf5d4fbbd21ddfa88ce441ca5ea99c33fd121405be3f7a3757 +a527875eb2b99b4185998b5d4cf97dd0d4a937724b6ad170411fc8e2ec80f6cee2050f0dd2e6fee9a2b77252d98b9e64 +84f3a75f477c4bc4574f16ebc21aaa32924c41ced435703c4bf07c9119dd2b6e066e0c276ff902069887793378f779e0 +a3544bc22d1d0cab2d22d44ced8f7484bfe391b36991b87010394bfd5012f75d580596ffd4f42b00886749457bb6334b +b81f6eb26934b920285acc20ceef0220dd23081ba1b26e22b365d3165ce2fbae733bbc896bd0932f63dcc84f56428c68 +95e94d40a4f41090185a77bf760915a90b6a3e3ace5e53f0cb08386d438d3aa3479f0cd81081b47a9b718698817265cd +b69bd1625b3d6c17fd1f87ac6e86efa0d0d8abb69f8355a08739109831baeec03fd3cd4c765b5ff8b1e449d33d050504 +8448f4e4c043519d98552c2573b76eebf2483b82d32abb3e2bfc64a538e79e4f59c6ca92adff1e78b2f9d0a91f19e619 +8f11c42d6a221d1fda50887fb68b15acdb46979ab21d909ed529bcad6ae10a66228ff521a54a42aca0dad6547a528233 +a3adb18d7e4a882b13a067784cf80ea96a1d90f5edc61227d1f6e4da560c627688bdf6555d33fe54cab1bca242986871 +a24d333d807a48dc851932ed21cbdd7e255bad2699909234f1706ba55dea4bb6b6f8812ffc0be206755868ba8a4af3f9 +a322de66c22a606e189f7734dbb7fda5d75766d5e69ec04b4e1671d4477f5bcb9ff139ccc18879980ebc3b64ab4a2c49 +88f54b6b410a1edbf125db738d46ee1a507e69bc5a8f2f443eb787b9aa7dbd6e55014ec1e946aabeb3e27a788914fb04 +b32ee6da1dcd8d0a7fd7c1821bb1f1fe919c8922b4c1eeed56e5b068a5a6e68457c42b192cbaef5dc6d49b17fa45bc0f +8a44402da0b3a15c97b0f15db63e460506cb8bef56c457166aea5e8881087d8202724c539ef0feb97131919a73aefca8 +b967e3fead6171fa1d19fd976535d428b501baff59e118050f9901a54b12cc8e4606348454c8f0fc25bd6644e0a5532e +b7a0c9e9371c3efbbb2c6783ce2cc5f149135175f25b6d79b09c808bce74139020e77f0c616fa6dcb3d87a378532529d +a54207782ffc909cd1bb685a3aafabbc4407cda362d7b3c1b14608b6427e1696817aeb4f3f85304ac36e86d3d8caa65b +98c1da056813a7bfebc81d8db7206e3ef9b51f147d9948c088976755826cc5123c239ca5e3fe59bed18b5d0a982f3c3f +ae1c86174dfafa9c9546b17b8201719aecd359f5bbeb1900475041f2d5b8a9600d54d0000c43dd061cfda390585726ff +a8ee5a8be0bd1372a35675c87bfd64221c6696dc16e2d5e0996e481fec5cdbcb222df466c24740331d60f0521285f7d3 +8ddadbe3cf13af50d556ce8fc0dd77971ac83fad9985c3d089b1b02d1e3afc330628635a31707b32595626798ea22d45 +a5c80254baf8a1628dc77c2445ebe21fbda0de09dd458f603e6a9851071b2b7438fe74214df293dfa242c715d4375c95 +b9d83227ed2600a55cb74a7052003a317a85ca4bea50aa3e0570f4982b6fe678e464cc5156be1bd5e7bba722f95e92c5 +b56085f9f3a72bea9aa3a8dc143a96dd78513fa327b4b9ba26d475c088116cab13843c2bff80996bf3b43d3e2bddb1d6 +8fa9b39558c69a9757f1e7bc3f07295e4a433da3e6dd8c0282397d26f64c1ecd8eb3ba9824a7cacfb87496ebbb45d962 +879c6d0cb675812ed9dee68c3479a499f088068501e2677caeae035e6f538da91a49e245f5fcce135066169649872bee +91aa9fd3fed0c2a23d1edda8a6542188aeb8abee8772818769bdee4b512d431e4625a343af5d59767c468779222cf234 +a6be0bb2348c35c4143482c7ef6da9a93a5356f8545e8e9d791d6c08ed55f14d790d21ee61d3a56a2ae7f888a8fd46ca +808ee396a94e1b8755f2b13a6ffbedef9e0369e6c2e53627c9f60130c137299d0e4924d8ef367e0a7fad7f68a8c9193c +ad1086028fcdac94d5f1e7629071e7e47e30ad0190ae59aaebfb7a7ef6202ab91323a503c527e3226a23d7937af41a52 +9102bdaf79b907d1b25b2ec6b497e2d301c8eac305e848c6276b392f0ad734131a39cc02ed42989a53ca8da3d6839172 +8c976c48a45b6bc7cd7a7acea3c2d7c5f43042863b0661d5cd8763e8b50730552187a8eecf6b3d17be89110208808e77 +a2624c7e917e8297faa3af89b701953006bf02b7c95dfba00c9f3de77748bc0b13d6e15bb8d01377f4d98fb189538142 +a405f1e66783cdcfe20081bce34623ec3660950222d50b7255f8b3cc5d4369aeb366e265e5224c0204911539f0fa165e +8d69bdcaa5d883b5636ac8f8842026fcc58c5e2b71b7349844a3f5d6fbecf44443ef4f768eac376f57fb763606e92c9f +82fce0643017d16ec1c3543db95fb57bfa4855cc325f186d109539fcacf8ea15539be7c4855594d4f6dc628f5ad8a7b0 +8860e6ff58b3e8f9ae294ff2487f0d3ffae4cf54fd3e69931662dabc8efd5b237b26b3def3bcd4042869d5087d22afcf +88c80c442251e11c558771f0484f56dc0ed1b7340757893a49acbf96006aa73dfc3668208abea6f65375611278afb02a +8be3d18c6b4aa8e56fcd74a2aacb76f80b518a360814f71edb9ccf3d144bfd247c03f77500f728a62fca7a2e45e504c5 +8b8ebf0df95c3f9b1c9b80469dc0d323784fd4a53f5c5357bb3f250a135f4619498af5700fe54ad08744576588b3dfff +a8d88abdaadd9c2a66bc8db3072032f63ed8f928d64fdb5f810a65074efc7e830d56e0e738175579f6660738b92d0c65 +a0a10b5d1a525eb846b36357983c6b816b8c387d3890af62efb20f50b1cb6dd69549bbef14dab939f1213118a1ae8ec2 +8aadf9b895aeb8fdc9987daa937e25d6964cbd5ec5d176f5cdf2f0c73f6f145f0f9759e7560ab740bf623a3279736c37 +99aeda8a495031cc5bdf9b842a4d7647c55004576a0edc0bd9b985d60182608361ed5459a9d4b21aa8e2bd353d10a086 +832c8b3bfcd6e68eee4b100d58014522de9d4cefa99498bc06c6dca83741e4572e20778e0d846884b33439f160932bca +841f56ebefc0823ab484fc445d62f914e13957e47904419e42771aa605e33ab16c44f781f6f9aa42e3a1baf377f54b42 +a6e40271d419e295a182725d3a9b541ffd343f23e37549c51ecaa20d13cf0c8d282d6d15b24def5702bfee8ba10b12ac +8ac00925ac6187a4c5cde48ea2a4eaf99a607e58b2c617ee6f01df30d03fafada2f0469178dd960d9d64cbd33a0087d8 +b6b80916b540f8a0fe4f23b1a06e2b830008ad138271d5ba3cd16d6619e521fe2a7623c16c41cba48950793386eea942 +8412c0857b96a650e73af9d93087d4109dd092ddf82188e514f18fcac644f44d4d62550bfa63947f2d574a2e9d995bbb +b871395baa28b857e992a28ac7f6d95ec461934b120a688a387e78498eb26a15913b0228488c3e2360391c6b7260b504 +926e2d25c58c679be77d0e27ec3b580645956ba6f13adcbc2ea548ee1b7925c61fcf74c582337a3b999e5427b3f752f2 +a165fa43fecae9b913d5dcfc232568e3e7b8b320ce96b13800035d52844c38fd5dbf7c4d564241d860c023049de4bcbc +b4976d7572fd9cc0ee3f24888634433f725230a7a2159405946a79315bc19e2fc371448c1c9d52bf91539fd1fe39574b +a6b461eb72e07a9e859b9e16dfa5907f4ac92a5a7ca4368b518e4a508dc43f9b4be59db6849739f3ef4c44967b63b103 +b976606d3089345d0bc501a43525d9dca59cf0b25b50dfc8a61c5bd30fac2467331f0638fab2dc68838aa6ee8d2b6bc9 +b16ea61c855da96e180abf7647fa4d9dd6fd90adebadb4c5ed4d7cd24737e500212628fca69615d89cb40e9826e5a214 +95a3e3162eb5ea27a613f8c188f2e0dcc5cbd5b68c239858b989b004d87113e6aa3209fa9fad0ee6ecef42814ba9db1a +b6a026ab56d3224220e5bce8275d023c8d39d1bdf7eec3b0923429b7d5ef18cf613a3591d364be8727bb1fa0ba11eabb +949f117e2e141e25972ee9ccdd0b7a21150de7bbf92bbd89624a0c5f5a88da7b2b172ba2e9e94e1768081f260c2a2f8d +b7c5e9e6630287d2a20a2dfb783ffe6a6ff104ff627c6e4e4342acc2f3eb6e60e9c22f465f8a8dc58c42f49840eca435 +872be5a75c3b85de21447bb06ac9eb610f3a80759f516a2f99304930ddf921f34cbffc7727989cdd7181d5fc62483954 +a50976ea5297d797d220932856afdd214d1248230c9dcd840469ecc28ea9f305b6d7b38339fedb0c00b5251d77af8c95 +80b360f8b44914ff6f0ffbd8b5360e3cabe08639f6fe06d0c1526b1fe9fe9f18c497f1752580b30e950abd3e538ad416 +a2f98f9bf7fac78c9da6bb41de267742a9d31cf5a04b2fb74f551084ec329b376f651a59e1ae919b2928286fb566e495 +8b9d218a8a6c150631548e7f24bbd43f132431ae275c2b72676abbea752f554789c5ff4aac5c0eeee5529af7f2b509ef +aa21a243b07e9c7b169598bf0b102c3c280861780f83121b2ef543b780d47aaa4b1850430ee7927f33ece9847c4e0e1a +8a6f90f4ce58c8aa5d3656fe4e05acccf07a6ec188a5f3cde7bf59a8ae468e66f055ac6dfc50b6e8e98f2490d8deedc5 +8e39f77ca4b5149ffe9945ceac35d068760ba338d469d57c14f626dd8c96dbe993dd7011beff727c32117298c95ee854 +83bd641c76504222880183edd42267e0582642c4993fe2c7a20ce7168e4c3cbf7586e1d2d4b08c84d9b0bf2f6b8800b8 +a9d332993cf0c1c55130e5cf3a478eb5e0bfb49c25c07538accc692ef03d82b458750a7b991cc0b41b813d361a5d31e3 +a0fc60e6a6015df9bee04cea8f20f01d02b14b6f7aa03123ab8d65da071b2d0df5012c2a69e7290baae6ed6dd29ebe07 +a2949dde2e48788ceaac7ec7243f287ffe7c3e788cdba97a4ab0772202aeef2d50382bed8bf7eff5478243f7eabe0bda +a7879373ea18572dba6cf29868ca955ffa55b8af627f29862f6487ee398b81fe3771d8721ca8e06716c5d91b9ac587cb +b3c7081e2c5306303524fbe9fe5645111a57dffd4ec25b7384da12e56376a0150ab52f9d9cc6ca7bdd950695e39b766d +a634a6a19d52dcb9f823352b36c345d2de54b75197bcd90528d27830bd6606d1a9971170de0849ed5010afa9f031d5be +88f2062f405fa181cfdb8475eaf52906587382c666ca09a9522537cfebbc7de8337be12a7fd0db6d6f2f7ab5aefab892 +b1f0058c1f273191247b98783b2a6f5aa716cf799a8370627fc3456683f03a624d0523b63a154fe9243c0dfd5b37c460 +ae39a227cc05852437d87be6a446782c3d7fbe6282e25cf57b6b6e12b189bdc0d4a6e2c3a60b3979256b6b5baf8f1c5f +802a1af228ab0c053b940e695e7ef3338f5be7acf4e5ed01ac8498e55b492d3a9f07996b1700a84e22f0b589638909cd +a36490832f20e4b2f9e79ee358b66d413f034d6a387534b264cdeac2bca96e8b5bcbdd28d1e98c44498032a8e63d94d2 +8728c9a87db2d006855cb304bba54c3c704bf8f1228ae53a8da66ca93b2dac7e980a2a74f402f22b9bc40cd726e9c438 +a08f08ab0c0a1340e53b3592635e256d0025c4700559939aeb9010ed63f7047c8021b4210088f3605f5c14fb51d1c613 +9670fd7e2d90f241e8e05f9f0b475aa260a5fb99aa1c9e61cd023cbad8ed1270ae912f168e1170e62a0f6d319cf45f49 +a35e60f2dd04f098bf274d2999c3447730fe3e54a8aff703bc5a3c274d22f97db4104d61a37417d93d52276b27ef8f31 +859df7a21bc35daec5695201bd69333dc4f0f9e4328f2b75a223e6615b22b29d63b44d338413ca97eb74f15563628cb7 +b2b44ad3e93bc076548acdf2477803203108b89ecc1d0a19c3fb9814d6b342afc420c20f75e9c2188ad75fdb0d34bb2d +941173ee2c87765d10758746d103b667b1227301e1bcfecef2f38f9ab612496a9abd3050cef5537bf28cfecd2aacc449 +92b0bea30ebed20ac30648efb37bac2b865daaa514316e6f5470e1de6cb84651ff77c127aa7beed4521bda5e8fc81122 +af17bf813bb238cf8bb437433f816786612209180a6c0a1d5141292dc2d2c37164ef13bfc50c718bfcc6ce26369298a2 +8461fd951bdfda099318e05cc6f75698784b033f15a71bce26165f0ce421fd632d50df9eeced474838c0050b596e672c +83281aa18ae4b01e8201e1f64248cc6444c92ee846ae72adb178cef356531558597d84ff93a05abf76bfe313eb7dbe86 +b62b150f73999c341daa4d2f7328d2f6ca1ef3b549e01df58182e42927537fc7971c360fe8264af724f4c0247850ef12 +a7022a201f79c012f982b574c714d813064838a04f56964d1186691413757befeeaada063e7884297606e0eea1b1ed43 +a42ac9e8be88e143853fd8e6a9ff21a0461801f0ac76b69cca669597f9af17ecb62cccdcdcbe7f19b62ab93d7f838406 +80f1ca73b6ba3a2fbae6b79b39c0be8c39df81862d46c4990c87cbf45b87996db7859d833abc20af2fcb4faf059c436a +b355943e04132d5521d7bbe49aea26f6aa1c32f5d0853e77cc2400595325e923a82e0ff7601d1aee79f45fd8a254f6ae +87142c891d93e539b31d0b5ead9ea600b9c84db9be9369ff150a8312fe3d10513f4c5b4d483a82b42bc65c45dd9dd3bd +823c3d7f6dda98a9d8c42b3fee28d3154a95451402accadb6cf75fc45d2653c46a569be75a433094fa9e09c0d5cf1c90 +b3c3497fe7356525c1336435976e79ec59c5624c2fb6185ee09ca0510d58b1e392965e25df8a74d90d464c4e8bb1422b +88c48d83e8ddc0d7eea051f3d0e21bc0d3a0bb2b6a39ece76750c1c90c382a538c9a35dc9478b8ceb8157dcccbbf187a +93da81a8939f5f58b668fefdc6f5f7eca6dc1133054de4910b651f8b4a3267af1e44d5a1c9e5964dc7ab741eb146894b +8b396e64985451ac337f16be61105106e262e381ea04660add0b032409b986e1ac64da3bc2feae788e24e9cb431d8668 +9472068b6e331ea67e9b5fbf8057672da93c209d7ded51e2914dbb98dccd8c72b7079b51fd97a7190f8fc8712c431538 +ac47e1446cb92b0a7406f45c708567f520900dfa0070d5e91783139d1bfc946d6e242e2c7b3bf4020500b9f867139709 +896053706869fb26bb6f7933b3d9c7dd6db5c6bd1269c7a0e222b73039e2327d44bda7d7ae82bf5988808b9831d78bcd +a55e397fa7a02321a9fe686654c86083ecedb5757586d7c0250ec813ca6d37151a12061d5feca4691a0fd59d2f0fdd81 +ae23f08ac2b370d845036518f1bddb7fea8dc59371c288a6af310486effeb61963f2eef031ca90f9bdbcf0e475b67068 +b5462921597a79f66c0fec8d4c7cfd89f427692a7ce30d787e6fd6acd2377f238ec74689a0fdbe8ef3c9c9bd24b908dc +ae67e8ea7c46e29e6aae6005131c29472768326819aa294aaf5a280d877de377b44959adb1348fa3e929dcbc3ae1f2c0 +84962b4c66500a20c4424191bdfb619a46cda35bdb34c2d61edcb0b0494f7f61dd5bf8f743302842026b7b7d49edd4b5 +846f76286dc3cc59cb15e5dabb72a54a27c78190631df832d3649b2952fa0408ecde7d4dfdae7046c728efa29879fb51 +8f76c854eaee8b699547e07ad286f7dadfa6974c1328d12502bd7630ae619f6129272fdd15e2137ffef0143c42730977 +8007b163d4ea4ec6d79e7a2aa19d06f388da0b3a56f3ee121441584e22a246c0e792431655632bf6e5e02cb86914eebf +ac4d2cecc1f33e6fb73892980b61e62095ddff5fd6167f53ca93d507328b3c05440729a277dc3649302045b734398af1 +92d2a88f2e9c9875abaff0d42624ccb6d65401de7127b5d42c25e6adccd7a664504c5861618f9031ced8aeb08b779f06 +a832c1821c1b220eb003fc532af02c81196e98df058cdcc9c9748832558362915ea77526937f30a2f74f25073cb89afb +b6f947ab4cc2baec100ed8ec7739a2fd2f9504c982b39ab84a4516015ca56aea8eef5545cfc057dd44c69b42125fb718 +b24afacf2e90da067e5c050d2a63878ee17aaf8fd446536f2462da4f162de87b7544e92c410d35bf2172465940c19349 +b7a0aa92deac71eaab07be8fa43086e071e5580f5dbf9b624427bdd7764605d27303ae86e5165bed30229c0c11958c38 +b0d1d5bfa1823392c5cf6ed927c1b9e84a09a24b284c2cd8fcb5fda8e392c7c59412d8f74eb7c48c6851dff23ae66f58 +a24125ef03a92d2279fb384186ca0274373509cfec90b34a575490486098438932ee1be0334262d22d5f7d3db91efe67 +83e08e5fba9e8e11c164373794f4067b9b472d54f57f4dbe3c241cf7b5b7374102de9d458018a8c51ab3aed1dddf146f +9453101b77bb915ed40990e1e1d2c08ea8ec5deb5b571b0c50d45d1c55c2e2512ec0ceca616ff0376a65678a961d344d +92a0516e9eb6ad233d6b165a8d64a062ce189b25f95d1b3264d6b58da9c8d17da2cd1f534800c43efcf2be73556cd2ff +958d0b5d7d8faf25d2816aa6a2c5770592ad448db778dd9b374085baa66c755b129822632eaabcb65ee35f0bf4b73634 +90a749de8728b301ad2a6b044e8c5fd646ccd8d20220e125cba97667e0bb1d0a62f6e3143b28f3d93f69cdc6aa04122a +84bd34c8d8f74dec07595812058db24d62133c11afed5eb2a8320d3bfc28e442c7f0cfd51011b7b0bb3e5409cb7b6290 +aecc250b556115d97b553ad7b2153f1d69e543e087890000eaa60f4368b736921d0342ce5563124f129096f5d5e2ca9d +977f17ac82ed1fbf422f9b95feb3047a182a27b00960296d804fd74d54bb39ad2c055e665c1240d2ad2e06a3d7501b00 +af5be9846bd4879ebe0af5e7ad253a632f05aedfe306d31fe6debe701ba5aa4e33b65efc05043bc73aadb199f94baed4 +9199e12ec5f2aaaeed6db5561d2dcc1a8fe9c0854f1a069cba090d2dff5e5ba52b10c841ccbd49006a91d881f206150d +8f4a96a96ed8ceaf3beba026c89848c9ca4e6452ce23b7cf34d12f9cc532984a498e051de77745bdc17c7c44c31b7c30 +af3f2a3dbe8652c4bfca0d37fb723f0e66aab4f91b91a625114af1377ad923da8d36da83f75deb7a3219cd63135a3118 +a6d46963195df8962f7aa791d104c709c38caa438ddd192f7647a884282e81f748c94cdf0bb25d38a7b0dc1b1d7bbcf7 +86f3de4b22c42d3e4b24b16e6e8033e60120af341781ab70ae390cb7b5c5216f6e7945313c2e04261a51814a8cb5db92 +b9f86792e3922896cfd847d8ff123ff8d69ecf34968fb3de3f54532f6cd1112b5d34eeabdca46ae64ad9f6e7e5b55edc +83edfbcbc4968381d1e91ab813b3c74ab940eaf6358c226f79182f8b21148ec130685fd91b0ea65916b0a50bccf524ea +93b61daca7a8880b7926398760f50016f2558b0bab74c21181280a1baf3414fc539911bb0b79c4288d29d3c4ad0f4417 +ad541aeb83a47526d38f2e47a5ce7e23a9adabe5efeae03541026881e6d5ef07da3ac1a6ed466ca924fa8e7a91fcff88 +ac4bba31723875025640ed6426003ed8529215a44c9ffd44f37e928feef9fc4dfa889088131c9be3da87e8f3fdf55975 +88fa4d49096586bc9d29592909c38ea3def24629feacd378cc5335b70d13814d6dac415f8c699ee1bf4fe8b85eb89b38 +b67d0b76cbd0d79b71f4673b96e77b6cda516b8faa1510cfe58ff38cc19000bb5d73ff8418b3dab8c1c7960cb9c81e36 +98b4f8766810f0cfecf67bd59f8c58989eb66c07d3dfeee4f4bbce8fd1fce7cc4f69468372eaec7d690748543bd9691d +8445891af3c298b588dec443beacdf41536adb84c812c413a2b843fd398e484eb379075c64066b460839b5fe8f80177c +b603635c3ed6fdc013e2a091fc5164e09acf5f6a00347d87c6ebadb1f44e52ff1a5f0466b91f3f7ffc47d25753e44b75 +87ec2fc928174599a9dafe7538fec7dcf72e6873b17d953ed50708afff0da37653758b52b7cafa0bf50dfcf1eafbb46c +b9dbd0e704d047a457d60efe6822dc679e79846e4cbcb11fa6c02079d65673ee19bbf0d14e8b7b200b9205f4738df7c7 +9591ec7080f3f5ba11197a41f476f9ba17880f414d74f821a072ec5061eab040a2acba3d9856ff8555dfe5eaeb14ca19 +b34c9d1805b5f1ce38a42b800dec4e7f3eb8c38e7d2b0a525378e048426fed150dbfe9cc61f5db82b406d1b9ff2d10bf +a36fdc649dc08f059dfa361e3969d96b4cc4a1ebf10b0cd01a7dd708430979e8d870961fef85878f8779b8e23caafb18 +88dfc739a80c16c95d9d6f73c3357a92d82fa8c3c670c72bee0f1e4bac9ec338e1751eb786eda3e10f747dd7a686900f +84a535ad04f0961756c61c70001903a9adf13126983c11709430a18133c4b4040d17a33765b4a06968f5d536f4bfb5c5 +8c86d695052a2d2571c5ace744f2239840ef21bb88e742f050c7fa737cd925418ecef0971333eb89daa6b3ddfede268c +8e9a700157069dc91e08ddcbdde3a9ad570272ad225844238f1015004239c542fceb0acce6d116c292a55f0d55b6175e +84d659e7f94e4c1d15526f47bc5877a4ef761c2a5f76ec8b09c3a9a30992d41b0e2e38ed0c0106a6b6c86d670c4235f3 +a99253d45d7863db1d27c0ab561fb85da8c025ba578b4b165528d0f20c511a9ca9aff722f4ff7004843f618eb8fced95 +89a3cacb15b84b20e95cd6135550146bbe6c47632cc6d6e14d825a0c79b1e02b66f05d57d1260cb947dc4ae5b0283882 +8385b1555e794801226c44bd5e878cbe68aeac0a19315625a8e5ea0c3526b58cdd4f53f9a14a167a5e8a293b530d615a +b68c729e9df66c5cd22af4909fb3b0057b6a231c4a31cd6bf0fa0e53c5809419d15feb483de6e9408b052458e819b097 +924f56eda269ec7ec2fc20c5731bf7f521546ddf573ccbe145592f1c9fee5134747eb648d9335119a8066ca50a1f7e50 +b2100a26b9c3bec7ec5a53f0febbf56303f199be2f26b2d564cfee2adc65483b84192354f2865c2f4c035fa16252ae55 +8f64dbed62e638563967ec1605a83216aed17eb99aa618c0543d74771ea8f60bbb850c88608d4f8584f922e30a8a0a72 +b31b9e1ffe8d7260479c9413f8e680f3fe391ae8fcf44fcca3000d9b2473a40c1d32299f8f63865a57579a2d6c7e9f08 +a5b1d136142eb23e322c6c07cb838a3f58ab6925472352ebd0bb47041a0d8729e1074ca223922f3a7a672ced7a1e562d +8d9470a5a15d833a447b5f108333d50f30aa7659e331c3f8080b1e928a99922edc650466a2f54f3d48afdb34bff42142 +866368f5891564e5b2de37ad21ff0345c01129a14ea5667f9b64aad12d13ec034622872e414743af0bf20adb2041b497 +88ef9c2ebf25fd0c04b7cfa35fbac2e4156d2f1043fa9f98998b2aa402c8f9a4f1039e782451a46840f3e0e4b3fa47d3 +94ba04a4859273697e264a2d238dc5c9ff573ebc91e4796ea58eebe4080c1bf991255ab2ad8fb1e0301ce7b79cc6e69b +86b6bd0953309a086e526211bf1a99327269304aa74d8cdc994cee63c3a2d4b883e832b0635888dff2a13f1b02eb8df4 +843ea6ea5f2c7a1fd50be56a5765dcce3ea61c99b77c1a729ee0cd8ec706385ac7062e603479d4c8d3527f030762d049 +8d3675195a3b06f2d935d45becc59f9fa8fa440c8df80c029775e47fe9c90e20f7c8e4cc9a2542dd6bfe87536c428f0d +8978580b0c9b0aa3ab2d47e3cfd92fa891d3ddee57829ee4f9780e8e651900457d8e759d1a9b3e8f6ae366e4b57f2865 +890112ec81d0f24b0dfbb4d228e418eff02ae63dc691caf59c1d103e1d194e6e2550e1bec41c0bfdb74fed454f621d0c +97da00bd4b19d1e88caff7f95b8b9a7d29bc0afe85d0c6a163b4b9ef336f0e90e2c49ce6777024bb08df908cc04ea1ca +b458268d275a5211106ccaa8333ce796ef2939b1c4517e502b6462e1f904b41184a89c3954e7c4f933d68b87427a7bfd +aac9c043ba8ba9283e8428044e6459f982413380ee7005a996dc3cc468f6a21001ecaa3b845ce2e73644c2e721940033 +82145013c2155a1200246a1e8720adf8a1d1436b10d0854369d5b1b6208353e484dd16ce59280c6be84a223f2d45e5e2 +b301bafa041f9b203a46beab5f16160d463aa92117c77a3dc6a9261a35645991b9bafcc186c8891ca95021bd35f7f971 +a531b8d2ac3de09b92080a8d8857efa48fb6a048595279110e5104fee7db1dd7f3cfb8a9c45c0ed981cbad101082e335 +a22ac1d627d08a32a8abd41504b5222047c87d558ffae4232cefdeb6a3dc2a8671a4d8ddfba2ff9068a9a3ffb0fe99b1 +b8d9f0e383c35afb6d69be7ff04f31e25c74dd5751f0e51290c18814fbb49ee1486649e64355c80e93a3d9278bd21229 +8165babccd13033a3614c878be749dfa1087ecbeee8e95abcfffe3aa06695711122cb94477a4d55cffd2febf0c1173de +a4c1bc84ecb9d995d1d21c2804adf25621676d60334bd359dac3a2ec5dc8de567aa2831c10147034025fb3e3afb33c4b +b77307cab8e7cb21e4038493058fb6db9e2ec91dda9d7f96f25acbc90309daf7b6d8a205682143ee35d675e9800c3b08 +aaf7466083cd1f325ba860efe3faf4cebe6a5eecf52c3e8375d72043a5cfc8e6cb4b40f8e48f97266e84f0d488e8badf +9264a05a3abc2a5b4958f957f3a486a5eb3ddd10ff57aa6943c9430d0cfa01d63b72695b1ade50ac1b302d312175e702 +b3f9e4c589ad28b1eceed99dc9980fac832524cfcbe4a486dfeedb4b97c080e24bdb3967e9ca63d2240e77f9addfaefd +b2c1e253a78e7179e5d67204422e0debfa09c231970b1bfb70f31a8d77c7f5059a095ca79d2e9830f12c4a8f88881516 +81865a8a25913d1072cb5fd9505c73e0fde45e4c781ddd20fb0a7560d8b1cd5e1f63881c6efc05360e9204dfa6c3ce16 +ab71c2ea7fa7853469a2236dedb344a19a6130dc96d5fd6d87d42d3fffda172557d203b7688ce0f86acd913ce362e6cd +8aa2051bc3926c7bd63565f3782e6f77da824cb3b22bb056aa1c5bccfa274c0d9e49a91df62d0e88876e2bd7776e44b9 +b94e7074167745323d1d353efe7cfb71f40a390e0232354d5dfd041ef523ac8f118fb6dcc42bf16c796e3f61258f36f8 +8210fcf01267300cb1ccf650679cf6e1ee46df24ae4be5364c5ff715332746c113d680c9a8be3f17cacaeb3a7ba226ce +905ac223568eedc5acd8b54e892be05a21abbb4083c5dbec919129f9d9ffa2c4661d78d43bf5656d8d7aafa06f89d647 +a6e93da7e0c998e6ce2592d1aa87d12bf44e71bec12b825139d56682cdce8f0ba6dbfe9441a9989e10578479351a3d9d +acde928a5e2df0d65de595288f2b81838155d5673013100a49b0cb0eb3d633237af1378148539e33ccd1b9a897f0fec3 +a6e1a47e77f0114be6ae7acd2a51e6a9e38415cce7726373988153cdd5d4f86ef58f3309adc5681af4a159300ed4e5b5 +ad2b6a0d72f454054cb0c2ebc42cd59ff2da7990526bd4c9886003ba63b1302a8343628b8fe3295d3a15aa85150e0969 +b0bc3aea89428d7918c2ee0cc57f159fba134dad224d0e72d21a359ca75b08fbb4373542f57a6408352033e1769f72c6 +aad0497525163b572f135fad23fdd8763631f11deeaf61dea5c423f784fe1449c866040f303555920dc25e39cdb2e9b4 +8ce5d8310d2e17342bf881d517c9afc484d12e1f4b4b08ad026b023d98cba410cd9a7cc8e2c3c63456652a19278b6960 +8d9d57dbb24d68b6152337872bd5d422198da773174ade94b633f7c7f27670ff91969579583532ae7d8fe662c6d8a3b0 +855a1c2d83becb3f02a8f9a83519d1cb112102b61d4cdd396844b5206e606b3fefdbcc5aa8751da2b256d987d74d9506 +90eb7e6f938651f733cf81fcd2e7e8f611b627f8d94d4ac17ac00de6c2b841e4f80cada07f4063a13ae87b4a7736ca28 +8161459a21d55e7f5f1cecfc1595c7f468406a82080bfa46d7fb1af4b5ec0cd2064c2c851949483db2aa376e9df418e6 +8344ccd322b2072479f8db2ab3e46df89f536408cba0596f1e4ec6c1957ff0c73f3840990f9028ae0f21c1e9a729d7df +929be2190ddd54a5afe98c3b77591d1eae0ab2c9816dc6fe47508d9863d58f1ea029d503938c8d9e387c5e80047d6f1e +856e3d1f701688c650c258fecd78139ce68e19de5198cf1cd7bb11eba9d0f1c5af958884f58df10e3f9a08d8843f3406 +8490ae5221e27a45a37ca97d99a19a8867bcc026a94f08bdccfbb4b6fa09b83c96b37ec7e0fd6ee05f4ae6141b6b64a8 +b02dbd4d647a05ac248fda13708bba0d6a9cd00cae5634c1938b4c0abbb3a1e4f00f47aa416dcd00ffcdf166330bff9a +9076164bb99ca7b1a98d1e11cb2f965f5c22866658e8259445589b80e3cb3119c8710ede18f396ba902696785619079c +aacf016920936dae63778ad171386f996f65fe98e83cfcdd75e23774f189303e65cc8ad334a7a62f9230ed2c6b7f6fa4 +a8031d46c7f2474789123469ef42e81c9c35eb245d38d8f4796bba406c02b57053f5ec554d45373ab437869a0b1af3f0 +a4b76cd82dc1f305a0ee053e9a4212b67f5acc5e69962a8640d190a176b73fbc2b0644f896ff3927cd708d524668ed09 +b00b029c74e6fdf7fb94df95ef1ccad025c452c19cddb5dccfb91efdcb8a9a1c17847cfa4486eae4f510e8a6c1f0791a +9455e5235f29a73e9f1a707a97ddb104c55b9d6a92cc9952600d49f0447d38ea073ee5cf0d13f7f55f12b4a5132f4b10 +ae118847542ed1084d269e8f3b503d0b6571a2c077def116ad685dcca2fca3dcb3f86e3f244284bdcd5ae7ac968d08a5 +8dcb4965cd57e8b89cd71d6fc700d66caa805bfd29ab71357961527a7894e082d49145c2614b670dcb231ab9050d0663 +add6ed14f3183f4acc73feea19b22c9a330e431c674e5034924da31b69e8c02d79b570d12ef771a04215c4809e0f8a80 +96ae7e110412ee87d0478fdbdbaab290eb0b6edd741bb864961845e87fd44bcbe630371060b8104d8bf17c41f2e3fca0 +a20db17f384e9573ca0928af61affab6ff9dd244296b69b026d737f0c6cd28568846eca8dadf903ee0eecbb47368351d +937bfdf5feb0797863bc7c1be4dcc4f2423787952a3c77dfa3bfe7356f5dbcc4daebde976b84fc6bd97d5124fb8f85c9 +a7050cc780445c124e46bba1acc0347ddcfa09a85b35a52cc5808bf412c859c0c680c0a82218f15a6daeefe73f0d0309 +a9d9b93450e7630f1c018ea4e6a5ca4c19baa4b662eadfbe5c798fe798d8a3775ed1eb12bd96a458806b37ab82bdc10a +a52a4d5639e718380915daaefad7de60764d2d795443a3db7aeab5e16a1b8faa9441a4ccc6e809d8f78b0ac13eef3409 +8e6f72b6664a8433b032849b03af68f9376b3c16c0bc86842c43fc7bf31e40bc9fc105952d5c5780c4afa19d7b802caa +a107ae72f037000c6ee14093de8e9f2c92aa5f89a0a20007f4126419e5cb982469c32187e51a820f94805c9fccd51365 +9708218f9a984fe03abc4e699a4f3378a06530414a2e95e12ca657f031ef2e839c23fd83f96a4ba72f8203d54a1a1e82 +b9129770f4c5fcac999e98c171d67e148abd145e0bf2a36848eb18783bb98dff2c5cef8b7407f2af188de1fae9571b1c +88cc9db8ff27eb583871eeeb517db83039b85404d735517c0c850bdfa99ae1b57fd24cf661ab60b4726878c17e047f37 +a358c9aadc705a11722df49f90b17a2a6ba057b2e652246dc6131aaf23af66c1ca4ac0d5f11073a304f1a1b006bc0aa5 +ac79f25af6364a013ba9b82175ccee143309832df8f9c3f62c193660253679284624e38196733fb2af733488ab1a556e +82338e3ed162274d41a1783f44ae53329610134e6c62565353fbcc81131e88ce9f8a729d01e59e6d73695a378315111b +aa5ddcabf580fd43b6b0c3c8be45ffd26c9de8fa8d4546bb92d34f05469642b92a237d0806a1ad354f3046a4fcf14a92 +b308d2c292052a8e17862c52710140ffafa0b3dbedd6a1b6334934b059fe03e49883529d6baf8b361c6e67b3fbf70100 +96d870a15c833dddd8545b695139733d4a4c07d6206771a1524500c12607048731c49ec4ac26f5acc92dd9b974b2172c +8e99ee9ed51956d05faaf5038bffd48a2957917a76d9974a78df6c1ff3c5423c5d346778f55de07098b578ad623a390e +a19052d0b4b89b26172c292bbf6fd73e7486e7fd3a63c7a501bbd5cf7244e8e8ce3c1113624086b7cdf1a7693fdad8b5 +958957caf99dc4bb6d3c0bc4821be10e3a816bd0ba18094603b56d9d2d1383ccc3ee8bc36d2d0aea90c8a119d4457eb4 +8482589af6c3fc4aa0a07db201d8c0d750dd21ae5446ff7a2f44decf5bff50965fd6338745d179c67ea54095ecd3add4 +8a088cc12cf618761eaa93da12c9158b050c86f10cd9f865b451c69e076c7e5b5a023e2f91c2e1eed2b40746ca06a643 +85e81101590597d7671f606bd1d7d6220c80d3c62e9f20423e734482c94547714a6ac0307e86847cce91de46503c6a8a +b1bd39b481fc452d9abf0fcb73b48c501aaae1414c1c073499e079f719c4e034da1118da4ff5e0ce1c5a71d8af3f4279 +942ae5f64ac7a5353e1deb2213f68aa39daa16bff63eb5c69fc8d9260e59178c0452227b982005f720a3c858542246c8 +99fea18230e39df925f98e26ff03ab959cae7044d773de84647d105dfa75fd602b4f519c8e9d9f226ec0e0de0140e168 +97b9841af4efd2bfd56b9e7cd2275bc1b4ff5606728f1f2b6e24630dbe44bc96f4f2132f7103bca6c37057fc792aeaab +94cdad044a6ab29e646ed30022c6f9a30d259f38043afcea0feceef0edc5f45297770a30718cbfec5ae7d6137f55fe08 +a533a5efa74e67e429b736bb60f2ccab74d3919214351fe01f40a191e3ec321c61f54dd236f2d606c623ad556d9a8b63 +b7bd0bb72cd537660e081f420545f50a6751bb4dd25fde25e8218cab2885dd81ffe3b888d608a396dfcb78d75ba03f3f +b1479e7aa34594ec8a45a97611d377206597149ece991a8cef1399738e99c3fa124a40396a356ab2ea135550a9f6a89f +b75570fc94b491aef11f70ef82aeb00b351c17d216770f9f3bd87f3b5ac90893d70f319b8e0d2450dc8e21b57e26df94 +a5e3f3ab112530fe5c3b41167f7db5708e65479b765b941ce137d647adb4f03781f7821bb4de80c5dc282c6d2680a13d +b9b9c81b4cac7aca7e7c7baac2369d763dd9846c9821536d7467b1a7ec2e2a87b22637ab8bbeddb61879a64d111aa345 +b1e3ee2c4dd03a60b2991d116c372de18f18fe279f712829b61c904103a2bd66202083925bc816d07884982e52a03212 +a13f0593791dbbd360b4f34af42d5cc275816a8db4b82503fe7c2ff6acc22ae4bd9581a1c8c236f682d5c4c02cc274cc +86ba8238d3ed490abcc3f9ecc541305876315fb71bca8aaf87538012daab019992753bf1e10f8670e33bff0d36db0bf0 +b65fbb89fafb0e2a66fe547a60246d00b98fe2cb65db4922d9cef6668de7b2f4bb6c25970f1e112df06b4d1d953d3f34 +abb2d413e6f9e3c5f582e6020f879104473a829380b96a28123eb2bdd41a7a195f769b6ac70b35ba52a9fee9d6a289c3 +88ec764573e501c9d69098a11ea1ad20cdc171362f76eb215129cfcca43460140741ea06cee65a1f21b708afb6f9d5b0 +a7aaec27246a3337911b0201f4c5b746e45780598004dac15d9d15e5682b4c688158adffdef7179abb654f686e4c6adc +a1128589258f1fbfa33341604c3cb07f2a30c651086f90dce63ae48b4f01782e27c3829de5102f847cde140374567c58 +aaf2b149c1ca9352c94cc201125452b1ed7ca7c361ed022d626899426cb2d4cc915d76c58fa58b3ad4a6284a9ae1bc45 +aaf5c71b18b27cd8fe1a9028027f2293f0753d400481655c0d88b081f150d0292fb9bd3e6acabb343a6afb4afdb103b5 +947c0257d1fb29ecc26c4dc5eab977ebb47d698b48f9357ce8ff2d2ed461c5725228cc354a285d2331a60d20de09ff67 +b73e996fa30f581699052ed06054c474ebdf3ae662c4dc6f889e827b8b6263df67aeff7f2c7f2919df319a99bdfdceb1 +b696355d3f742dd1bf5f6fbb8eee234e74653131278861bf5a76db85768f0988a73084e1ae03c2100644a1fa86a49688 +b0abca296a8898ac5897f61c50402bd96b59a7932de61b6e3c073d880d39fc8e109998c9dba666b774415edddcff1997 +b7abe07643a82a7cb409ee4177616e4f91ec1cf733699bf24dec90da0617fe3b52622edec6e12f54897c4b288278e4f3 +8a3fae76993edbc81d7b47f049279f4dd5c408133436605d934dee0eadde187d03e6483409713db122a2a412cd631647 +82eb8e48becfdf06b2d1b93bf072c35df210cf64ed6086267033ad219bf130c55ee60718f28a0e1cad7bc0a39d940260 +a88f783e32944a82ea1ea4206e52c4bcf9962b4232e3c3b45bd72932ee1082527bf80864ce82497e5a8e40f2a60962d0 +830cf6b1e99430ae93a3f26fbfb92c741c895b017924dcd9e418c3dc4a5b21105850a8dd2536fa052667e508b90738f2 +990dce4c2c6f44bb6870328fba6aa2a26b0b8b2d57bfb24acf398b1edc0f3790665275f650884bd438d5403973469fa2 +a2e5b6232d81c94bcb7fed782e2d00ff70fc86a3abddbe4332cb0544b4e109ae9639a180ae4c1f416752ed668d918420 +b4cdf7c2b3753c8d96d92eb3d5fa984fef5d346a76dc5016552069e3f110356b82e9585b9c2f5313c76ffaecef3d6fd8 +83b23b87f91d8d602bff3a4aa1ead39fcc04b26cf113a9da6d2bd08ba7ea827f10b69a699c16911605b0126a9132140f +8aae7a2d9daa8a2b14f9168fe82933b35587a3e9ebf0f9c37bf1f8aa015f18fb116b7fba85a25c0b5e9f4b91ba1d350b +80d1163675145cc1fab9203d5581e4cd2bed26ad49f077a7927dec88814e0bed7912e6bbe6507613b8e393d5ee3be9be +93ddeb77b6a4c62f69b11cf36646ed089dcaa491590450456a525faf5659d810323b3effa0b908000887c20ac6b12c80 +9406360a2b105c44c45ba440055e40da5c41f64057e6b35a3786526869b853472e615e6beb957b62698a2e8a93608e13 +93bfc435ab9183d11e9ad17dac977a5b7e518db720e79a99072ce7e1b8fcb13a738806f414df5a3caa3e0b8a6ce38625 +8a12402c2509053500e8456d8b77470f1bbb9785dd7995ebbbe32fd7171406c7ce7bd89a96d0f41dbc6194e8f7442f42 +aab901e35bf17e6422722c52a9da8b7062d065169bf446ef0cbf8d68167a8b92dab57320c1470fee1f4fc6100269c6e2 +8cad277d9e2ba086378190d33f1116ba40071d2cb78d41012ec605c23f13009e187d094d785012b9c55038ec96324001 +85511c72e2894e75075436a163418279f660c417e1d7792edce5f95f2a52024d1b5677e2e150bf4339ad064f70420c60 +85549ca8dcbe49d16d4b3e2b8a30495f16c0de35711978ada1e2d88ad28e80872fca3fb02deb951b8bcb01b6555492e4 +8d379ab35194fe5edf98045a088db240a643509ddc2794c9900aa6b50535476daa92fd2b0a3d3d638c2069e535cd783b +b45cfebe529556b110392cb64059f4eb4d88aaf10f1000fdd986f7f140fdd878ce529c3c69dfd2c9d06f7b1e426e38f3 +ac009efd11f0c4cdd07dd4283a8181420a2ba6a4155b32c2fed6b9f913d98e057d0f5f85e6af82efc19eb4e2a97a82df +b2c2cdffa82f614e9cb5769b7c33c7d555e264e604e9b6138e19bcfc49284721180b0781ecbf321d7e60259174da9c3c +95789960f848797abbe1c66ef05d01d920228ca1f698130c7b1e6ca73bfda82cee672d30a9787688620554e8886554ee +98444018fa01b7273d3370eeb01adc8db902d5a69b9afc0aa9eadfeb43c4356863f19078d3c0d74e80f06ecf5a5223f4 +87d20b058050542f497c6645de59b8310f6eeec53acbc084e38b85414c3ea3016da3da690853498bde1c14de1db6f391 +a5c12b3a40e54bee82a315c503c1ce431309a862458030dde02376745ec1d6b9c1dbeea481ae6883425e9dae608e444e +b9daa3bf33f0a2979785067dcece83250e7bf6deb75bb1dbbab4af9e95ddfb3d38c288cbef3f80519a8916a77a43b56c +b682ec3118f71bde6c08f06ea53378ea404f8a1c4c273dd08989f2df39d6634f6463be1d172ac0e06f0fa19ac4a62366 +a4f94fd51ecf9d2065177593970854d3dce745eebb2a6d49c573cbf64a586ae949ddfa60466aaef0c0afb22bd92e0b57 +86cd5609efd570c51adbc606c1c63759c5f4f025fcbefab6bc3045b6ad2423628c68f5931ff56fdda985168ce993cc24 +981192e31e62e45572f933e86cdd5b1d28b1790b255c491c79bd9bb4964359b0e5f94f2ae0e00ef7fe7891b5c3904932 +9898f52b57472ebc7053f7bf7ab6695ce8df6213fc7f2d6f6ea68b5baad86ec1371a29304cae1baadf15083296958d27 +b676c4a8a791ae00a2405a0c88b9544878749a7235d3a5a9f53a3f822e0c5c1b147a7f3f0fc228049dc46e87aa6b6368 +9976e10beff544e5c1645c81a807739eff90449df58ffdd8d1aa45dd50b4c62f9370538b9855a00dd596480f38ebe7a5 +a0e91404894187ec23c16d39d647ada912a2c4febfd050a1ea433c4bfdc1568b4e97a78a89ba643aca3e2782033c3c58 +91a6ea9a80476ed137eb81558ff1d55b8581663cccd41db4fc286876226b6515fd38661557419e1e46b6a3bc9cda3741 +b9e8a1e23c60335a37a16f8085f80178a17d5e055d87ffe8cf63c532af923e5a5a2d76cf078164fb577996683796caa6 +ad8e151d87a37e8df438d0a6a7c02c3f511143efb93fde8aef334d218cb25932baf9e97c2f36c633620a024a5626af3d +978f942f210e8a482015e6fdc35a4c967c67b66e6e2a17a05cc7a0f2163aed227b775d4352b0c3cca6cbf4bd5bafaf75 +b5e2e3d8b2e871c07f5899e108e133f87479959b80cb8a103fbecde00ccdbfbd997540eef33079c5cc14b1c00c009fd1 +88a164b3fefd36857f429ab10002243b053f5d386466dbb9e5135ed3c72dd369a5a25e5e2aaa11f25488535e044e2f12 +a66091c0db4e7cf05a089ec2b9ff74744354d0196968201f5e201699144b52bb13b4e68e12502727163e6db96e3565f2 +8e65aff8e37240461b7374c20bfd1d58b73a525c28994a98f723daed9486130b3189f8efe5c5efcd7f5390cc366038da +8b37c21dd7304c3aa366959ba8c77ea8b22164a67e136808b6f8e48604297f7429a6c6ecf67b1d09b8b7ec083eacd7e0 +b689b1277ad050f53da91a702516a06d7406ff33a4714ea859b3b2b69f8d0aa8f983c7e039b19c0759a3815d841fa409 +b17f7a0a182ed4937f88489e4c4e6163dcf49fd2ea4d9efbba8126c743bea951cd769752acd02e921774dc8ebcfae33b +8b7fab4f90be825ac5d782a438e55c0a86be1c314a5dbc3cc6ed60760a8a94ef296391f1f6363652200cce4c188dae67 +ab8410c4eaa2bb43b0dd271aa2836061bc95cb600b0be331dada76ddb46711ff7a4ad8c466cc1078b9f9131f0dc9d879 +9194bd7b3cc218624459d51c4d6dbc13da5d3de313448f8175650fa4cfab7cc4afcda5427b6676c3c13897dc638b401e +980f61a0f01349acd8fc9fdc88fc2c5813610c07eecb6ab14af0845a980792a60dadf13bb4437b0169ae3eff8f5984ce +b783bee24acea9c99d16434195c6940cf01fc2db135e21f16acae45a509eca3af6b9232a8aa3a86f9715c5f6a85cb1c3 +a3079931c4b90966d1faa948db847741878b5828bc60325f5ebe554dcab4adcc19ee8bce645e48a8f4a9413bb3c6a093 +801f61ac9318f6e033a99071a46ae06ed249394638c19720831fff850226363a4ae8486dd00967746298ee9f1d65462f +b34dbbed4f3bb91f28285c40f64ce60c691737cc2b2d2be5c7d0210611cd58341bb5bda51bb642d3ee2d80882e642a13 +8750af19abfb915e63c81542b13d84526a0c809179bbcc1cd8a52b29f3aba3ae0f7cf6f4f01790bf64ef7db01d8ee887 +a6ea10000eb2dd4efc242ac95bc3b3873cdd882fbeb7c9538c87e3143a263ca3a2e192b2159316a625cfb5fb0b6cdcb3 +aa40ca54bc758a6c64cb932924917581062e088b3ad43976b28f2e11d8a7dea73f1fb50aeaa0e70182bb2dc07d805bb9 +a4779dfd25b5ec9d75dfb54a4bb030364899a5e75c1492403acb19f2adc782c7ac4daeb66d2f5aeb74135afe9f318e3f +b4551e2805d63ca453f4f38b1921ac87ff687e1d70575ad38f3469d6f0608ef76b7b1b98ae1e6b1e7d928773aaab6e3b +99490ee722f96aad2743b08dd37bfeb75a8c59efaee4c9b694eaa05eb8a6bb23861a4480544c7617d04d23fd5e2543b4 +8a7050d964d295fff98ae30d77ce730a055719313457e773fcce94c4d71a9b7cf63db67e54a8aab20fb1335b0130b5d5 +903144e6bbee0a4fec17ff80fef0d2103981140c3d41776cfb184ced17f480a687dd093f6b538584327e6142812e3cd5 +a5b30f7c6939bdc24a84ae784add927fec798b5a5ee3dd156c652df020728dd6d43898be364cf5ee181725fbcffc0964 +b43d97ec2bc66af92d921a5c5c20a03ef2be2bc2c9b345f46d8287409fcbfd88ebc49d4509d64468222cd1d2021bf236 +82dc23c7f5086c9ac6b4566359bfb830d203544b0d8332a210775670f899cd9ff48b94bfeba40040c25664ebdd5cfad8 +9294cd017fea581dabb73dcc8c619904d7e022b664b0a8502c9d30f3807668af279948e7e41030ae296d492225297e95 +8d6c9dc636c8e884f9a4299e5cff06d044ebc94ad783a4b71788347ea4a336d4d048b8a9ecabae789e8fcdc459723dfb +801a80bc49e882ec81b04e37407713f033f7bdac79252dfa3dc8c5bd0229fcbd4019890e402cf843b9378df08f72ab84 +b4313ca32569d973900f6196363c0b280ddfa1b47c88d019e5f399b805b444a777950fc21ae198fc23ece52674b94abf +96f06056fd255fdabf78986e315e7c4fdf5495cf850536b7976baa97a994cc6a99c34609c33a0f2facba5e6f1026dce6 +983ed80220a5545ffd70ef5e6ac10217d82ec9cd8f9a27ee77a5ff4074092308c0e6396fc4e9932a77ddd474e61f8b55 +872a059aa630af73c4abbd076e8b333a973ffc5bdecf5dcc0600b00162184213cb19d4f601795030033beb808d5810ce +b040f318d9d3b8833da854014a44296dbd6762dd17cab13f91987256c54353b7f0800547cb645a7cc231997454209fdd +a8c4731a555308e8ce0b8325eb7a4cbf6113d07e9f41932df04480b72628d313b941c7055f1cc2ac45c7353b56e96ca9 +8c24031440b77637e045a52e5ea3f488926ab0b426148975edf066c40a4581beecc1bfb18fc4cf5f9f96dc6681b4bd28 +b39254b475abf342f301298feaa17a4b3051f30ea23a18acf59e003e2704ac96fe40691f1da387913bdf7aee6389f9a8 +a1dbf938b604ccc6d60881cc71f38df568aa02752aa44d123514154017503f6c1c335ae43e359f1487bc8934073cd9c1 +8d52aa1be9f429ece0580498d8fe9fef46d4a11f49436a82b8927f9503dacc41245907f126594c1cd30701286f8c092c +b826f396486942c0326d16f30a01b00a682c30a75553dc6ac34fd5b3e96b13c33b94738f522eebaffb59ff8c571c76e9 +aa89f51cbf6e6c3e2aa2806187b69ab3361c84e89f393f3ed284fe84db46fc3944aa44f8928e3964f9c1a1ec27048f68 +a254df0efa4203fb92b42a1cd81ca955922e14bf408262c8f7cb7dc703da0ca2c71556bd2d05b22ce9a90ad77309833d +93263c507e4d5f4e5df88e85b3d85c46ea729fb542a718b196333e2d9fb8a2e62dc1347cf146466a54ba12d200ef09d9 +922e3c4a84246d89a07aa3e90f02e04b2cea9bebc0e68b742156f702aed31b28c6dfa7ac936ea2fc2e029adf68361f98 +9a00628eeeda4ccbed3ef7834149aec4c77aac1a14bc2491ba5d1a4a2c5d29afb82ceaa5aac1c5ce1e42cdcaf53e30ba +ab3a88df36d703920f6648a295a70ffa5316c96044f39ff132937bfda768937cb6a479e9ba4a4e66b377f3a9996a88c4 +966b11526ab099d550ab33c6a9667e5cfdedf255da17a80a519d09acd78d2ea24ec18bd1ea7d8d63cf0a408f1c1fe0b3 +b5c21b9817dc32f3df9d9988aa3560e1e840d586d01cd596bc0f850ab416b6013cbf7dbfd05ac981f26014c74bd2d2b2 +9040abef5e2523e7f139c9f744a64b98fea3a57952059ffe4d5ed77fa87068203c090ef4e7f52c88fb82ea8a6fdca33e +a0dcdaeb7d3f5d30d49c004c5f478818c470187f4b0b4856812dcd1b3a86de58a99acb8ceb44c6b80c3060cf967c43a4 +b5f4be9a69e4a6719ea91104820df8623b6d1073e8ee4168de10a7e49c8babea772bcbc6b0908185e98d607e49cd3609 +8634020a5a78650015763c06121c606d2dd7b324aa17387910513dd6480fb797df541fc15b70d269b2794ad190595084 +9504d1d0fb31ff1926c89040c04d51fd1f5cddf9d7ca3d036e7fd17e7a0f767ef33cee1d8bf7e17e2bc40949e7630417 +812c72846ef6d692cf11d8f8c3de8fa78cc287303315114492667b19c702cd24d462020f1276895df26e937c38f361f8 +8c97aa5e9ef2aa9a1435ef9ddfe62e850f0360864ed5fb82bf9fef4ef04d8fb4f827dc078bc911ee275e4501edd6617c +ac5f7af5e23c8e429aaa6b6825129922b59d25b4608f07b65f21388a9ac3aa89096712f320afe6d56e44e1f0d51a4eb9 +a8c84d9a8593a0cb5be1e450960f59878a4e6b70da54a7613dfc25911b7cc9e6d789d39401b0a0d6471ab9dcdc707976 +8c9d5fd89611392c0f085ffa4fa642a181f0b9b23593deb5e10fdd1642722ca75ef34a037e88a8d03f2888fe7461f27c +8c74b05f91fb95c85e7bd41f6d9a1e41e667e68f3d19b325c1f25df1767019919edab89b92af237896cbc4e6d6dc1854 +a3caecb91640821f0b2c4981b23f2069df8d2b98ce026c1538bc096b292f5f956a5d52c1c8d6a8165a1608083ba6494b +8ae8e0c36f8b79a69176ff29855df45d0fcd9e4d1dbaed8899f8fcdece676e418ec034a6c161e2a894f0c834aaecbfd1 +b88d18c67dc3b1b6ed60ee437c441c1ed14ecddebccf43683605716f30058b1aa4ba05ff10cd8171ee97d8f58d70c094 +94f43d84dcdfd9cd19115c7d8e9c1e856828eafbfdec93b876cf0007e317e30b2ad951dbabc186aa6ef90fdee4d91990 +b44e4723f41fc1d5b0057f371e3381ae02566590b3f964b6eb07b2104f66ff78410c407235fa98d04f635694f3baca09 +addd8390173d29ca0811534d389253831fed75fed135398617836b6e70767269eacb1560b39a58f02042ca3b97fe59c4 +80bdbdacc0c358c7ea52aeacdc5f9ceb6928bcf6e7dee7c17d8ae3bf7c2372aa7a0372363888968fc0921aaf4776d5d0 +a486e2b6f04f403f9e609d69dfb3cfb992af56ecad1683271df3e3faa3b86638b81e73b39978fb829ee7133d72901f2d +a19472da57457e10c6a6307895393ddaec8f523760d66937fe26a025817319e234eaf69756ffdf1b84c81733424a96d7 +ad6a195397cbc2d75171f5e82090441eed60bd1ba42c39ef565b8b5a8281b04400678625b1dc46d617f694a7652a8e5d +8f98e721c06cec432e2221f2e1b06bb1469d916a8d88d6973acf68d1e003441d00390dafcead8ecdbf9eae4509baf5aa +91d62a0f9d13c59adfe1376ed6d057eae244d13c6b3d99be49a49e0075cf20f4085cf127774644ac93615be9ac9e5db6 +af45dec199245e2b326a0d79c4899ed44b1c0219db42602a4a6184ace0ff831a3276297af28f92e8b008ba412318e33e +8754bde54e8d2d169e6a7d6f0eae6097bc0461c395192bd00dd6f105677ea56ab384c02553ea5eeac0a65adcb0df77ee +b676afd2f5afc37a314c943d496e31b4885efcbcc2061036e370a74cfde5642bb035622d78d693bfc3136fc036c7edb4 +aab6ffe6cc234397cf1822e02912bc282dfb314e92fb5a9e10d0c34ee9b5856d4b76e166bc2bb6fcdd66aabea35ec4ef +ada6e62f90ee6b852ec4b72b22367acac2896f0df2c105beda27096583ddbedddc710d171330569f111c6e44a5b57ae7 +802139dd15241a6de663d9b810121bdd9cf11f7f8c8ca6de63f4f8e731409e40d1fd3558b4f619ed42ee54929dff1c7e +ad8e70531cec21b4e6f55be1751c2d025bd2d7d8158269b054cfe57fa29252d052ce4478ec7db6ec705789e2118d63b3 +a8e4a4271769480e1b33a28c87a150ecc0b48bfe8a15ae04152197881de4ce4b03453aefe574842424edbbe4173e1a3a +b98c65726296610cef16c5b58da5491acd33bd5c5c5af4d934a9840649ef85730fbce8018dee09ded14e278009ed094a +8e213a7861223287b860f040e5caaa563daa0b681e4e09ec79ad00cc459238e70bbeaf7486bbe182fc12650700034ec5 +a2879f9e1a556cf89b9b5b3bd8646a8cce6b60bcbc8095df44637f66a2da5858eee2dc9091475a8f64bb5aff849389cd +8a17cdb4077b9b0bcf28b93294ac5ae4c8bba8839fce0f1012b53187ac008f9858b02925fbfc421f1123afcdbd8b7753 +86fd9c11528aa43946e4415ff64a3ca6409ee6f807368c68997b18605da65e415ccd85ad913820d450cb386593de666d +8ed55923b963c3d85a91aca11c40ff9c6c7f1e2b9bc199d1a270e5fb16aa62dec0136e97866145ae9d58a493e8b1cbbb +ae32af5b5d418668ae123c639b149e5eed602404e8516da4a61db944b537a3620545e8e3d38cf10cdaea980ab2f80973 +95cb8d9e9d6762d78dde0ad73869ffaca904a7d763a378b8cc11a7933d3e7d1c8aec4271a079b1b00f8887ee5b1ea21f +b5ea20b42a3ca247f00ab5328c05f0cf194973d5f7271c66c41c5055b1ffdca136be179709e0c1de209fbe07b9820bf3 +98682f7cce471c92a8d6d15fee4ddf4d43dd97c3e3811d2913618ecacc6440b737717c07736ae4558c910e11ee98104e +a67da2c7cbba48e929ca4e4b9a6299fe01ef79eff8cc5cd3fdbdc0721a68130e4079f30ae151a573a7dcca8ecf2e684e +a9981c9f9dcbb3b0f6996f664fb2acd7573189f203be37b2b714662aa273551396abfb1f612ccde4e4c8127a050dbe4b +92d55eff8da600f886da9bf68e8eecf482faa4b268f3f286b3b3e5cc91b19604081498d4905b201bb4ec68e32b5591d9 +963e3f1728de9d719c86d390f3eb9c3f99d1928347fab0abf10dbb37d76b59ddb64d4734c977863a6cd03ffece5ca895 +93480e2de83c921056b6d8628ac37cd5ef7555ba43b0308fc13386cb0515d42c12ecd06057137aa71a7931beaf90b9ce +8feae57ff0e6a162cc81c99f45c6187d268fc0bee8c2bffc92142ef76c253d201f0e932943cf2fa312982b281ce1066b +8f8f4bd4200fb87afcd743274480220d77571928000d4197410dbb75439d368df6a06d941a6152206371d2ca9cac99e4 +8ee7f11e79af4478e0a70eb424fe8078237ad99ba6d7e6bf1a8d5e44e40abd22d404bd39b718ad6fdf4c6601f2a47665 +a98acfcec612b574943195b9ba95bebcc9c0b945c9f6b3e8760b2a4635909246a9d73b0b095c27b4ecb3339704e389b7 +b520efd19f65e81dc285031ea3593f8c5dad793e4426beb9196ab46e45346f265fd71e50adb0da657977c60ed5724128 +a3d9d0b7415280ce4dfa2429d47b2b8e37604a5157280a72cc81d541ffe44612dbb3ef7d03693fc42a569169d5842dc3 +8c29e2d0b33801f6d9a9c065a76c5cad1fb0a001506b970307e21765ee97c732a4cbf1d7c1b72d95e0ad340b3b075224 +839e21f292892a6eb596b9b1e9c4bd7c22a6fe71d3d04487c77840028d48392c5cbe73140a4e742338e0c8475cd0c1ad +8bea5c68e7743998619185bb662e958f1b4d3ca81019d84ac43c88911aab3abe4ee9bcc73cb95aa3ae87c0138801bde3 +b8f262d21a94604049e008ce03dc857848168e1efca4522acb0ccc827ffb37f545e1947843a356563a76bc6489605b66 +a7bd0842b0bb38d9943b82aa883f36f4eb8a6e8a7790d4f87faf306608f51d250a19b73984f1156cef5dd2581664614b +a993e649bd953627a88a2539dac3a12ec7f37a4c65b01425d9d34edf7ee10a71aa98f65c9e013107f824faf8aee041a9 +8e07eced75c67cb4d2ec01857f6ac1408482e6b31cb2faa249e8cf99f180575587df530c7782a7539b5221121ef48aa0 +b2f4578f26c05ecb9e2669ca744eb19d4f737321ac7d04fafd18beb7866e0fec9dd063953ae1f077b44b9c6f54db1279 +b6b3788a6c7bcaf467d19daf6ab884d549aa866970c05a9181f544ff190d043192c84fe437a75a30b78b425461cca062 +a270684903c61544b85a7041e81f65e787e1c1e23e57538fa8a69836bed0ca1673861dd29f743a1280f2f38eddd3aa83 +a9c2397c4773dcad2821266dadfd2401d013d9f35de6744f2ec201f3507700adb1e6ec4f5a453be4764da8bf68543f26 +83a3025ed6fd5df9d98be32a74e10a0d9728b560942d33ba028536fb148fc34ae87e92be2df3e420a8dfec08da495982 +90dc70c183a90bab988b4a85b7b921c8070af0e5f220364fe11afa0722990b2c971e1e98eef62d3287fedfd9411f1df7 +82d940937a6c636224d04f8e2536f93dcf20dc97a5f188875ad76c21b804aef9af10839419b61143c1f88a695959a6b4 +8017f9473ce49d498d6f168137e77e62fe553e5a51e75b519cf2cbd1ab9afdafad80fd5e6fd0860e640b0d78ca8ed947 +80573a0ec049fe1f7b3013b2839e145cd87e07c0e43826a29ef8c92516f9a30896c2ffcf3ed77ed22a6cf3101b1789d5 +953349abd2559f9824db07cec857ad54f1a05018f3076425f8dbae37f8d92a46af2c04ab7c8ec0250449541187696e98 +ab7bd2c4f05ee9a9f252c4e16a20993a12c535c3809d124bae24642616521a9768d3f19eceaf8524583f47ae1f527684 +9883b77ee834ee0112ca2f366d2a6fc213e0cf454e061438c2901a5ba35b7378f64da8adf6a476eb1562991ef5b4a5bc +89291811db308637356dbf7ed22cf07bfce33eb977734ee346e8c15a231b35d8b4443574f3fa97a40867b3e23b0bbfa4 +93d753849d7d9588d39e38217500b123a6b628a873876612d9f98b5d611f52c89c573432d2176752b5d1cc2d94899b8b +a45add3c4844db3b7a237295fc85fddc788ac1ec395a0524d2fc90a539571a247146aea4aa10eec30a95e9617c85b98d +90f94578842db7a4de672da1e483858ece5e466c73c12f725a0fc71f42ff880c9447a33fa9096839bee817536f2591e2 +b2c1b6fb031bb30460f157356562b44b4de096a0a112eab4fb3cc500aad38bc770da1fc2e73caf687a0da5e8537049c0 +afb15e15fd930929c0e3c66482068a5afe0c7b7f82e216a76c5eb1113625bfa0b045a52259d472284cfbaf4796c71456 +ad222a9a3d907713418c151b8793d5e37634354322068f8206b9d0da1a3f53b0004193713d23ec35990639a1b6c2e075 +b44a128dce97e8c4b178cdbca0a5c1b3f6e164490fac0fd68dbfe0aafa89920bb4ea420a8527e06c80dd19c2f135e3ef +8596e993ef18b8d94e9c42a90cb7060affc586b8e9b526820d25124285de5590134e2e86592e9dc4dd45ccf5d578fa60 +b71bb0ad138141ed506b2253e84110d2db97cc2d24a3fd0d096b0022d9f38f87aa74e2f505074632d64e90bcc491aa30 +84841eafd357309de47b92ca5ec163dec094a2e5271bc65898c31932e0160bee165e4decb23af339cfe09c83e1cc5441 +8a2915ee39a6fd4a240b98533d7690ef1773ce578ed1fb05ed414ebe36f7ef289fa46f41768df57190438c356331e329 +90bb337165386f1990cbd8ed2e8321ef21bc18125b015b4da0c37e5fcc446b26005379ee4fad8ce9348ceb4ab49e82e2 +b707b50ea2ab05c6d183671587f25fe29eef23fe569d731459a1ac111a0b83a2cd65b88242876b34aeead3b05a15d745 +ae1f159f79b7996315c4f9acce7e21a6ed59d4ef76331196fc86911fda3035edd5c11d568b105175a36c948d0263b382 +922bc525bace05e5dff6b5cabde5469ddd2c1c601f7131abc04ecefdd35095e6ac015b1aec3c3b25c5dee8d139baf60d +a7b060405b2740f82db64683187b1bb89e5f40c8438663c7cbc8ef2513929fe5f92625667a7f2f599a72a96b1fc8f08a +b9dfe94a08651db5efefbb813269bce80d814e3089b80c0654491e438d820bf521f8a4a4477909344ba88f7683eebb43 +841817a9729465743576950b6e8eea32ebf39cca99ace86c4792f9f35926e2d6830c52854a3b2eaeb61694e6845008bd +934128034bde8fc7b93b952aa56e0ed28b36cfa04cfa1f0d5b38266dd40beedff5e0bab86e4717b0fb56c56be2eae26b +aee9d64caf28596308782cd8f3cf819506daf3378f86157ff775e618596411adf94efd0e9542787ca942066f02cbd332 +85871184db314411a49575fee088c52ed5dba4e916ee001ec24d90898a0154d9790a06aa8a707ca7a8b986c0293b8d89 +8d3d87edcc0187a099c97b581a598d357a41ac152303bb27c849eb78e72e15cb97cf9a0468fc36f245c3e152c76bb7dd +900475d165dec18b99eb7b5f9e9ad1d2d4f632e55fdcc4c5ecd7775fed462990e6aaafe9c669f40508f9b15f00bda31f +a25b5954edd57e7811a0d18532043d975c7b44b80f65cd630935d7b16ada05f30fe2b7be7ae8a2f54c25957faf3f1950 +a089019afa3a7a15f7e7874e73b6773c0a824e6d3379b4c928e173321fb165ad979a6be004d394c28d19d410b2655d3e +b28f46797dee0c538bd3de815df641a0ef718ad3e52b2764aec380d6905b38b50ad6f60d0f68e096ca39960ba7734355 +b0ac155d3d05851b04104e6b459f1a68e9e155437c92421a7c0e4dd511ef89cf71dfa3cc920769492ee283a65ebf029e +813c69a810745580d43d5b5480f0ba81000fbef0071e6b655c7346bef5ed774e9214a7816d40eb1774a5bd033767a046 +b176345ca75c64f10ec33daa0dcf1f282b66a862fcd3d8d66c913f9a02db4c9d283dadc02eff13aaab94bc932a42234e +92560f67e5b995db4a489bb86ee78b4aee0800143b3535ad557a53e9e08716bd0202d9f5714722c2a5e8310046e3f5b3 +8adb427bad9cc15fc6c457a96a6750dda8c46d859c5f69bf0e7ab8fc0964430b33967fd47cf0675b6ba1757f91255e6e +b120f723b80389a025b2daa891b140b3d7b8d520ae2a6a313f6e3d365a217af73292dcb249dca1f414ec05e865e3cdc7 +a61a5d261a8dfe5996c42ea0a5ae703a2adcfda80e86837074d868eee16f87d38da19596c48b55dbd7a7cbec1a9b4996 +99dc921eacc6bb867c5825ad4c83bc4af9dd78a18b3d0e1a60ad493e3805b8fb9b7922b577da1adb3d805edfc128d51d +85455fa165a07282aaab4a5bfb88027f47b9532e4af8195c048515f88b0db7e80f42e7a385fd4944faaa7f2a6544ad17 +96dff2d1c8a879d443fe576d46bcceaf5f4551d2e8aad9c1a30883637c91090de99ad5eec228eb5febf93911502d3cbb +a87eb7f439377fb26c6bfe779701f4aea78dd7980b452a386afec62905e75217a1996c5234853432a62ef8bab21c31c3 +b598278293823e9ccb638232a799211173b906444376337fdf044d0227d28fcc4c5867e6ecb3200e59ca0b139e71cac9 +aa6fe147edc95027654d68140f428ec53cede3552c5f49c09d18bc6f6ae8c739a63042eb7291d14d717a4e1f0778abcb +ae8ee18913d328b2fba71efe65526d3ee9c81beda53cf776baec4019ea30212010758cbb5dc85ed6620ce04b189f01f2 +ae9fb686777e88dffdd42805fe4114aa0da1b350d92a27ff3f8a817fb25af1fcfc9a06155affe0273bf13caad16a5351 +95d372ba3a2ee38371538f34aae91b4844488e273f70c02f1992370f89fc2343eff95692d52ce9f21206abbee4959958 +b15260376f0a34ca2827ff53acd7eaaef94c9acc2f244b36500423069cb1cdaa57ac8dd74adb5b53d0fd4265fcbb28ea +b0ffce6a8059537ef6affdbbc300547ef86e00109289239b0c6930456c562b4ed97f2e523963af17736dd71b46c44ac7 +b5499a1277d34f9892f7579731ff53f423f2ffffa9ea43a6e929df8c525e301396249a2324818a6a03daa0e71fcd47b3 +98dbfb8e97a377a25605a7665d4d53e66146204d8953afda661ae506858c5cd77ff7f21f5f10232e06dbc37378638948 +84177e27e6da0e900c51f17077f5991e0e61bff00ca62c1623e627c5aea1b743f86eef6d55b13219a1947515150bade6 +b50407bb5c61b057ab8935df94fd43ca04870015705b4f30ceac85c1035db0eb8293babc3d40e513b6fb6792ecbc27a9 +988699a16917514e37f41ab5c24f4835ed8a2ca85d99972646fcc47c7e2a83c2816011144a8968a119657c4cda78d517 +920c43fdcb738239ad542cb6504ab34498bce892311c781971d7db4dec70e288676de4d8697024b108cfa8757fa74035 +aaa106329aac882e8d46b523f126a86d3cee2d888035ce65c0be4eaae3e92fd862f6ac2da458a835539cccafaba9e626 +96e4c1562d14b7556f3d3e8a1b34ea4addc5a8170e1df541dc344728bcb74cd1630eb7ba4c70e9c68fd23c5c5d5a729b +a616ac5016d4e68e03074273cd3df9693ee0ce3458e8758b117a5c1bc6306dd2c7fad96b1bb37219c57ac62c78ad7a3e +8db7d9b20abfb1445babd484ae9e38ff9153ac8492230d7591e14e3fca7388a5ca6ef7d92ed445c8943cf5263e4a6ad7 +88464134221aa7134878eb10928f31c8bd752ab68c27c9061c1de3f145c85731a4b76acdc7e939b399b6e497f9e6c136 +a5f7c794f70b7c191c835dded21d442b6514bab5e4d19b56f630b6a2f1a84a1d69102d7a0dcca256aab5882d3f30f3ca +b96b6f98b6817b5fa6b1b1044e2411bdf08bf3ffaa9f38915d59e1d2b9bed8b3d645eee322ee611102ce308be19dbc15 +92c26ade2e57257f498ac4ff0672d60b7ea26dad3eb39ed9a265162ccd205c36b882dba3689758c675f29e20836b62d9 +8379a0299e75774930577071d258e89e471951642b98e5e664c148af584d80df4caa4bd370174dae258848c306f44be5 +a0e53beda02bd82bf3d24bd1b65b656238128e734b6c7a65e3e45d3658d934f909c86ca4c3f2d19e0ac3c7aae58b342e +8ca5ceaeaf139188afd48f9bf034d8baf77bbf9669791c7e56ebf783394d7fcdf2a25fa4bdfcddfde649aa0dc67ccccd +a8060e6448844e9db4e9fb4da1c04bcf88fda4542def5d223f62c161490cf1408a85b7c484341929c0f9ce2a1d63e84b +af6e1a5ecf50b754bb9eb2723096c9e9a8e82c29e9dcaa8856ab70074430534c5395534e1c0ed9ce98f4b84d4082fa67 +81c8dbbef98f1b561e531683d5ae0f9b27b7f45dc6b2f6d61119ca0d559bf4ceb676d320afc5aba1811eeef7547a59d8 +85b46cd64d605c7090a2faf1a2aadf22403b3692b3de1d83e38b2de0108d90ac56be35b0dca92c7a41c4b179a3567268 +8dd3cc3062ddbe17fd962c2452c2968c73739608f007ad81fa1788931c0e0dda65032f344a12249d743852eb1a6d52a9 +8630f1707aea9c90937b915f1f3d9d7ba6bda6d7fdef7a40877a40c1ee52471fd888f84c2b2c30b125451b2834f90d3b +b4a747e0bd4e1e0357861184dacec6714b2b7e4ee52fa227724369334cf54861d2f61724a4666dae249aa967d8e3972f +a72de682e6f9490b808d58f34a0d67f25db393c6941f9342a375de9ca560e4c5825c83797d7df6ed812b71a25e582fff +8d5ea7d5c01f1f41fffe282a334262cc4c31b5dcf31f42cc31d6c8e37c9bd2f1620a45519dab71e108fe21211c275b6c +8ccdc7e3642c2894acbf9367f3e99c85963cea46dc5473d175339a2391be57dd8815feacadec766e13645971213b9eb8 +858e9b5fc8c13b651ff8eb92324bdda281db4cf39f7e7bd0472908b3e50b761fa06687f3d46f4047643029dc3e0ceeaa +ae20d36c70cd754128c07cbc18dcb8d58b17d7e83416e84964b71ccff9701f63d93b2b44ec3fddc13bbe42ebdd66221e +860dbf7013da7709e24b491de198cb2fa2ffd49a392a7714ad2ab69a656ca23f6eafa90d6fdc2aa04a70f2c056af2703 +8f809e5119429840cb464ed0a1428762ba5e177a16c92581679d7a63f59e510fdc651c6cc84d11e3f663834fcafeafdd +8d8a8dce82c3c8ea7d1cb771865c618d1e3da2348e5d216c4cbbd0ac541107e19b8f8c826220ca631d6f0a329215a8d6 +86e3115c895ae965b819e9161511540445e887815502562930cedc040b162ecb1e8bdc1b6705f74d52bf3e927bc6b057 +b9833b81a14115865ca48c9c6a3855f985228e04cbc285f59bf163dca5e966d69579ea4dba530b1e53f20bd4dccdc919 +a71f5801838a6dbb162aa6f0be7beea56fadac1a4bcd8113a0a74ab14fc470a03775908c76822d64eb52a79b35530c05 +a77ab73ae94b6d3378884f57eee400eff4a2969aa26e76281f577a61257347de704794761ea1465dd22a6cc6304fbc4a +acd1c5df3c487c04cf27f002e81f2348a0119349b3691012526a7b0d3bf911cdd3accbc9883112ed2ba852145e57fe68 +8a28515a48832ac9eaf8a3fb3ad0829c46c944b4cb28acbcdbca1d0d4c3c623a36cda53a29291b8f2e0ea8ee056b1dee +846bafca11a7f45b674237359b2966b7bf5161916a18cf69f3ec42c855792d967d3bf3f3799b72d008766206bb7a1aa3 +b24b341675b1db9a72c3405bbe4a95ccdfd18fa96f876ec946ccb5108f73e8816019998218a036b005ef9a458e75aeb3 +b99c267b4a09193f3448bc8c323e91ef5b97e23aeff227033fe5f00e19bab5583f6e5fcb472ec84f12b13a54d5c0e286 +a088aa478dbe45973b04ecafbcbd7ee85c9a77f594046545cdb83697a0c2b01b22b1af0b97dd75d387bb889e17f17aa7 +a0c6b0cdff2d69964134a014e36c3709d9e63f6463c5cd7b01b6f0be673731b202d577539d89dd57a888326da1df95af +b4e6dc4ef11b2b41794ece70a8968e56705199d183366759568b6fa845d2cae127486e926b5b27ae9118bb21d1682c1d +a007804353f174098f02540a57e96227232444d5ae0a24232c244647148b6c049848cbd2b50d0a25af3ca9164bfff8ee +873fb034cc39c9cee553ece908fbf315f62efbc412b9afdde6a1889326b7f6f813e050b0601ba9921688e958cb75942e +b5676c90f0106c40d8683299e59d564f505ec990230cb076caef3ae33f2021e6aa5c9b27bb8fead05fc076df034c28f5 +b5a67fc4c5539ad1ddf946a063110f824f7f08d2e4d30762c9d437748c96c9147a88efc22260573803ab545c18b108f2 +817ff2b748a949973a91b69b0ec38efbd945aeb26a176d19f0fb76e261c7526c759e6f5516f9ed34de6eb1ac7838c9cb +99b76bda3526a5d841e059010fdb14eb2fa035a7d10463373a062a98c3c1a123e2da0848421dd7546d776438fd05e304 +aa0d363270f90d56bbee7ea577b0c358532bda36d9247af6c57d000044a97ba41e35bb0db438f4c94551c6350e4e0674 +acdae205d05f54b9544be96c9032350511895ccf413dbbc56d1f03053185df22a6d5b7ffcc3fbe96c3e2ce898ccfa73e +b091c220a1de18d384f50dd071dca4648ca4e708162c52a60e2cedc0188e77c54639f75bce9a468a64b2549119c07ded +878676133e5c700b1d4844564fa92a9930badb5293d882aa25ee6721a9f2cfab02088c31d62cf1342ae3edaea99a1ea0 +9756d0793e6aba3b4dff48100bb49a5ec08ec733f966cb438379b91caf52fc2a5930830ec3f49aa15a02c82c1914dc7a +9722f760184d3b2d67cb2cea7fa41b1ff920a63446006bd98c6347c03d224d2d8328fa20ccd057690093d284b9a80360 +b5a68489de4f253715a67f0879437bfe8f4dfc4e655ca344848980e6153b1d728acde028bb66fd626fa72eedd46ff683 +a8cfc900b34835d9fd3add08044636f69614eff9ae929eac616c39bd760fd275ee89bf24b0f275dd77a66e54fd6b94e5 +89967479bebf70b2893cad993bf7236a9efe4042d4408022fdbb47788fabedcec27d3bba99db778fcde41e43887e45af +889235938fcec60275c2cf0f19d73a44d03877d817b60bb26f4cbce09db0afae86d42d6847b21f07b650af9b9381fa82 +b7fc321fa94557d8fbdd9fff55ab5c8788764614c1300d5ef1024290b2dbb9216bce15cb125da541f47b411a2e7e3c2d +b11b0c4dc9477176b3cda6b17858dbd8c35a933ed31364801093f310af082cb5a61700f36851e94835c5d4625bf89e32 +9874e54d2939ee0600f4194f183877c30da26d7515e9e268fea8d24a675dd2945d1565d9016b62b1baab875ac892f4d2 +90df3a77280d6f1fa25a986309bba9d5b89c3cf13656c933069bc78e6c314058716b62eacfa7ab4aff43518b8b815698 +962b08299a287d77f28d3609f39fd31bc0069f7d478de17539e61fcc517045050644b0307c917208b300ce5d32affcca +b30eedca41afb6f083442aaa00f2e4d5dc0fda58e66aaf0f44e93d4af5c4bf8ea22afec888cacbf3fae26d88e8d344cc +847747a22fab3fe3c8cd67f3f1d54440f0b34ce7b513225dc8eb4fa789d7d9f3577631c0890a3d251e782a78418fecfa +8d1ef3cb5836e4039b34ee4e1b4820128eb1e8540e350309e4b8fea80f3ae803d1f25f4b9c115482b324adf7c8178bc7 +8f8a2b0b0f24f09920b58c76f7d99ec2eb2e780b5a66f2f30a9ed267dcaea0ec63b472282076c7bf8548211376c72f6e +831ee6dc8889bbf4d345eaeb2f425959c112d2190764abbbe33bc44e1d9698af87ff5a54d01fac00cfee5878dee7c0f6 +a7eb2479ac80d0ee23f2648fd46c5e819ad3a1f4752b613607ae712961b300e37f98704880ac0a75f700f87d67853c7a +aa4d1b9cec62db549833000d51e83b930db21af1d37c250fdc15d97bc98de7a5af60dbf7268c8ec9c194d5d5ccda3c1d +87396fd7e78c4bcf270369c23bc533b7fb363ca50d67262937dab40c7f15bd8448a8ba42e93cf35fb8b22af76740d5e1 +a958b2a9ffccbca13c0c408f41afcfc14d3c7a4d30ea496ce786927399baaf3514ff70970ef4b2a72740105b8a304509 +a5963a9dd3fe5507e3453b3b8ed4b593a4d2ced75293aee21bfed7280283348d9e08bf8244c1fce459aa2470211d41ea +8b06ddc3359827558b2bb57caf78b3e5a319504f8047735fcc8ec0becf099c0104a60d4d86773e7b841eb5b6b3c0cc03 +9437e7278283f6d4d1a53d976c3c2c85c5fe9b5aec7e29d54a5423e425b4be15400ed314f72e22e7c44ee4bacf0e681c +b56067ee26a485ed532c16ec622bb09135a36c29b0451949aa36fee0b0954d4bf012e30d7e3fc56e9f153616b19349bc +a5c72f7f5d9f5b35e789830a064a59c10175093a0ce17654da7048827d0b9709b443a947346b0e5d96b5ea89b8d7c575 +a8318d01182d4c9af2847a29a6b947feef5795fc12e487a30001cc1ec482b48450c77af4837edfa1aedf69f0642c7e5e +82ea421c091552d3dafa7da161420cb5601b819e861dd2ba1a788c3d1b5e8fa75cc3f2b0db125dde8742eb45b335efa2 +8679fd1c7771ea3b12006d4a972f4f2892e61f108107d4586f58ee7f2533d95d89b9695d369cdace665f19c6bc3bc85e +b5ab3e8adee4c950fce4d33a0e2f85d3d886e60a6e2f4454b57bc68725f0cf246372d863167482cce1ea10a7c67c3af2 +a85696927075ec188979180326c689016a0dc7a2f14ae02ea27c39ef91418cd44177d3fca5752cf6b298fd75fa012e26 +a44f87b7232f102cd092f86c952a88afb635484a984da90a41a57a3d883c9469064bf105b9026024090486b6c6baa939 +866ac91a437db945bbfdc11fcee583f3669fa0a78a7cecf50fbfa6ed1026d63ad6125deba8291452bf0c04f2a50e5981 +b780d5a1e278fd4eef6139982e093ceafea16cb71d930768dea07c9689369ff589d0c7f47d5821d75fe93b28c5f41575 +b025d0046e643506e66642c2c6a5397a8117bbfe086cee4175ff8b7120e4f1e6794e1e3f6ec11390993cca26d207ae43 +a04a22b6e28c959ab265c7f48cde42bb6a00832c6beb2595b5df2879080a9424890960417d7d7ceb013d697d0ebf7267 +81de9c656ac27f54d60d0252e33aff4e9e9e9c3363a50740baf15a2b9061f730a51ae1704e8c4a626153cf66d47f19b1 +a15fab90599df889df11fa60c752948b68fba54005491180dafb66c5775547976d0eef33945e55d4818653e0818c6f92 +b06f9be44ddb103a72fa4ebc242c8ee1975fe9bf9ef7124afeda9967ff3db644dbf31440151b824869406851a90984a2 +99abdfe6806ae5efa2d11577da17bd874d847c5f810460148bc045bcf38c4fd564917eacb6ed61bb9164ed58055cd684 +ac53231077f83f0ae5f25e52b70bb6105d561c0ba178040c11c3df8450c508ed5df34f067fdaacf716f90b4926f36df5 +99e3f509af44fc8d4ebc693d3682db45fd282971659f142c1b9c61592573a008fc00502c6af296c59c2e3e43ed31ec7a +98f2f5819670aff9a344e1c401f9faf5db83f5c0953d3244cfa760762560e1c3a3c7692bb7107ea6eaf5247ac6fd7cc8 +b5b9f90391cec935db8d2b142571650fcbb6f6eb65b89c9329e84b10bfa1c656026674d70280ade4ba87eeaf9333714d +b0696b77ca8a0cdbe86cad12f358880926906fb50e14f55b1afc1e08478ae6376215cbb79bc9035de2808c7cd2b13b85 +a51d746833062a65fd458a48a390631d5d59e98e2230b80d8f852cfc57d77f05eefcfd3c395ade1e86d4a39c2141365c +812d67654319f4ef3c9e4a2d4f027a4cb7768f1ea3f5fdde8d1b79187a4b874ff9a5c70f15b7efa079c2dc69d1b9b1fe +968978b653c6416bf810f6c2ffa3d1abbefbd06f66b6686e9a4fdce3f869e0ab1e43cce14dc83786596761c100ae17e1 +98e1e6ab562ca7743783b802faeb0a24f1341abfb9655f106920aef08964a3c0e8083e1acda7ae28fed7cdd5478decb6 +a91c0b982a0a7085a103600edf99e9d0bee4c4e7db6d9f8f376c215c7d42476218462a3765f2928e12c3dd49d688e4fd +8a43395b3124fab9e2438635bf88952e8e3084dad7ecb3a9927f9af0e0887bce4707084043671fc98ad03621e40a149e +b0b37626143d4a8c6f5693d5f1fe871525b4dd946c4239cde032b91f60a4d7a930d7ba28959737550d71c4a870a3a3be +b01c74acae1715c19df08d5f4a10e0c19d1356264eb17938d97127bf57e09ced05ba30d0fc1a9f32d6cff8b0d5f91c9a +b4c2328eb8a5a673406faed8f0aebb8540d2791646e37ce46e0e382506570ca276eb6f8e166dbbf9e0a84064873473b9 +85cb9f769a185e3538e4a4beda9a008694e1bf8dfeea9dc07c5c40a9ceb1d31fcb13cacfaa52849ba1894b5027cb8c30 +8742f91cddc9a115ddc73982f980f750d82d3760f2d46ee4490d5b17c6c3bb57c7d4c7b8d6311b7b41e59464c009b6a5 +948ef86d17128a061e1bdd3ea7fcc7348e3ec87ec35dc20a58dd757d5d18037fe5e052bb359e27ab4c2320d9a52a6a0b +a70f6a214097c271e0d2d95e30fce72d38c30a2f186271fdff0e38e005aff5baed53739b8c4f9501aa7f529c5cb2da59 +892a7574cf6704ad75b346c95ae6f2668904f1218c35b89b07a0c2dbf3c62173c348f6fd9473926eef56a37c0f635c04 +837e85a41f39b4ded1420aa8fc3be46a7adb99305e0928c6d7643b7c44434b72984cea08eb68f5f803661df0db78c87d +94e495329f2aab3eeb68f347961d1006e69d990095877a4dcc376546233adf29a14bf6b16a0c39aa477e15368e87014c +851860a8fdf76a97048396553262637dade27f1f63f926997e74c7c72b14b10293eae7824e8dedffad1aead57c124f79 +90481017a250972055ab1cf45ff17d2469517f10f18c9d4ef79a9bdc97a49093289bbacfefa8a1e491bbb75388b34ac0 +983db15f7463df28091c691608ca9c51095530fa6b1b7b5b099c612e673d29e16787cc9ae1c64370ba6560582ce623c0 +a477dab41014c778a1b78a7ce5936b7b842124509424e3bfc02cc58878c841c45f9e04ccc58b4f2ff8231488fff0b627 +868ebba1c85d1f2a3bf34c0ab18721ea725378b24f6b6785637ee4019e65d4850e051c8408fe94a995cc918c7b193089 +93cbf4238a37ccd4c8654f01a96af809a7d5b81b9e1eab04be2f861d9d2470996fb67367e5bf9dcd602dc11a3e4cf185 +83113f4e696030cca9fdc2efc96ba179cf26887c677f76cde13820940ad6891cb106bb5b436d6b0f8867f2fd03933f7d +90c709f4e3359a6d215d03f45ad5cf8067aedd4aab03512dd62229696485a41dcd64e2acce327fda390e0352152fce13 +9945cfced107a36f3cf028ba04c653360afc5013858b9a12fac48802efcbc198c9baf3a7f9b23dfdd5036e88bc7274c8 +832ae60192b47fc735a8ddeaf68314b16256c90ab68099f58e43073e249c6939895c544a02fa34e40805bc6b5db33461 +8b12c335818b643c1d22cbc2869606cf64e7ae54a7713617fc4dd3b2f052ebd6b920ca59ba2e9c7aa8cf71bb4f40f9e8 +a2033eb7a373931c65d66989644aa0892ac3778b9a811b2f413d8bf534e282c339717979f9aa742162abb3468c195f87 +aba2b4c37dea36bed6d39323e5f628ab607699c66767f9bf24ef5df1bfcad00c2664123c0d8d5bd782f1e14a06f4c769 +b71963777535b4d407286d08f6f55da8f50418486392a0018ee10f9ae007a377b8b8336f33386b0eb01c45695c3ed2da +88dc87826941340913b564a4f9b74985a311371c8e7b47881235d81c081f1682bef313c2f86561a038757fb7d6a1a8dc +869e13e3fcf91396750150f9dc9307460494c1d365f57893fd06fb8acf87ac7dddc24e4320d9cad0414119013ea739b8 +92194e292303d32b91ae9cecb8d6367c8799c2d928b2e2846dab1b901371a4e522fc4089aad8f4ee676f0614ff8b19d7 +aa589a3e512cb4f8589bc61e826a06d9f9cb9fdfd57cf5c8a5a63841435b0548e30a424ca3d9ef52bf82cc83c6cb1134 +81802e0194bc351b9a5e7a0a47911d3a0a331b280cf1936c6cf86b839d3a4ab64e800a3fe80ea6c72c3751356005a38b +88e5e9e3c802314ddd21cb86f2014948b7618502a70321c1caf72401654e361aac6990a674239afa1f46698545614c93 +abac1e0f85d5c3ff6d54ed94930c81716d0ac92be49e3d393bed858833f4796c2b80bf7c943e7110de7b2d148463bfbf +b7eb416004febd574aef281745464f93ef835fd65b77d460b6ad5d5a85a24b536b4dec800cfe80ae98489e54447e8bb6 +b3fd8ed1c30e7c15b0bc0baf0d9d1ecad266bafb281cd4e37c55edc76c202fb1e4ea315a91a2848f40f481793ae35058 +86ef674ddf4b7d303c68bbfb53db00b925ccbf11d7d775ca09e458f4ecd868ca828103e8e7cd9d99672a193e81b83923 +95ef414e9f7e93f0aaaeb63cd84eb37fc059eb8b6eced2f01b24835b043b1afb3458069c45218da790c44de7246860c9 +93ec8f84c20b7752bfc84bb88c11d5f76456136377272b9ac95d46c34fce6dcfc54c0e4f45186dd8df6e2f924f7726ab +95df5f3f677c03a238a76582d7cb22ed998b9f89aecf701475467616335c18e435283764fb733fb7099810fec35932ae +8cda640695c6bc1497d19b9edc5ff4ea94c1c135d86f573d744358758f6066c1458901f9367190dcd24432ae41684cf0 +b19aedf5569435ff62019d71baa5e0a970c6d95fe4758081604f16b8e6120e6b557209cdea0ccd2efec6ff9e902d6ce6 +b3041f21f07d52e6bd723068df610aa894dfdde88094897593e50c5694c23025e412ef87a9d16cadd1adbb1c6e89ced4 +a7f8d6ab0a7beb4f8d1cfef6960ebdaa364239eca949b535607dee5caeff8e5dfc2a9cfb880cc4466780c696cff2c3a6 +99a565b4796e2b990bfcb234772d93c5ffdbe10453b5aa94662272009a606ba6ea30cc0c3c26aa22982c1e90738418a5 +90c54b55ff19157c1e679d8d4f7f0687a70a27d88f123179a973c62565adfcc9347cfe31f54539038cf2f34556c86870 +8612f34bcd018d742202d77d7ce26cf9bc4e0d78e50ddf75250b9944583b2c6648f992b635ea13fdaae119764e7c28d5 +a04fb38e5529bf9c76ec2b5e3a1ef3c6f9effb6246c7f67301cfed707356ba1bf774f2867c77a5805933f0c8ad0ec644 +b4800e7b503da0164885d253135c3b989690794d145182572181995e6fa1989f3d0324993e871bbd5f48fadd869d8a18 +9981cd4f28ae7b7dadf454fb3aec29746dc2e0ca3bd371b2a57cd2135a7d93559e02132528ccd2d305b639d7ac51613d +a3ceec012dd1fbad3ef9f9f1d6fe7618e13d4d59e3f50540d2a57010d651092979c75442ec8b38a1ab678505e30b710d +8b97b8654d067fb4319a6e4ee439fb8de0f22fd9db5569ba0935a02235cb4edd40a4740836c303ec2394c59a0b96308b +b3d1bf4410fec669a269622c3ce63282c9ac864620d7b46c9dfcec52d8e79b90c4c90a69c32763136a7f2d148493524e +93174eba1e03f879e44921084aa0ee3562e48c2be49085de96ed7621c768ff52324d14c8cc81f17d7ed50c38ffb2c964 +aa2194cd0fb7aec3dac9a1bd8ea08be785926ed6812538be6d3c54218ea4b563646af1f5c5f95cb914f37edfae55137d +93f2c0dd59364f6061d3da189e04d6c64389a3563b062e8f969a982cd68cc55b4f38b21546c8a67c8df466ff4f61f9c5 +aa7dd497cc949c10209c7010ba4ce8a1efd3cd806a849971e3e01716ea06a62e9d5e122ad1d2b8e5a535fae0a01a7761 +ad402424b2a32bca775a66aa087580d7a81f0867f293f1c35580b9e87ccc5a2bab00c29a50fd0d7bd711085ae2248965 +96237843d8e29ac77fc6ebf4acc12946ad11697de8e5f152fe5776f2475b790226a7d156ac48968dd68b89512dc55943 +a45c25cdbb9fc327cc49a1666988af9ab4c5f79cea751437d576793a01c3eeea4c962c05c0947852fe0e4c63e1c84771 +93dcf834a614a6f5484cc4ba059e733ab5dcc54253229df65ff5ad57b447353ebbc930736a4c96322e264e65736948dc +b9a94f82a82c0c5a26f2c1d5381afec3645e8ee04c947dc3b7ad59a73018db1e9965ab3642f2bbf60f32c430b074fb22 +94eab29b3524ccbe0c4b928e5fa5dd8f684074b332fcf301c634d11083653ffee4f7e92ddbcb87ed038024954ad1747b +b8dca5f679931d6abef0674bad0639aefad64c2b80572d646aaab17adf5ca1ab2ebeecd5a526cadc230bec92ed933fc2 +944d394958e539251b475c4304f103a09f62448b7d8a8eaef2f58e7de4f6e2e657d58d5b38e8513474115f323f6ec601 +8a5ae1f13d433962d05df79d049b28e63fe72688fc3e6660aa28e0876a860c3dbc5fc889d79f5c4dec4b3a34cdf89277 +afa5278724998eced338bb5932ecf1043d2be5dd93f4d231d05d2ea05b4455f2ffdc0eadcb335dcace96dd8b2b4926fb +b91153a2f4647ae82fc4ee7396d2ca23270ec7f8884ce9eead7e9376270678edd42dd3d4d6c003dfc2dde9fd88cc6e7c +adc932f1c679bf7889cb1ff4a2d2897d7973483fa283979a0ea3640c80ed106ea0934c1961dd42d74b22504be49851f2 +a82e90761fae684d1415cee0649bb031bcb325ae0b28f128ab8e3650bccedd302a70de1a341ca8decfdda76f3349cad0 +8ae353188b4b98835f4ef0333cccb9e29e1ac3ec11d554bc96f5880c101cb3c84b8eefe72f2287b0812735339fe66cfa +b8b41135bb1a1ffb64afbd83e2189e755f2c350e1273cf47c38ae9b8c4800d831436a69458b8ef9fa8b95a148d8ec9fd +96f75a04d8752fa93dc1eaf85ad333cff4eeec902a345576139e16de3a88eeb71b6726224349bb9844065cc454d959e9 +ab82b05e3923ad4c26f5727c60dc0d23063c03f5a4fd8077da66aa87042cad1bd99586d4ab35aa5e4ce6f4da6fecf3c1 +a50c83db91c26ef7bf1720d8815b41bd056b49fd99710943679a162ccf46097a7a24585750ece886e38eb4fdb866fa37 +a719f667914a84f62350dcc6f4f30b9ab428eac6837b70318c3ac491c1e69d48af5e1656c021818f377d911fe947c113 +a148807aafddfa0a5624c7cb9e42468219e4bdb9994ec36bc19b6e6d7c4a54d3a0763d13ca80624af48bbd96d73afca5 +aa012f205daf22a03e9fb13a63783dda7666f788a237232598d02a4d4becec7a699ab493f78d722ce68519262924c708 +97fc15fab5952c5a2d698fd6f7ad48aff1c8aa589f7d3b14285fea5e858c471cf72f09a892e814104fa2b27eb9771e73 +8da8840236812667c4c51c8fc8ab96d20dae8e2025290b9cde0147570a03384370b0fcbe20339c6aff09cca5d63e726f +b477d85359a8e423fed73409f61417a806cb89c9a401967622aba32bf85b569e82bca1b3394c79e180114a0d60b97316 +b3d6ee2ed1e4c5cf8ba2c3a4f329832e41c7fdcbcda8a3fcbe8f60967fdb1717665610b7c1ac65582534d269d762aa09 +a0b3b30b1b830b8331ee19f96b4a4321a6b93a3395b95d3a895682c65ec6ea64774b878b93514eaf353f2e4be28617b8 +a2b88e9617f4d30ef4e686d1932ad43cd555fadcb5102e51bea19e6fca649284ccf4debb37b5cb2090ef386fa5bf5327 +8a4446f7e8463ea977a68d6217a9046ad4356d6fc1c18d46c5d2ab681ea977b8faff136d65abea6bbf8936369cb33117 +91e7464bc56e03f436228104939ddd50caace5a38f68817bb2991e193b57adf6835152bbf3dbcdebf0382ac9823f60c9 +961a441e6cdf8106c4f45e5b47190d35644faec701c9cfc41ced40cfdd1fa83752fd56c1ac49131a47f1970a8f825904 +94b7b165cc71c2ae82976b8f03c035fb70e90028992b853aa902c0467b384c7bcf01d56166bec5def4453e4d0c907e52 +a5d32cffabbf547f900026b34ef46f08075b7a244565f615370d2f04edf50b094c95088a4a139ce07caf55bcd99afa07 +b4e06e73660745f75ab2f34d9f6d2675b58f80f911ab6dd4c5a6ce1095f9a2b50d86f6ff9a05394190bdf96af0827920 +ad3fd8f83c0103b29d41319209dffca201d2b98094362da08da3fd6ff0ba96796b49d6bed525c9adb96c2954858e7f48 +b0c27430695f0fd20ae31e1ec621da090094f2203e17411db9384695ffcf5c7c6badf461ba49ba70164aacebd6f278ee +b9bc6e972fc3b532fd2b1eeafc4bceb77604885f32132af6a9a842fa2440df452f49ec0cd9d86da1180e8deb0723b260 +9729e22d6104b0174c136a854920f542b384d375040adcebe36acc253bdb55845eb43e34dc5a7cc27d22c417973c24d0 +a8b420b36d48786c9231d454468a6e855dd7f71dcfd095efc9855ee70dbece0f06ad277f7829c5813fc30524c3e40308 +8757dff5499668c93fc5d9cea0a8db61817b8ed407200d623030b5849a913d12f8371b667cfde8d8082026eda7407e8c +b859ad747ca5af661fbd03a1a282df6e84c224ecea645bc2d4ba5e35fa06cbf047387319fca0cbc76b712398c0798968 +8e3173c27875f1460297af0fa736c945dc842ec3e476a973d3d5f790bf183ad3ffe96ac13868c5101d8e299890791864 +a9d725e2b92c878be42b5eecc2c3081c63c7231ccc7e2dee17ca6a4caaeae22788fab1f1465fcbd7fc236613fc2bae4c +86f6c4f04a354cb2470ef91914816fd740f8d5795ce7ff981f55a2634695fde5951bbae7a4bbc4c63747040f8644170a +851773cb26f320f0c3f252d95ea7e058ffcc795dd0dc35e459aa1b6b448238909230d809e82022e64b7fca5d40b8324c +8962641e0306220d9892fe2d452caa286301a3c465185757be7bce2d9b2c9beb3040280099606cc86773e43941fd3439 +8beb6e08c440b0de5fb85251d39d9e72db4e556a2dfe3dae59efd8b359d08492064cebd8d8993254b43bde8bd67d969a +a7e047894466ffe3dec4ab8d5462f2b1d8ac0df006b1d2dd26caf499ea857d93a811cf42233f9e948c9cb903beec004c +92eedd95557a91691a5e2835170390ce2401e223da43b78615a804c49566f9d31cbb7f10c8a8390c4bdcf691544fdba9 +a5e5b5d8fa65824e958bbae98d146b4b332f97ed50e0bc2c58851dc2c174ab71bcbb1ae015cd2955c26b368487dd862f +853a494eafb308175629d581ed04bed71bbc3af9ca4c0dc483d03d27c993a2bbd88cea47c2085a6928d166fe6938fb77 +83f06b88d29afbfbe8f61811690322ac4fdd6abb9a23612162e7a2dd6bcbb5f14cee298ebebc1a382484f7346dc51e60 +8c9cf05735ea5a0e563490bdc7ed29a4426643711c651e35c8551ca6f855c8458ae8f0933a022d0bb9a952edfed411f6 +b906b48d807748a26cc2a8848455a76ce502261afe31f61777b71917bdf7de2fece419db636439478c7582058f626c29 +97efe1fa7c9b25d8bea79d74b6cdcf88f63f1e865f54b58512a2e60428630b0b40b8b6af1b5f71df47520507548c3cad +8ef5ca6e753818906bb3fc71405928d8e4108854ef0ef01c1009071b353bc2852e771fcb619d5fea45590e8f61003d7f +8e4d901661e2913740d70ba4d0745df5e8c9c0a260149d9362beadc7e669630ba909ff0e8a6cc85c54d6b7435d0d351e +b7c6ba3bebbd9592967954e3a480ee8df1d9f5965f04e7d78a5415b645128deae7ddaf6ed507c8877bfca91ce078e529 +840bedb0ad4e25acf6cd25dee4f98fea495b2312dc5cb7a8388c5ab00b2acb9cd25da08e9fbead145a3107972b1ccd5d +a8d4578dbafdb27f3911af59962d89e75dea74db55346720357790da677312c203107d9c7911535aa563446fde7d4c47 +86d3b77f231bfa09251b7fd2ce09c27ac520ec35d783e912476f9a4863f83d269eb175790d6e735da9260293d707f8ee +b34909f1cc033232652da0c34051a769dc76adb1aee00674a59dc1b860f6e610974c3b4bb69a69ccc73e01f042431242 +90799854d0cf34e1d91ff8e101bc7c5007423d34d2f3bd9adea2ecac57e83f3a65a506bb93d4caea49b29f6d18149957 +8ef94cde29b037e19a1ce7bf4418ad3c95cd9457412796ea385750c19a6690f13a3bb5bb6a9ee81e7a40face1e0a8bca +97053d21ae8d75972fb37f6fe516c38c32ab162fb56b9f510f954858f4e3ef6ac8c3a9557ed3f41b7b6aef05fe97f931 +90a9f9f0f40991f3bddc58b92d40382147db22cce50d092d4a05aad251b46b94e71ec9f7107a180243288059fcc5ce29 +a14265b1344ac2921b0f890d13bcfc432e4f648ce403e261fce4d3bb32ffee9e2794c02830346054f998e82784c77040 +91928402ae121e56a3e64cd6f390127e6e92fbfb1967ec6efa4f52f3e8058f1f41a0f4fe96b5bcc11641c1139e790b2b +921c8c92b6d40da6c5a7b592acc74fc0f577d93767b9aa4a1cd302a72dbf503a1ea5b2c29fa0d0359bff3b8f252246d1 +93ae0ebe0e8e133fd80cf67a499047e30ec4c4660ccec9d49098717ef57721a030f423e00c5e74af4ff4acf014a10497 +82c865e21905aebfe0496af1c6ac7e342b5f446a9edb4f7da0f2fb0340abfd8e6fc545da874459d9aabe6bce0dd9bfcb +aee3961d8d2687c0f134b9c28b920bdc4021d925fbe14323c84224a9fe161248789249fb85436a5891d0bbff42c2a3e9 +91aee420b98b6949482b8ff4be996b97245b4e8f583a6e085226539074f42aa89818395efd1a6699735a569bfe19d623 +a48eec22c192e495b01722d0016a54acc45ff837e2a95c4294ce81d5a4e43e0053a6f0ead8a4fb3ddd35faf6607275b0 +a26e15937c11faa30ffa64817f035e294cab0e839f73d29de8a244ad039be4e221eb47ea08d9a4658b0152fc3caf6110 +b84450f948aa7c8682fccb9cae84d8e3558adf2d0ca5fb81eb200415291158720f8f3470542ab5b88c6873ad08e7fa9a +a8e8ec27d0608d020169a85d6ecdb40eb402f006a3b97afe32cc01987721b3a68a92ec693aeb4d357e189e05fadf699e +ac87cd535ef5699312cc26f86adb71baa0be42e858bd5a2d94ac05737dac63430691e29b9a30d2559ad581a172519b2c +a4481e67b524f8cddf2046625efd3d75efee6aab87ddd2c1b22835647e918157e5e924ac760db2195c86d326f3db1615 +891f29ded231486ee826840c8895cb325f7e84a5a6d2eac246cb3573612cde274720233b1978318a57ed337a046330a6 +906b6e750e6178289012769807d2598925d7e51c260c14497d8af978b1695990e3352e6e809a752f376597a68083870c +b7a056898ee1e46f7f29702fb39232f678ec173eccd170303b3b0a30c8d8cf1a5321384e3513e3b03bb742c238deaa54 +8f2f035fd96c3a336354c89ec9b8222803bf42e95fb2412c28d4e75eec99c1d4d402501ccae17357b757db8bdb0bfeab +81228625ffcedf977fba9cfa13f6edead3985e2651d5974789c394a69401cd7face9e20ae6694be4c0d4bab5e99c61a8 +885a83eae25e61439ad809567a2ab148583402e01cfdd77b0e37ab4038935425c64b4e0886949bf06438c35e80aa13f4 +8926387f48752f6933899c48e038cf14e7941ec6a58bcc0a436614b396296a17aa53e6873803dd3041dae470bd493fcb +95d0d3fa061f4d856eca78a569aa132db14cede7646f97e2aceb6da0c8ea53195d3b7a566fe5ec8c41b95ecdd89a1c6b +a3c817f4062ed6aa94064ea695d76c1825f3bf77b310fe1db28b8bedc9aaacbf1019dbd128adfd53042fb943d863a2b7 +af1208417aa584052da309169854149ede38a3ad63c76cad6e43afb6f1a7b854edf8310a0b00088c039259cedf0f859b +8b713fc3196bad35dbf364089049ada5477e540d78d76a5f0a9df98f7ba4a0e65dd0644509c149f9b07887298bf74b04 +89c09c43c5b733c4a417cd9ebc0795cc3348b72778d31828a9171427779a82ef023c1a4fcfcdc919ae25056f9c826fde +a0759c850ed320c8c874435e90ace6edfb8e7b3f2a09d942b8ad8339c508044ee2ee26c70f1b626ec49a77971433b6a8 +b85cbc58d4fd52286e714ac4eaaa0b2743a1de06fa03ddf8f6668ec6f1d204acccce93b10620272afb8c0b49bc4b0a43 +814e0a87384e159892a8d23036985fa3f489c53bce192e107bd2d64f57b1bf5ea0acc1ef46c7a42bbc5cd0924d92b4a0 +aa6821da96ad89d7881b878e141076522f104ea9a5bbdd1fce9f641898f7d6232c518a87a0f666871d7e3165c26081e4 +a9041d714bfc067b5427252186fa3557bad598fc0067dc8521aa9bc1ae298f6e96113db5ac9f6bade9a85d5a950c9755 +b8669340f3064692625e1bf682d34fbe69a61689e3aa6d6a3e822c781d406b0300dba9c3f7b8152a8c2513f1310d4291 +a78c53316ce768a1dc5968030bf4fc885f4029b1ddb6a5d84a61c85af686c73727f62823891edfcb6ccf4545de366cff +ad1d3aa29ea28292ddd438c865e2b5d93f32cdf009e6d5f5dc726de996583925727e6348bf1c28c22dec0bd86aaf867f +ae1447a2062e9e28af5f38aecc60fe150cd10c2edeaf2110034aa144f6235ed7fbce432a58805d4fe1f6b12652d6e1cd +a32146634332d3303934550705353c6d4fae5fa5985105bba35041e74cd71e2aad67b45da171221f6ed80f36bf6dffa3 +a232e8286184196ea77427b53d8b52c44d758ecc42d22556529db3136379b4989dec61cff610cc6cf6700a450a847a94 +8a72c7255125a736da52dff5f77e44c3de29f88fc05f5ff9227c69df296930caaa11446595e6bea3bd946baac5ef957c +9688a981a9457678067f629f8efa6b522e7318b529f88d37ef56c5bf8f1c34fb9bb3a918ab73caab82bf5abb0c03518b +88286f3eabd71115fc3b17a6bf6981340a81cf7e5f96b0a1a016d4ec8c18fb486d46c70919123d0c189a6f5d6ff29a1e +b535e701b40d793c02ac0d625ca91620d3f4a512aa9741f71389e58381008b2f93d597586d06213c4e103d67d0ddf6c5 +80d0c9dd941e8d8d3700cc51a434a5aaa3308cf8ebfd14128ccfd258f826b27cc3cf5c3ad7851340393abb1eeab3a157 +87049225fa2380d93f18d3d90cb0697a56b373b66d7f24ab209966aed8b55a2790194d5885399db29dd5b1f189eda64f +a52df158ce8670e0290551e8878d63dd33b4759d6f50e448e63fc7fe6ea99dddb6f180be5fc0fc3918ce54c05f80b356 +8b2a728b39c465fb0f60b0c486e5dc8d5845ccec03d3dd93b393cedeeb3fe1b44518359f1ed55fc770a8f74bfeb9923d +91fc05419dba718fa4a910dcf256ebea356bbea00522d8d5ec3e7ba4271a26035aac15e8d9f707969df1d655d92dac55 +97c8779ae80c24c1f82d5a714762d6ee81069224e39515e41d8a71c9310dc5d1c55cc92bc5c6a4bd391ae4c321d1d4d2 +b5e5aedba378c4484e3a7a4ed41b75b0844f674261c2501497de6f91f7274b5a4c1be0e055f2e0c0cab843d891169fbf +8a26212f27211b295beea500abc8e9d430a8500d3a350cc62f895d39e8b4668aa638c17633804ba353010000165637ae +864a95118e5d394e00e99efebd505df0125525c9ebe165764c453b80ad3edc730feebde3d93850745dfd88a27bb8f20b +a092e0b78290e826cc1ae56afffdd08f7c10954f549a3ea6666f3db1b6cdaeb7df53db28dd2a92446342930fe60a27ce +a1720224c0626a081b6c637b2a6d37da85d9a82241e5efef3bc15699b02a69f6304e43d8ff3144d60c16e00225d6b39e +a7b3d098cebea9cf32e19c5195608182b6afe9d4af6b9df532c047eb7a941a971279b2ae6a4b80f2f9d9313a6d788ce3 +a3d2451e6788944802c5077a778d7b7299dbb9d1612676bb6baae78f39976e0fd879493cc4a4d737b8174b472a456850 +930121b73da844571b1411d56760e80923a4ee09917b3e9cff4d3dcb0bc27026ff2c4e2c44e7aca7d3f8383f129c7f9b +b4b0119d163ee00a2b74bdf188a5cdcf054daaa48c483b94bbb4d09ff615afb4a91347db6363bc7535e2af9054ec2214 +a5846decee706780201095a8cdd48fbf3d3a2eac8d089a818e5e22c29457494bbfb4399323b067f3d2be2197c33dbd98 +96ba600df10ee7af5a9df29c0ca31dbed275d647faf9c66c7342de927ceb25b5bdd852dd7aae0228b27897f90fdd5d62 +b6ac51ddc98edd9fb9f54ef84bf372a041d58dfdf0dfdbdc4b08ddc1a7ba93ddbb1413dda3c1545a3fd7386c6b85975c +b35f3efd91a0723e0d486188ea9675a3462106470455118392d7610470b623caca2fa33829721c05fbeb0fabcf570bfc +87f49e85df5f8055714a8ce7adf37f6a278e64e76ed74c60abe3edfc3611ef5b0426d4c6da45e5f3b74d30be1dc6f539 +8ff8bb06902a71b1e9177a77367318b2e3e0a88f5d74d6907ca9943f4f9f1ceb5f297132c2a025259d17a67e880d1bad +85eb6de6c70fe5c53ab0ab27aa0fec439f136c979c557d317337cafa6e6c5cb3169679c9169567dec5f6c72b3c057d83 +ac18715ed1080771d760cb7066c6328faf65d9b30517903f8a5cad8d66d5c6381156b521107d7cd75ebb8c30e250706c +b95b9eae4703727e4ac9ddf2ae675906487bb78905a5f9cba74a4cbfd118d96b7afb6ef3ed5edf14fd963b830d71338c +a3b47b52fda16b62b11c8aa4daa56b0b669c4d5c56a3059b7d063284d8a91f6fff9ccccab23d6ceb9650483b2d353039 +96a95b3f327df94c85e92f2e406f1649ac621533c256b062738f3c3ee137059a735a3e6072247acf57b1b0d8c219bd7f +b19b33cc04570be94eae8e943d5bb17bb0c96e9de4ca84f9f41b37320a1a03d397d53747dc13275fef1b356de557214f +a1faa3dcb931dd91507f3f12a17c43f6627fa2bc5c71fbdd27548e091eaaaba262477949cd51290e81196bffb954a492 +b060a16079dca1d28a1fb33cbc26f368630ee042d980ce305230005d5b9ab533a7a695281ab76e9214458303932d8bbc +b303783196a858fe45d67e0520c30576da605fd69964449c20009fbd5099cf1de52a32d326d7c3b864de07440195ef40 +aa550a4c20d1003d137ffd8fbdc1196d09ad53cfa0e202302093a80fa3bbc4c9aff83f34f2151785cc1ce5f30255693b +a7f8585f45566a351058e10c6f1ff4a7ba24811f1482a47202f581525615ca770da93f2f58878788b45b92cb446ef4ec +8206f63a9a5b59bd68e64a843e68fcdf706f4c13bbfcdfa9928298e5b9251006ae0bbd80c715aa3c9957d2c0148b5059 +ac9490abe1241319658f1c2c645cfa01296f5d4106020c7894b7ba4a65cdd52f6c5401bd3b3cf1c9863e088cd8c9a16f +85dd6d9c80a1b58c24c4d2cb7590d33d2454f381f58e820979948e5831972360cde67bbd56e1860077ef5192fcacb904 +8b0285944c676fe2519cb68da0973275fa29c0718d838d363ce46651b068d29f867cf9fe579ff8da0bb8b37d202bb23c +95147275da658d43a758b203b9ca1f1c1478853e9bf77b5218593142e2bd9c0bf46d2206ab64cef99295de6e9a268edc +b8efa187fdd3e1f46c15cd596e9567690c10e253b5beaa5be8074b6ea4e6d3d06e0f2b05323453239e419ae1e7128521 +8340464f52c92e31806fd3e8e65f56e27194d1f6daa4a0f0b3831e8102aba16f88bb5a621633ddb7dd0342e1d2d12343 +8615d87dcab85a78dc052f05a01e751176b756b5dc9985014347454ce5752f459dd6464e1c5aff36cb6c51b783fa2692 +80c6e35c0d3defbe4d3968792724a23f0b8830dd2fac58663583a49339ea20f1812cc4140e3ee867c7e716177319bbbe +a7aa63dbfc201dde8f29bb6e23d7aa5020dd35bd18a0cc93c8a10c35d695913fe25b9e8cf9b5fd1899e9657b22bc8863 +97c2a4ba80c4caba2e729a603d2faa0120915e3fe64cbb065f7ff33de5f877f1ec9461cf455e88ec9e9ded9393939dba +a54bd1419f0e2d2d87757870f37c476c7e3a13502f1ada82fd7394fd29f8a00c4986473d753034d0954a2550badbac0b +8d3e2bf900d0d2b9b46e6e2f37620f0cc90526dbbcfaad4e4a37ed53f39fdd23bd3a6f21aa7e800eaec937d9710dd6e3 +a88d2b1c7802b2dc216c2b6532406c091bfb12f29121b9a82c1154470e250188413ddd3e79f7e009ea987a4c45b332e5 +8c552c2101dfdc3f99c2da436115452e4d364eefe029b12946f05673c5ce1cfb48d39a579625849236dc6c8e7277dd30 +8415c252d52a26a6400c3189c928a98559bf24162ecf3eef1d10e439269c31d854b0b4f6ec7a2430e3f11b5d77de78d6 +8b38905bad93a8d42339dbdb5e510003c51fcaf05e04f88fd7083753353bc1c4c00a5dd4a67431cd4456d0669c7040e2 +b1d0ed8862250d0f0d9ef9dcf0cd16d84313d1a795dc0c08e0b150dadf9ce73d32d735e04632b289cafa69a6ee75dc89 +9434e18a5fb631b10edb02057f2d1fe16000ee55ada3c26a079c9fc3943e29d6de99e52829fe7b333e962270c712e51e +b1b9f3914007e6fca8ad3e7e848a1108988cb2318da36df24767d804e95d1272943fda948451135cc1b5052a3953b081 +8c02947a76d7b6c0a700a83dfb971dc105bfe996e18c521445f036310914b349ab28e57571e36ae08d13a46fb01c2f43 +893472fbc225f973a0ac6a0a0130b9cfb7ab6869dff80df71a62b1f6beb4afd069bbf35b4f327165bc31dff39e4fcaa4 +a7c176c0903175f3540d62f9afee994d5d9bf37081e094644b22f017e94c515afefde7bb07f638342abef7de657f8848 +860186c2b1d3b1e657729bc804275fb5f5ee89eaa60848fcabd3871289665ea9f0efc8a95792d884972bcfa2de96223b +865b38aea6386d0ac8f501a7d934e23d01dc50105324e354d4c4fa3cb1d4c29c26f4566df7b1a728e10cfaa9d24552e6 +b4eea5548de6969dada658df604b5d9c49002e2258352838003e0fdf7b299d81fb025807a7f37cf5b547cebd7f2c1f93 +8982de11ba68d63a649a3b296d4d56c71e3c3eec016db250d733ab7c3b9a620c09c5a5d0b64fd30d3bc03037ca4b17c9 +84d8b8a10d67eda4716673167c360fc9b95717cf36ef1d5bc6f2ef5b9d2624f0e76c2a704d016adf03e775ea8e28d83a +834d03ebd51aff4d777714783e750b84c16cb6627f8311bd8ff17c3b97fc4a5bba57d6c8f6d74f195d3030bcb5f07612 +aaf49e0def0c4d5f2c1e9c17b51e931d2f754b19e80070954980b6c160178349f6d3c8d4808801d362e77f41a0008918 +8ef4115edec841854e89f2bbd11498dac7396bca35dda554290d3db1c459ffc17be671f4a46d29fa78cbd6064cc2da20 +9641dc8a64f4acd38e343a3062787c48c312f1382f7e310ccea3e95e066ab6dc980f6ed90a633236a435e68bf6b3c625 +8a84cfc2cbeb18a11dd6c2a0aebb3f6fd58a33bb4b26101e826add03748595022e816afac79a4e7c20b3805252839dca +9770782d729017659844421e1639ffcda66a2044df9e19769b90292df87dcb146b20c6b9141bb2302029d84a5310665d +98c7ec9696454868ac52799d1c098c15ec4e08b34884dda186ebfe87d32840b81fd3282295df141c91137faf4cc02da8 +a3f6eb921247617292162dfc8eec5b830ddc294a0fb92f5b4828a541091ffdaff34c392c1d7168259d6204405d90ec72 +b185f77a468f07a54222d968a95635234e74fc942485604909308a9028ed2753b15902b9134749f381f7cd6b89cc8c3d +867608a682d53bd691dbc92eeb460d1c300b362ca49c11a280f6768ccec217f1145f9d59fe50d994f715ce89d38a74e1 +afaad630ad8827cd71aade80edf3d7aeb65a344878db12fa848759e6233f6fceca563aa437e506ea9e0f1e47b126d45b +a12afbc84e3441594aecf85d089423dd3bb8bb33a1a384ddf7cc14caa72284caaa56aa179c15e3140fd56bb532491a67 +98757b0b5e5837ddc156a4a01ce78f33bb1fce51e0c1254ee9b6d3942268d0feb50b93edbf6aa88f9ea7b3c0309830d8 +89573f4a4ae752e9f964e42bec77d28a41840c28e4bcdf86a98a131d0b85367b885077823a6f916972de6ac110821bd2 +a17f2745052de5de9c059307308fc49f56cb5230e7a41cb7e14a61c9efa742ee14c41023ce90c7f2261adc71e31045f8 +914b07c53a41c0d480083f41a61c10429ea42dafea9a0db93862d2269ff69c41db8b110b4768687b88089b5e095523cf +b380cc3e0d26370976fe891d24ea4eeb1b6be8cfce01f47fd68838a27190e644fd57b049d3aa0a9589370de20e276944 +906385fdfad60feec79eb1c303e750c659ceb22d9c16a95faaae093daadd53e7aa039a45d57e20951d6e1ca0dc899ef2 +b5211ceee31b194dba60b616bfd91536e71b9213a3aaaf5aaf9b2f4cbdeb05191861d78b97eec58e3c81abe4f0488c04 +97878e9e38c2f69d697800e7a2f132fc4babaacf471c79c26a757f771606e55fe696ece68a3163a0ffeb2f72274cf214 +959431c1f54c46500c05aaa9a2bc4230531dad97ae768fa92bb85436c0ecc6374cf20fb0ef82d122db116820a943b401 +b69e5a1c6798f30d33e42cb8d124f025d2c77c993c4c7107a539aacddf44d8d4d2239e802ece32e60ee4dbfdce201bdb +a8b09e5e9f802ad273b2efa02bcbc3d4a65ac68510510b9400a08d75b47b31c6f61ffdb3704abf535a3d6d9362fc6244 +a41ace7f1efa930564544af9aa7d42a9f50f8ba834badcaf64b0801aaed0f1616b295284e74ca00c29a1e10c3de68996 +a8f2aa0bbbc19420a7c7cec3e8d4229129b4eb08fff814d959300cd7a017ddb6548c9a6efebad567d5a6fde679a6ac6a +9683da74490a2161252d671d0bc16eb07110f7af171a1080dc4d9e4684854336a44c022efe3074eb29958ae8a1a14ace +8ef44d78d10795050c161b36afa9ab2f2f004ccf50fdeef42fe9cdc72ebb15a09389ca72a00001cd6d9b1d7b3bb766c3 +adca54f3b14fb18298098970b0267301b7312afb75894deea1b2afa3e85b7a3b4efac9971ab54c5cbecba2da9f18507e +ac5d4528f06fdccfc1370d5c3d03ed982fed0861a93a3f6453aa64e99360b124926d1892faaf72d89459e663721dfa99 +98aa1c801bd615b8cba728fa993021e181e0ad717ba01c0290e7355694155407083eb53cb70819c4775da39d33224db7 +8b3aea4c7c2bfe1020de3261ec085d79c7bf8a7903b825d2c70ebbb84af197bcc54e3653c5373a2045c3021526b63b66 +a29f3de4cb3d99afff1daf7d431b38a33a9804fedc41626618928ed059df6f6fe9f298a046b594ffee951ed4d4e1400f +803fd346be540c5242667c18ee41b26bc812456ab13ff117196ed69b90ee608c8cb6554396b64066a546ec87a71ed6a9 +a9c18d81ffd029c0339c72c499bb51685392253b996b6eabd8b76f05c6191ed8444a1397d63b9923743661a319517f7e +a048d5c390d08f07161faac71c5994baf152c883b205f3bb10d3501709d6516ae54d491b486303a11b751857a31f0052 +9156fb4803e40e28d8d57d928481a8de4373687288da44fe88c5676a8ae013ed1fcc09d56a31140bf74e7f767253810e +98e289c725b18e0085afdfaf2acbc674dae7b0a2ecc2537a7d0b87e20eb785404ab05973a787f0495d2adb3e5565c09b +8a7237b249325bd67cdc1f9fb278710069033c304afbf270b7ea24dbc10c8eabe559a484d3edc733c77b4384932deb41 +9056f2e5b02e5c2e04a69fa1323bbf1859d143761268d18e74632e43800a2a9c76fd681e924a19bc141de0e128d3e462 +b9f2bf9e4e7263014296a82b9ecbb05d3f1efa4b2e675e3b38d3eace59da06a89c859256e1b77847886d6aa15f98f649 +83b22949cca19030289bbf7cd2a0d8b84e1d468e78bc85271a6753241b89122627632723bc293cf904a5eb2b5dc6c3ae +a919aaf35dd0116168d2ee845122026416bec9633df113fbd913d8db5996221e234f98470d029a8ff182825b59fda20a +91726901f49d32b41afa15219073842278f60dcee223640903d871e318a1c2b541136b7b38a7b2ab7d31e4242fc29674 +942b77666545bc9a858d36cfe857ab1a787c9528f4a0b87918a06bf510793264dcafd12ae6bd3ee300179dab7f40aed0 +80adc1f2f9c47a96d416e44fcba41628abc0fae1f88f6a26aea4648419ab726f7fcc2187c7d5145e3d8f5a75c03937f4 +8041e0f66ba9dcee01e336dd4d16ae5e4e1618512fc147cc8230003aa2940848162dc2187d4130bf550dc1f3559849d4 +999e8adc51bab54386af1c5e8822986ad1b7ecaf1f8a4c2baa5bb2fe9d10710e49545c5a8bd89ed0e61a3d73a908e5ef +89272ffd39b6e9f99fafdd58bd9dc00f66f26a1d36b38a1ac6215e3546d966739eecda7fc236335479207cef95cce484 +b8e0b7532af13f15dc04a0eb4ea8abd67e58f1b1c6ad2e70c0ffa04a5c18ec2018b5d7f4be2f9f86db5e0b3986f639d9 +b96bd11b0f6ead4abd5fe1e4c6e995da7583b901afd01cc05e87d04663fb997997d6d39dd9fb067c62cb1b1cbb67516f +94ab08914088b973e8dbd5685decb95f3bf9e7e4700d50a05dbf5aaac9aea4be2c10c83096c02252e9238ceea1351d05 +a188de419b062af21275d976494c131ba18d2b2ead8bdbfa38a777832448e64d4d9725c6a1d530ffb6513f18d5b68d9d +8f73c8c118fa25c76a4ec5611351953c491452743056a819c8c82ba4737a37d88da0b55f837e7239a5f46d2c05a1bbba +894a44769e0be1c26648b0d89c4c9f46dbdeb3a71b90c493093bee372bb9f2d3f319850fd886d51f4f58db0de5641742 +87d239923b0db024a8d9b0281111d47b0761d81c50652268b074efa3ea70d793e30f874a91ce33a4acecd0cf38c01951 +b1b48b75a97f9fc2dc9530dc69f6268829dd0ddd574516e7eb1b9f5c3a90058889a7bcf3d378738e6d4b02f5fbfa44db +83e3ee9526ffcb60c6e75b75550fc017912ec0daf96d0a0d5f58c1b229cce90c684ac7c3e17fb998def8e7e2e155d750 +b9b7bba579e474b0abdc7775ff5f84c9f117c6ca17788cf5a5f01b2c35a14aa39036031c8d799fec2cfb371d9f7471fd +90d7faf4891fbc368a32f575dfb69f13e37161ab4f63a7139be103285a49490c2851a907f8d36e09e7d1a190dddbc6cd +968c8b9affe18fc34a4e21f0d8c5518341c566099e6b45b8721c9912bab3693c9cc343406fe90279692a1eef2a3f7311 +8735baaf4704207550f77df73fb701d9a63329993a8cb355ccc0d80daf950145f37e9b4b22be2aba29898e974f9fd552 +90f52b2dccf525b9191d836b205ffe966d9a94f6c5800f8f51f51f6c822619e5abdf1257ee523597858032d2e21014ec +831209f8f5257bb3eb452d3ee643d5f063299f8e4bfea91b47fc27453ac49fd0ba3cf9d493c24f2ca10d3c06d7c51cd6 +a5a4db4571f69b0f60fb3e63af37c3c2f99b2add4fc0e5baf1a22de24f456e6146c8dc66a2ecaafeb71dce970083cd68 +b63da69108fad437e48bd5c4fc6f7a06c4274afc904b77e3993db4575d3275fce6cffa1246de1346c10a617074b57c07 +a449448d4156b6b701b1fa6e0fe334d7d5dd758432a0f91d785b4d45fb8a78e29d42631bc22aaa4ea26f8669e531fed7 +aabe43de1350b6831ef03b0eef52c49ffb0ccd6189cce6f87f97c57a510ac0440806700ce2902e2e0b7a57b851405845 +91015f144fe12d5d0b0808c61fa03efe0249058e1829bb18770242f5fb3811e4c8b57ff9cb43deccfc70552e4993892f +8e9c570811ce44133ce3e0a208053acb2493ef18aade57c319276ad532578a60d939ed0bde92f98b0e6a8d8aabd60111 +8b21839b5dc1c9a38515c1076b45cedec245d1c185c0faac1d3d317f71f1bfebba57c2559bcdb413d9d7f0a2b07f3563 +90413bbd162be1b711e9355d83769e6aac52fdfa74802d628ff009325aa174c68f5329ddd552ef93e8fdcb9b03b34af3 +8b6b02e3f9dd1031ebd3df9a30432a3c86e64306062ef00a6d1243620d0cb66dc76f8d0d412eceff877ff8768c2696ce +9894b41d9fc715f8f6addace65451f41dc5ce7b983dd8cb33757b4d7259bef12f144e0077d0b662aa847d5a45f33c563 +a353a9740f6188d73aa4175a6c5f97898a05ed7aae9d2a365f15b91dfa7c28b921fdef0a32d90b6fb82718b33d3ddb8d +984eab8faed87c403c9979f2d2340fb090cc26d00cb4092aeb187c3f4ee1df3f57cb8363f7764073188790b16dfc464b +a5c5ae0ba435fb7f3ddd5ad962358da326239ff236fc3b51bd22e88296236b109951cee1b98f444302badc58d1b5bfbe +880be1006b0156f2788813432f450f613d235f41aba52a6000d2ad310408ad73d86b79f6081aef1e8c51010d404ba670 +937da751aae68f865c7a33fa38d718f20e2a1c65cb18c8e08f8441f0cdc77662789d2793794dd0a427cad30cd0b33f42 +9496fde66c834ff86f205897db12bbf9a9bb78d9ba8b5fb539cd0a2c927cc6b4120c017b0a652750b45edbe5f650e5dd +97a6f409ffeb593e149307a14bc47befb632412d70565c5f13d6b7d032acd2e3ed0f7b6af701b387f11d69ee4a8094d7 +97ed94934263dc0260f4f7513745ed3483cdddb9adb85dc33193c3a8b4d52affaf1ded23b59c34651afbffe80d40dc36 +b2b26378d44f916bcf999db218b9892e06de8075f205c7dafd6d37a252185c2d1b58e2e809c717963d25627e31f068e4 +b8f9fa1fb45fb19a45223f7be06c37d3a3501dd227c3e15999d1c34b605f888123026590697d0ae24d6c421df8112520 +997aa71e3b2e8c780f6855e94453c682bee1356b5ce804619ef14834475511105b1e4d01470fe4e2215dc72182d9909c +ac2cb2a7cf55aaf990cfada0218453853047e813d3f51f5a623d09f4714da79de6592671358a5edf938a67f905b6cb5b +8d8340d0c3081cd30d34f3ff6191e1ff6ad7994b4ebac19e5936f1157ca84e1813228b7605ee226366d6bab1e2bf62a2 +9693b17669086003cb46c75fed26ea83914a54901a145e18c799a777db1df9c9ca6b2ea3ee91e7b0ab848dc89cf77f19 +a6b6b2a6cd8c4922d78c8ba379373b375d66ac6ea04b830a23d5a496cf714a9439d81c865da92d52600aa4e2e43afcf1 +89cb665020abc3f5e11a03c7ba5ec9d890fa9ed2630f1443a8e45a28c32786ed980b5343ffffaea60eeff5b313bc0d66 +b37b989106594221bc6cf33a1a83c3e65ecdef279e90333a9e105b8139dc28384bb2277edd4b77c9e59d15e6afe074c5 +98ce5aee5918d18b2326b30c1ba41669cce20bc7a1d1b585363305fbdea66055164a7ac398ca0f0e670291a3061022eb +b57f472d5f34beb4cf430d7c0f8ac5bd1c0621a284633ed36e6f7804bc2b7847f54b469c7ea163a436510d9e3b32f97e +ae673a6579dbf0504c8fd0c8fc0252d2f7ae8da615a06f4d215c2f8a8f516201f24e5cc42967630c252905e5dbbd6377 +97c1501835a31091a5a83f0546e01c85ee847a0ca52fb3cc0653f6a826e13d25ddc623a5dea139108f7270a1fd7043ea +9376ee667f3834f6c0da4324fdcca5c04712e0649877ee19da79a2d23be24640c38758fce562470ce2134ca34148ffe3 +818af89c40379a10074cfaba6d5968ecf667f1a68a7edaa18e8977ccb34e0829f237c5634fbd079e7f22928b277f1096 +b8e0af0be0a252b28df25d4a509f31878bcddf702af0e5553393c3dfd4a1f1247ad8dc2668bc8dedc9b41f6ad8e71b15 +811667ffb60bc4316e44bd04573503f5b4dc44d1ec824393a699c950e5fa085b146537ddd6a08a3fede7700396a0df7d +ad834cbf850b2f61ce799c4a0f8ab0c57039d4e1113933c50b0c00175171aadee84894d1376cf325bfd434c3deb44315 +a8b7dfcdb40373ba4d55e751ccfb9070554434df9e359fc165284ee3dc35db6fb6055657ecf5a9e9b7b8e2e1abea4375 +b56a5b9fd41c9d3f65532aa58bf71a38fcf07782e1ae0084dc537862fa02e6d66658b19d6f71c39cd5dbfac418da1837 +a935af5ed224b9533b41a7e79f872f6851591da9e9d906050ccd1b2c772a1d6d010c5fc7160c4f8cd7d3aa14c3bcdc26 +a81e580fc98692567b28323fc746f70c3139d989fb6aabf3529504d42d0620f05327e3385c2bd5faea010d60dd5c8bdf +a8b352054cdcde8ddb24989329a249b71498a5593a13edad1e913c795dcad3d24789abca9c7ed1d57efcc9e3156da479 +b0de8a2bd7f93284b2bc700e442f52ada16a22ad8d86329591547411c23fff0333b2ab0c9edf82bf7903ebf69916eed1 +843e9781b653d1a427f3534b2e86add49d308ca247546f9fcf565f9e08df921e4d969e1b8ed83f3f849e98c0f63e39be +84a4098c5dca9f73e827d44025473096101affd7193c40a0307e3215e850e753e9a08e6e74a442d57626ff26df77faac +b463eaaa2f3315b511c22a97fad353014d840a6a95fe0d457d0677e63e571407d7f5268f8775381a5e7adc3b4163eb88 +ad0417edaa16cfddc288eef4173aa7057ca4f81e815541ac588ef5f24b98d56fed6845deb6ae1a9740a28bb1cd8780a7 +9271963b8fb2288a96e07eac13c0543ec41abdc6d978bd7c44ae08251ea49994412b542c77c8208cd71fd8e7852d4a70 +8b68b6db9044d8bafc155d69e0daba95cd59d6afebb085791e999afed4f33a2479c633d31d534ff767b8cd433d591a23 +a6a06a0e433e385437d9996ce823abda9848754aa9cdd25ec8701af35c9ec15df999825669bbc2e17cedb597a96e8eeb +94d414bff8b6b8597634b77a77d1060db8e1af0d0ddfb737a9bf1c66c8430e93a425510af2464bce4a7b29bc66cf325b +b6514049562af1c6fb7d0e8df6987b020f0b7a6e721f4862e36b1ba0e19af19414ede04b346be22d348b50875803d1bf +a42c7fb34f2fbee8aaccd1d86672d0acdf4e6bb083ff0456512d7e1e43be041cc0924322fcd986e6e1bce5d5ecce6f92 +867cbdd169a52440ae0a75d33a28c7d00aa92b4b65aaac5e62aa53a8fc367c08ab8828cc8fa18b6e7d1f908d158e3382 +a6fe0b768fff3e4a6153e59a7b7508eb2ee8165eaf5274d41ac2812bd4563c4ca2b132f0e27ea2f1c98759cc3589b61c +b3eb1dba43d10b9e17ffec8def053fc96f9883bacb49330a089a0ca5b9ab0182e8b5111ad4aa55c1ce1b6f4afa5c70a3 +a1531351098bdfcda566ff4d811301c0305626c77f954a38420c490e7c684f517eb1a4e4bd2c3904a10bac889cba314a +92278d106ad2f27eacdb86bdb1faa0a07a93765bb79dcff191873c52253af83480114b2299ffe5324f9c31d0abbdbbd1 +8900ba95a90c447fb6fa1f528af3d7a378aec25feb0620516b6b97e54b328fc31af42e46a8ad5e6e3029d83a6f2bbe5f +86053d481179c1ac910d5e7b9a5de82794b442f20e854583512ce1f9c3f09e71d1bf97d6700fe776debfe1527ab97a82 +a32a60de492fc4340336416bccbd2591b5e414fca0aead82281212e24490acc01747537b3da783684e27aeb987245cc8 +9820fe8e0338f21797143f368177e3669a1f3894b40ae9fa3b353125f7c8e85cc424dcf89878f2c7667f65db3b1e4165 +934d64711b4348ac5e1395cc6a3215e5643b540f591380d254165486b0ec2a1d0d21c7d2c6310f9e0eed3d08ecf4b57c +b9fd32d589432eddcb66dc30ad78981360915854cc44b2afeb826b5d48a08e377dc91be66f5bf1e783d1a8bb320f7ccb +98c972cf01efff4fc2e485b47572e2d8dde22461d127ef401b71a111b0603203971e3cde40912643affd7341cd27e57a +8db6c1620760063edabd376f4399b6e1355462e04f5c81cdcb3989fdc00f9a466bc85ed899e886c89c149adad69edbad +ad7b7fda0aa6e2aa66a27235ac5cc680aa04b85dce329fc4be84f75c9c961120a3d9e446aa44539aaac8ea203eecb4eb +8ccb01eaf41d816ce69ebd57754859e263530915e775c4e7d9dac37b2457a9099b9ae9b4c6cb09eb5ff246e3c9320c59 +b895b83b5f7ca46e02697dbaa6157df6c7571864c83e504a8c77d965bc2ba97bf9353a71c56a020df64498bd40e30b21 +8018c07a81c522fbc25f2cb14f2321c61b98bd8962ed8eb7d5823dbe5d1958a5ec2fb5622fd0868e991bcb6cae016ea1 +95b16364e94d01b3664812264d7185032722a4afc23bdd33bc16ae87ee61816c741657c37138d9312cebfb5fcfbb3b2d +94a709209990a8b09bfb4b9581ab471aae3a29526eae861108b28edb84aab6d28f1d7a25dddd8150b70af34bee4ca2e4 +ae06c80839c5a13269b984ff4d8a5938c6f4d8d647b1b1daa8cf7f6145340b76a286cd615ec251a65501e6290162da50 +875cbd0694eeb90d3567da9dc7f570d97b02bd9cf17bfa011efdd48f1d580608a3213bff4006603b8b4079fa66bded10 +b27f88c455f025e1cd902097d6a224d76bdf9c9195adee30bef4a0b0411fff980787285896e1943a62271d0aca531446 +8024880cde783cdb2b863e3dd856be92bacc5b2a1347e96e039fe34279ce528560d2df7d4d1624a4595dbafb40529697 +8883d02c2a5c0e026d941c785128d4ac6f7a9de625ea735b7d6ff27a5ba10fa4d6370d450d99a855d919f40d64f86afc +a1beb985c45fdc30ac536f1c385b40b6113ef6fabc2f76d255490fe529468847a776efa674ba8fed72180f07d3f701f1 +ab83bd9b007561695210e3276fde72e507456ba277ad4c348a2aec7a6e9ebdc2277cb4bd0bca73bd79bd2240a1fc4456 +8db27f516153812149854fd6bb1250e843a3ae1c9637df818b08bd016a769d0497ab6087fe3b2fd4080882713607bf46 +b3891dde4e00d60386aeff161b4a0fbc30bb31ee7918ce5fc0b49aac3238a000ced192c9c4c08d90de3a0ba973d7cfd6 +90a2049a15c02e59024a7a1cb0adea97501c60b1c7442fbbe560054c3d69264e69627ac57b7d9be01bef498bb2a60198 +87df67a4bd72444b5faa4f3b067204c4927c869dd3b29ad192d859589a9b2c1d6d35ed68310081e140add254a9463092 +8f80986a8dc8a0d6408ebbcb4f234e76413c11cb0d66067f9436bb232373100f20a4fded60f08dec3525315abfaa8523 +b061e10beb12ba3683688a4ae3a91600d14878ef78a308d01b93e4918efc666450e3f7b0e56283468e218934231df98c +86b9e55f3783d62e381659d3e06699d788b88aab1ff99848db328a83c97d223f602201bf2127c5ecf419752fed0a224d +858d878e29925c87243e010020007f96fa33264e89c8693af12857b362aee3fac2244057e159651c476ebe1dfbd67bcb +8fd47cdef87d7a569ffce806d2c2dad100692d6c53e5f5dfc6e274f897dccadcee30fc6c6e61373961bbc1f3ecbfa698 +892f2822daf3df3a759bef03168c1cb07408df62e024747a788e94d2da325f880bb9c6e136c7f6643f45b021c6ccb654 +8714e37ac24f5a198f219e7c88a92172fc3db129e044e914663ac708d8101851e7c53fce79d32d0e6da74f2ccd1d30ff +ae95e1dbba8b9e2c8dfbe1c202e9ccfd04fa396470035a699b902fbd86d5e6a31732a7c8cae00b9a4f6e51c8d560c7c3 +b0cd058e77498e860fa20c5f8d9bd09bb249add1badf84ba8d1bd49e704b9b4bcd67a5c3d211840a2c8fefab3fea639b +b78e468d3a7da0dd481f333ae56534e2ef97587be2e259a458e25aa37952aed1cc5f835640f812d8052f5bada8f57b12 +835de7965c6b26e7ad1b92eb6f0261d1f376fa12d61eb618d9b342b597c9c117a5a8f6a36269aeea88072b4641e6b5bf +b4d0eb99136b3643468c9c48a20fad62785a60fbdd3c054efac4bd1fa7979b4c9ca6c2c0b18069c0912bea2f19832790 +a00c47315dc0700a850966836a95f3cebfde04dd094bde0742dee77b89a05b5ad655921f86fafd1e902938ff34d4c58d +ab13fa0afaa92229a71ee91efae6d1b15f14b6eacefffb7401d41d0d6db24e24a8dbe8ee19b4680ecb69d2a0cb4e84e7 +aa56c0fb18401210062dbc653df8e3732aa8921a1280e9737e99b26a0100a13a9cba8ad0317a69bba16193362ee0f030 +8b410324a6406b345df0fa25f541ac20b7313fa55832752f70cf4c79f43b0bd3d5b4cdc447e6ba7bca08d0edffa8e29c +893362241ae412d9e5df46506407595c58ffbd7fb1fdaf0694c3432470599291238997abe118bf7737e56a4f5c9dc292 +921618194a756be81cb49d6357cb392b32cc62d96c8ffb7e16d9659a0f226a0436bd378da7b835054dbe0de2c6372ef2 +94a2904f10994928ff5367b777e1430047736fbece33442cf452018bfdeae62e84cd75cf80f8468285e347d504c94111 +b4b81545b767f380bfe10e0fea9c3cc62ca8db40b43c83ffb245259378731298e3eb6c3bdc3a16932f88f5d8a86edc4d +936203c2453ff01c6fc635e4d54320d69e60047d805daae3b75633c2259108497b778f011e5a057249f11b2b888ea76c +b90bf6378d29339443c3f2008b1e2b5f0345f86e393027f14a295e583bf6e6c2b10f54b6dcc42079ff0d356c405b03bb +916913f550d327de2d8d6c7723dcef2e3869efaf95fd963d95c8980b97748c61ad8e2e629cead8577266d93fe39203bd +a033c6f3d5ecbabeb83eb363e54e5faa7ed2d7f4fb771b161762c4f003eac4e1afb236806b784baf2222cad54e2d3cd9 +ab289d4a5771147e6c29ff9ac2bf65d70081ea6c6af2d9b728c3c144574a31b5fd8632af57c18c389aa2cd994938bb0b +9488da2019ff13e290eeac132b491df58b5b7b23c2898ff1a67bffd7e9c9464c39bc8177a57950fd28589e3d9ff9c6c4 +a5abe42b2e0891851440fb2aa6c1d8a86b571bce8b80c8e9e2692e5cb6d45a1b2f055c9fc4c74a7cd292871604129ea9 +90bfef698e83c2ba4dc9304aa01edd274169a978b7154bca518daef394f55857d0d1922ebef3d91fc5ecb3b895d9e0ec +92328f1372b6406ec80786041b6d57018b8507e3881a08727aadfecfdfcfb0824394cbb1150117ac5da5d71b89e895ae +9719751c5f7a65ae2bed8aff7b4b8c34539ff011b259b7ff54f63f9d987b3fbdce5c99534ed561aadaf07bb6e939e208 +a151816774aa9379fccec21cf212429a1c68cf91b055cbb9d931f461a8d5616c693331a11ac5c6fcfbd17d84ee0b44e4 +a72977b1285618a45943ad00f33f37102e2885eccd2f76785254eeca495068fb1d8d49865343e9e8313c6c2c3b2024da +a6f5ad2e023a1585d90625c9f7094f0e8851c79f0eede8ec582ee8e063407cc5b8298e5fdc4c786e4fbbcecaf33e787e +82901e008febcea0c0a14ae21d985a397630e18ee6e346f4a449f23be228e8f338df567d30211a11180b94fbc5204bec +b9b57fdb8d14d1be87a25f89553b3966eb7869e0519ffdf4cc4d51f4cec90d68f7b81cdc0450e04207276e9c63ace721 +a06eabcf43585a001448f3dc30411f3d5b74fd0a695c81eda9981842ba2bb0081d3f5a8360aa18b6d43ef13ea78b293d +926fe48a7e8f07559b7237beff9504476dd97b5b4d67acd01a3633358a6ba4c7abed5c87683a11209aa2ee759888e00e +a716cd3a84a963e2a5a46145b6ef4ebce705de52bf2945c374152a1e41c228a9c4eae0b6d1e222c1eea8b9c13c002177 +8a9b5985df6fb32cdb06ba1591a977545444478f2fe985ed1b10de61c630f0a4693c2185d63f0dc0256b208072c43b17 +a8eab26ae0ebcdf96a59fad1dc2d5e83b94abb2ea1774b607023f9d9e0fe065853b1e2242e794f989a80a47f550c0bd9 +84adbf38164cd04f3d770a7f4b8eae7a5d25b4a803fb63c02b95b71b33e454319c44e07a760d22bf5f58e7e372d09a16 +90f443a3ba1b9129a0bee400b5b29d42e50bb2aa56b0022bbfc3c6f8d69db40299871ec7c1b68421cc89e1af6b13a39a +81c5a94b379eb98c494a8d0067c748ba47e87a2ada0105202ed7651eb4e5111a0cd8569b06ae68d392c4fd74a37833d2 +8f92324b14a1549ee0b186073a26691088e41556d33b54258fc6e0b000e9624156db4e97861a0ec22960e6c47ca8a1dd +8b021cd0fffe055068cc460aec3cc455952e2ac32be5fa060e0d1b6cf30ed15381618f801249e893b1b9f10dd82077b0 +b3e9f0dcb3d6f0b138f589fa54dfb01f849890ab97016372d004aac55103f363a64bc0e606ddf75430f1534a30fc522d +8fdfe64af891db89b25daa859864d479cb7599486bd6f36e593f8f2f839f942261ffc3eed5001a93fde44cbcdc24c583 +a9e4554373c5073e135874e2bacbee69c65308eb0785532fec6a37834e8d0b437b77a2f11cc63c87d7183b82cd9b6bc9 +b4c47daca723ad7193ac5098cad4dcab654186ec5ea5c0fd014a3ac39726be954565a901694ba211820c011fa1c59e18 +8835427e86cdceb4c11cbea331ed724e4e78af15e3bab5be54f6b926bf66b5d99bcc40dbc456d86342c9fa83a033c2d5 +8ea84590a400cedba047c2661378921a42f5ca0421da58c1bcb37bc686a2aed98afab3fa5e6ba3a51029390ef3cdf4d4 +b48551170fc479d69fffb00fae4fba301e92e37cae08f596db6f6489c3b7020edc074f9e8d7465b84e9dcef1b6b3aecc +a6f318b1eaab00836a330710e88bfe400395b3081485f6a212e3cba9463f6fe7864ba4f71e57a411ecdf2bcb4d189f96 +848d5137a39999141a79f4bdf91150796ba36352d8525821bf3bd6e070b352792d79147341b8254dd60fa8c36e9e2618 +a8526f8904b1eac4ae2a25534aa91e8031e9aac7b8f58d8f49897e920c36c0232f4a30aa6eed305deb0f7793c115b267 +b8b6a727c44c37a8388383e959d195d1d0e51a657d4ba360633d219d43c5df645383e2406c25f1d418e72b862c3a6e9b +92e64adf65b42c978f36dd03ab22ba983bfbb61944efccdb45b337ceb486beda99818bf20d32a545503c4572bb0a4983 +9653bb83df66260a0bd059cd4244ef7c661b089e403d26ba777d2090783ff31f963f5d3a9c125b1ad1a1d19134f3fc8d +a74e72355e71ae5eb36dc75191643500ca3e67f18833ee981010e7e7e60a68e1b01b05901eff05014b9ef29aa4829f45 +8b2139a5da14524cf6acc593144db23db424b95b8c7041d8f6c7a14a6725dda1cd09c42bb3ae26a5a3650affaa742800 +a60ddff4300ca44a7c7a00a1f98441ad1438e07c30275bc46551cee1b681926d2c825cc8f90399ee5f36bb9fbd07d3dd +a04e5e9958867a5acc15fdea0d88951cfebd37c657102f6ba1dcdaa5e46cf1c823ad0d98718e88e436f260b770599102 +95e977abeb70d46fe8d7584204770f14c856a77680607304ce58077550152733758e7a8b98b11b378540542b1175fecd +8c9ec93ed35a25ce00d61609e92d567459a45e39922ccd1c64ab512e292787125bd4164c00af4cf89fd3cf9deddcd8bb +819819ad0338250d9c89aceda9e217df12ac54e940c77fb8420575caa3fa78930689d0377ba88f16d38179a807135dc6 +8baafb379d4150ac382b14a64788d819146480d7a1dccd3deef6889686ded375900f5df069843ef14d754ad3d7540401 +ab827236996bb79b447714c6993af941c5ae66248df4d9a6f3650d44b853badb5c0cb67804210e07a7b9d66ca43092f6 +927656c3eac8d2eb575e3daeb77f9605771170c325bee6aeade10c083d42bd8dcbf3bcc3d929ea437001c7cf9a95e2da +af22b212d5ee44fd4197966b9690487c38a119cd6536cfb8c181f38a94610dd9e057f95774047a446504dd96dd11e326 +a44bd94b9e01e3ba36340f2ac2201ecb477495d4f1fb6726a6b439302deabb5a35d237c6a6aeb7e3b0a65649f8656716 +af367aeeae3bba14fbdb05bcc1a521000dd9d37f5c34ae56fb306d3dfda201d0329a8b6e89d98e15825cb3c6bfdb1194 +abcc4fbdea43e50ded9e2fb01464f4e87fb136e960141e8d39214f92794cfab5634f22cd40b18d8c0e501f2307aad23e +920786cbd674348b9853689915dfcab02cce2a4596d117962bce36aadddf4bdd143891e22f2c8015517039a64e8aede3 +8cde63b9bd57cb3ef743f1f3e8250669eed739e5fbd68c500a3cc0c12f93862a69aebcdbc69dd8f476c2eb307f572a53 +b967e65a5f1cd8d5d570f5e87e7e186fba51b9504f8e466392a76d8a971fb91fd9b7565bcc1647f50d7d15e48b93bc95 +8d5a87b25fedf5edd57d870304bfd9081dc78c3e3e3b38b997260a92edac7feccdaf24feb51822d2edc223b70bb4ed5f +b6cd5d340a57f8ec73723c4f3ecd6601620dc8137a3e75a5d3c578bc79a9cae86b379950c644dee2ff99dad780d025c1 +b6f0a8e754b7f52a85a2a2e6512cfd017f7fb0418d19bb318308951c4e242d3c65bbcb9748da9cbc91a738f9ca577332 +a89dcf7d410bccec385400dd96b1cc6af89026a431d0f531aa992cbd7bc8bfd7c5f360bcb665bda1d72efa17bb982551 +97788e7522427a46c4b6258d15623ef7a565712812fa80d001e1de8dc1791392702f3fa3cce5a8cd1c5755625a0ad10a +b5338fb5e137ff625b27c5148298f27ce8f493e2527c5d0facaa49f29cae34580d0d6c3c1074a2e46cd8db3f56004ea9 +8962f006d7b1095dd0dd132ffe7e87e328510c95ad893cf3b2ab21c177c5cf2c27f47d8856f87e9762c547be009d25c0 +87fee9ce9c26aa476e67e0791a809e0a06a8a98facf3faea730d438d3e516cdf75d645fa75c906e4e44ab9237a22c016 +b75ab972e1a1214bab0b38cc3e973d44bb233acda5b4291f5e110b6fb78fdcab93dc63f01168debd898e165f615be1f7 +b5a0fb52bca279d3853761a94b206acaf313df33ae6303d9b71edae90b66fc507adbc60fb11e758888736c81d5d80c0a +849b8f0005010e684701cd3a4e59e8c89e5fec59af6d2de5b6332cde03b865ea84f07f0b80ec3404380b0e148fbd2c24 +96e2b0b6fe78408f9208f809f5c40398100b2dac202c8c5c33c2189560dea868270a598c419871a5a2b67783354f6014 +b234b81f996142d0df2c719760bf996544820a03195a6dc0ff6a72543692f5a369bf63d1f0b477ef2fe7b3234e41f685 +b85e39bcf40da1a12a535740176f4de749a93824079deb5fdaa004f3282fdefaf5275e3418c88c419bd42a3dd2ed2b3b +a27279304b89a18a4e2b443246f2368fb8b15f46a34533179b6bd2ef683f6e98e222b7a32880b39b8fac1afa90133803 +8923c22cf15c9c1964213d725b337ece9ea854775a06f75f232c4859c7142a3942f418354e33066298aedfba3cb27e62 +b109f714311fb9bc431ef57911e2cad6a3949455b9f23255cd7edea35be629e07f845fe53e2b12a32305ee2f4f264f27 +b51e82ae5c7d48050e405897d0053e9ea4b2714d002e88f78c9a307cd50b9c6b3ee7cb86f86527be9d964b01895fab20 +90db256931c7f98bcf3bffff4d496739185e7a20f329ee7bffd4e0850a37739948ec745285703967f4ca50ec370cf68b +a0485ac0445d88dafac56bfba2563b020cfc370f54c1606c89d12cfd8a4d1336d2ba50306e476155a6f5b0e0a1f2d092 +a00754c3462e74bda928da855bbf90f9077db395e32f03cce9b2955546d900b72330d247b7d607b65e130f5b0d883de0 +8547d56727c3ad8b5c8ce622ed9ad86fe8cd78e6e4848c9845914b5063b17330bd10b46d8d3f18f83ca09ecb28d1afb2 +95b937b2a979bce0e159ac75c7d5d659be8599c92305e73e942aab414793364a3ec28c7c1c8491a5750ba84a29828d8d +b011e150f0294e45a0f4c69409999d0c2e602449dbd67ab95e8258466687cd733a0329083a31b03722f4e2580ddc95e9 +924651a733ad5e5d9adadad3ea6a6babb8e455c8d5f2cb5bdc83fa422e7752592190ccedaa827b866861e73506a6968e +a4d5180122f8e31503ae027e54da50f72f5cfb910a6f7309bd882b5cd666f454672591f1f20e461e182a47d03b47052a +ab19ae659c4f73ea3d21895269dbec583c7029955a36469124ebe295027010faab56c4a475973497f28e9a77c03b8fd0 +ae7ea1a803d0f439e91494f8f35fc1167dae23834c0c699ffe65d3da8b09f8df5a53195a99ca7b8558242279e69578fa +b9d63cf0e30f9800101b43b980bcd2f229758e74b21ad5354866b4e684791c08a184330dc316228a0d67fe0210f2bc4d +8c41629744391ddb96dcbbf9cd99b13d36e57d65962e0aeb92ebccf1c4cc769626feb3ec0363def08eceb102b3dd4ad6 +b2848ff24faf9e667a8c19d050a93896e9e75b86595f7b762c7c74ccdfb9db126ae094961fee7f5d1192776c1ac1a524 +af013bc29206743ce934d5887b8d0fb3667c89bda465d2321835a3618513fba6a459dd7566268220ffce7e0c97e22b2c +8bb799e36db1132da8e8b028ea8487dd3266b4628c56dfae4ea275f3c47c78e3d7445ab8d0aaee4cbf42148b3a148175 +ae2b81fd47c038b5195a52ab8431f0d3cab4cf24c4237252d955aad2156adc16dda9d3270157e0bfe5a44022e5c051ef +8e0129213b1698d2ec6df132356805a8633ba79e672e586dfef664ffccca71834253ba14f296da962651fcba2c002622 +a1ae30b500ae77cd9bbb803d737b4a5991cc780618ac22b5cc179efd8fe10afb8c135457f2e7b86ded485ea12eae70e5 +8a39723077b7c0df6e3bf6548afa3910c214ee275951fbe5155a39473be98099626ea14d844630a6fa90292b9594665d +a628386c79b61aa7314b01d9814aeec20c2a66e3deda322a39957e7135c2e52b1da486d1b9cd61c87afb22c1d10f6462 +97867f469b01249820aadd9a54e12d4fdadd4555f2d530450e1f8f6d2dae57360578e2c2c8ba41e3b5950df596537a98 +97f192d0457c217affa5a24267dd16cb4c01de8fefde9df4884e1906d2f22e73382dcee6c7d910bf6430bb03f4a4f1e1 +86d5b5739de8442dc74d0d8dc78e49210fe11bf8c6ff0f0faecbc47b64812d6b28c8afddf6d9c0212f1988451d6ccb1c +8ff3312ce9693cd4a9f4b8e75bd805f65b0790ee43fd9e075fe4cebc87185bdf161335049819f22530f54fed2779a5b9 +8dc41d85548bee5d51941d55752a500bde3c5a8f3b362da4eec307a963968e26605048a111c9166d448b8dddf6f53892 +996bdfd004b534151e309ac925fa5ee7801c9da4f6b4c43e156d1158b134535a2a3956e1255e0dd72ac2af6bddaebcaf +aead652704b788bf4983c8f725c644c327a6e9f6683215f5c826c09f82fd2e40631791f51d14e6aded91fdc018d45501 +991ffab58a82b98ed8fc7b00c3faca153589fe09cebf6a137ad506387a1ca4dba475b0e4a1b9bdad829f1422facaec39 +9652e6c4ae084221d6bad855ec0bc11b5f855c6efba67f644e0902ab790a98861cecc6ce047c68273c3aa7eeb2f4c7d9 +b88b816507aaeea6dc92b861eabdc96988b74d7883f20a4b30ba249158acaff3c50d261742fc9ad2e9eba888a8d59065 +acd028a51e16c07a10d2073b9d03070457ac5f1246365295a1359d015c460b92b4861125fabe6f114de8197045df408d +806d3cd9d02d41c49179fe7dac5b05dcfc9a205a283135d4f008d0771c58e6f963d7ad0f6798606edda718eb5c7ff3ed +b9b71f1657a6b206fc40159a941e127f252a7b324dea864ecd804f48c0ed86da9778a925fb65491204a92bc2a26fef32 +80ed67bd0e74350c875abedc0e07fd42ce7cb926f0f3fb1949c6ac73f2300b5a14a5c6f6ff8aed99d5ea5029bb8e7ae6 +9875f67a7a473714e4dd75ee0c763ddf88101532d9680724b3848fef69e218b04a96b90f88e0f4409aa40b9a21507ecc +b4a2bb1b421e5243e5e7576a0672dc19f9f70315a03f6411c19f76616ffbb70fc5dc0e57fd4ab85e24ea2261b7ce38ab +879723002ce43e6c75ba2246f51436efe3376242beff987d025c3c4476495af32d52a54fad5d9ec329a442b93bcff1ce +a4121efbefd9c3eb143619afa52a916f199c75024908047763b29466cdfc837c2fcc894aca63044c33c41c777e529b5b +895f637b497a9766714a3d9e3c275a1f0c9ddab105bf4c8b7e663f36cd79492022415bb4938c1a4849bda73106ace77c +b119acb8b161ce4384a924645a248a656a831af526cd337d97e08405415b9dd22060849c76b88a4785eb5e7214961759 +802e712f4c0a17009c4be6c1e5ba2ca3b82adcb68793ec81f4489b7985babd8a3873d544de63d5e5de0cb4dc5048c030 +ab111051e4651b910c68ecfdc33f2d99e7bf4182df68cedbdbbcac219a543e04d93ecb2763fe32b40c095c7ca193c331 +855c73ef6afc6bcaab4c1e6388519fd5cbb682f91995bebd558167715db454f38012291beccea8186a3fb7045c685b67 +a29d02ec6d9baf84c19dfd0eb378307703bfafc0744b73335550f3cd1b647275e70215f02d1f4ab82a5df4d4e12dd938 +91510a45b8a50cac982d2db8faf8318352418c3f1c59bc6bc95eab0089d5d3a3a215533c415380e50b7928b9d388ff89 +8286e7a2751ca4e23ea7a15851ad96d2cadf5b47f39f43165dde40d38ddb33f63a07bc00600c22e41d68a66fd8a0fa51 +a413d4e619b63799dd0f42ac57e99628d338b676d52aec2bb0d1bb39155ad9344b50cdfe1fe643ff041f1bc9e2cec833 +85524e5bb43ae58784d7e0966a664717289e541c8fcaff651541718d79a718f040a70aa8daf735f6635dabfc85c00663 +97f0d48a4028ff4266faf1c6997b6ad27404daa50ca4420c00b90f0b3e2d82ef8134d0a04108a74955e61e8dfeac082c +8df6145c6cc39034c2f7331d488b8a411931c8faa25d99c5432831292637fd983d4f6b1a6f55522b4a42a462d63c6845 +98c2060f67a916991b391e67fcf23e5f305112807fe95bdddb8ce6c4084126557e4c5f003afb32e30bc6808b30d4b526 +8964246b3c2b8f7312f0a99647c38ef41daf70d2b99b112412356e680185da6810ab8ee0855ad7409d334173bcc4438f +b56c2c416a7069c14bdb3f2e208c5a6ad5aac1cbe5b1faf99dc89c7141d0259d1c6250be9d9195500c4a41182ad2ec3d +b7864583a4cae3b1083dcdcff7f123d24a69920a57d6594d0b7219e31bf0e236682442b6499a1f6795cfeb4f5f236695 +a064f94139bf1b70d476bde97099631b1284aa6b4d87f16bfc65c075e58b2f1b3c2d057605259f806e545674a1169881 +80d1bc4acf14c0f487cd57c5d6157b7f38917e93cb660f1c25e474fcdcac3c3dfda50f6bcccfd6676bae25c4b6b5014e +8ad9a4976c4e3e282843518149fcf5d454240740f4b91466f6310b7216d23d70b9b47c42870293252f29f092f330967a +914197593d2d99d784c704cad7ecd3f0b9f55dce03fc928d13e1a1034566c4de754f1c2a5ade047b0956415fe40399ec +8d77f5e29c572ec3c0ca39cbae2072ba4102403265b3d8c347a00386da9c0b8688d6e3280c96037c300d57b3545f3773 +abfdf79d935fd4f06a04938d6580a8cbf9735f0d498f49677f26e73d3b34b7075d525afcb4f14ef1632cb375bef7dd55 +a97a8c446e3edc86efac7bda5e2e5d0158c909552a3bf86151df20ece63b8d18b608f477286fb1c7f05605ab7e6a7c2c +8618d946c7fd62486551c35486fa466bdfcdc63c941e4cff5a01fbbe566b7ea9dc763cbe73e2acae063060b619a212a9 +8d03ee468070936004b06acf64b868963f721f37faa09887f8a82c155ad5c5732572a6855b531db58af03b1afe034a18 +8d3247f75966ea63935ef6049f7c889c1651374adb446f49499fc9191dbcde7ea33cbc1f1e2d3d1756b6e69870404643 +afc853c3a3facb4ba0267512b8242327cd88007cef3bf549184ee891b5ddc8c27267bae7700758ad5bc32753ebf55dae +80df863eaea289de5a2101f2288046fdbfaa64f2cf1d6419a0e0eb8c93e3880d3a3fdf4940f7524ea1514eef77fb514e +8434b5888c2b51d12d57da6fb7392fff29393c2e3bfee8e3f9d395e23ddc016f10ebe3e3182d9584fddbd93a6effcefc +b78cbb4c9e80e3808c8f006dc3148a59a9cace55bcbb20dd27597557f931e5df7eb3efd18d880fe63466636701a8925e +acb140e44098414ae513b6ef38480e4f6180c6d5f9d1ca40ae7fbadb8b046829f79c97fe2cc663cbccd5ccf3994180c6 +936cb8dc959e1fc574f6bb31f28b756499532ebb79b2c97ff58b720d1cd50dc24b1c17d3beb853ba76cb8334106ce807 +adda2116d9fab2c214ec10c0b75f7f1d75e0dd01e9c3e295a0a126af0ea2c66373d977f0aefdda2e569c0a25f4921d0e +89a5cefb80c92dcad7653b1545f11701d6312aef392986835d048f39d5bc062cabc8a9501c5439c2b922efc5f04954d0 +b9acb52747ce7f759b9cdc781f54938968c7eeacb27c1a080474e59394a55ae1d5734caf22d80289d3392aab76441e89 +8564f72ce60f15a4225f1a223d757ebd19300e341fd9c1fe5a8ece8776c69c601938fa2d5c21b0935bd2bb593293272b +a5567d7b277c4ebf80e09c7e200c20d6cb27acbaa118c66ef71cbccb33ee3ddce0e0f57b77277ae1db9c66ed6e2d8f30 +b82e9c2d8df1cdd3b2417bf316d53e9f3cb58473c4cb5383f521ef53e0af961ef916e4f6557a6d8b4655ec01415231cd +aa816dfd2814c8a25bd2cbaf66303ee49784df471bac4b3188074ea30816f00f425234454d40d8ad8035aa925d74da36 +9919f384df20faaa2d226b521cab207dd2b62420d25ebbda28c9b2ca76a2a52203b2ad7844c1a25f5c75f005c5a83149 +b24a6aa35c2d0f87e36598b36224c64427cd69642b6f9c1bd478a62c70f8ee69f85028648f6603b4f04fb21355f2afb1 +892e044bdb1276b455eac2204be105e1821f987c2570494b1f32aa09506caba7ed343cd09b1bc126fed5e0fda3d0eaad +af0e01a3ad954dc048de18bc46bb1c4971db2467e839698e4dd05cd1adcb9261013fe9fd0cafb946c0b586f6aad86d4e +ac152f0a9ace425378daf02510eb7923ff1ed2c0f8d1deb918e4efb63655de1ba58c96438e9aa23abdf2431dc771370d +ad8c7419c097709347e2394195924e09617b47ac5c7a84aeb9deab8975f22155de0f70cf20d8a976551b14e3a2683a2b +808f14f67ae801536fb70a5898ab86e50ad35340cffd0648daed2f2c4564c9ad538034b2a179a6a8bfa27e9d93b4cbe0 +80a74ab7ce4769db93cfa695a166db95f0a9c47885ff826ad5d93310f36d6b18b5351c67c858b9837b925e85a1995b63 +95b88c3cdd64401c345828f4e4754b1a88b4875a14c08a668b90acd499b3b858842669ecd73a46c5d9f1de32ec1a0120 +8ddbd770b7b18a5917eb43926fa05004e819f1d1ead05b915269e4a86b53e0633a90559007e59f6705a3769e2126ac56 +ab6db5fc220754f19948bef98844e6e38dd623565d1695e1198040c228ac4fd863c1f168cac1d036bbfb718d9d8dd036 +97bef628e977c069e60c395a17740e0e1bc1828f5607ae7f30ce5a0c95f02b53af2ad062700a75212e462aa22c3c5465 +b68d465e04fd17ca98501e61eccb0ce30401855e98046e0c1debba71c2153d6a7a704aa36a6f12454696e78e87181cdc +a79cfdd048f4181e005bd0fbac0a8424495474956b58ce858d2b700fb0f931c406282bd33bfa25c8991bc528d12a69c1 +843f55fa0a6a0969daf2b48080738f30b269b2e7ec123a799e5b203c0b3b4b956dc95d095bc6550b0013918cdff8a225 +b683cdf2823036827e5b454bfe04af9bec1850d25a7a7a44aee7696b6ff0468b7ed6885a41dde2b8f3ecc4aec880c3d2 +8b500796e82acdc89778e0c0f230f744fb05f762000fee877bcf57e8fb703d212dbc2374887bdc2e7b7a273d83a85798 +ac35a8ee87bafecb1a87f15abc7ccf4109aab4ac91d357821e417f9b1474d196c38cc41cd13667f68d1ffab5e79a6e92 +b6e517739390cfed5b395d33b14bce7cd7aaece57fe79a7eb3cbf150dc10765c3ea9fef7976a21a2243687e6eea38ef6 +b53901eeee26692273365b789f2a60afc9b5f0df229c6d21b07016cf4c0e7985beec748aeca52262f68084393ab038e1 +ac4804f33d8ba2b4854ca3537bd8bf2dda72d4e94ff7ecaaf9bd3b7f098343d74d765471ef80072ae34f860b052cbfb1 +8c6a30a93f1dde18039bbdd1ef294552bf79856e20bce863e4b8dd72d906be3ff22468ff3610e06b5a7d1745dde7ead9 +88f0607fa3b7cefe20a02115572b16fc3222be86bb19e592c86c48afbe7e0dd523492b0c29a3bceb9a20f5538bc3134c +a660b801bbddad725975ddf9a8f606f76ecef831f954be224d6178c368e1c72d346f00c4a4c95c289b62d36f2af323cf +a75b9a6aea9542b698938dcd6cc2f6fe0c43e29f64b2f54aeb05d35fac73d41aa7fd750af4fa9333644aab8db90775b9 +83e1b7129d963d1cd076c3baa5fe422148e939273db173e4d59d1858a7d841eacac7fe817d15ab8f8a493bf46c2045e6 +9060a2e9c24de11f9c70e039b5ffe9e6d32f1ae39f3dda263610df2265d917679e689898e4a8bd84ad34613dca5e3761 +b42fc8b863a2af15e04d1fe6693c09b46007c0b8298973fb4762b45b4590ad7fe0aa758918b2fe5ed1ed0359754fd955 +83e6de7860fb256ecf7b47506a5e557d0fb0aefe57fb513c7dee2bd9604712d08ca26adca7ba9a54b712372a7c585a26 +90586e9cbbf71475ecd3e7b5753b286804dcce61e165502a82b960099e79272de8b7494b8877b54ae838eb5d0f71af2f +b2e4b0d21208f73b7b75e08df80cde20c4578e117d37092a490af82354e2afd3a7dbab46fa2d12fcb731cdaece69c2ba +a010961239bb8809fc7fb4aa08fa30d33a130f9f417ee9ea60f587dcc5ef4e1b7abcdcbf8e848ecdcb7972ef6af46e78 +8f511fd58d1e3403a5eefdc0a4ba6b8af848c7efddbf9575ee84449facde05ae9a24aa41a5725416467f6fbd11369c52 +b24ebbd2d4482eb618cea1ac4fbfd9ed8c46c0988a27259300a7ce5ce1bb256aeca0357828cbbc4cf0dfafbf586040e1 +b3ea29e9cca55250e9b7b9bd854edae40f0f0cc65fe478cd468795d1288cc20d7b34ced33bd1356f1f54a4291faa877d +8a8b20f222d9e65bbde33638033972e7d44c6a310b92a9d9c5273b324c4ad1a94f2a10cbce8300c34dbd9beb618c877d +b2436a9a647dc3f12c550e4ddc5b010e6f9cb3f3504742d377384b625fc38f5b71710a49fb73ffaf95b9856047c98201 +a13f8b77c70621e421be94c7412454adc1937b9e09845c2853ef72cdbe500e5c1bf08e3c8b8d6b8eff4bce5b8dec9213 +b25de8780c80d779e6c2e3c4e839a5a107d55b9cccc3ad7c575f9fe37ef44b35db4c1b58f6114a5f2f9ca11e1eb9c5fa +96ba6ad4358c7a645e5edb07d23836cbd35c47d9a66937d09486570e68da3c8f72a578bd2e14188d3acc17e563a652d7 +a7f55989814051fda73f83b5f1a3d5385cd31dc34baf94b37c208b3eaca008ff696fd7f41e2ecffc2dd586de905bf613 +882d0c7c81e58eb9560349f35c35e4498dcde7af7be8d7974b79d262304c26ab67ffa5ed287bb193d5f0ab46b4096015 +a607158f0c1fd0377a8ee5e9715ac230abf97406c19b233d22f5911ebe716967cc10425546dc44e40c38bd6c2b4bca2e +87e8cde50e5d852d3f073a43d652f7186bac7354612517cfaecd4a1b942f06fef6f14546279c0dc0262e2997b835b2a4 +a1c93acc6db9d5ee426fb4a0b846bb7a7b8d5915bec777a9fe6907246b0beafb8938941c8c79ed6082155f75dbc1e332 +b1e4f61457b86f76cd93eafd7536f72baf239ce5a62bd5a8085a34e90576b1e118e25002d2de49b01d6e9a245ee7d3a2 +a0435fe9a4bd1031ec5973a103ec9396b2ce9fd982f6d9ed780fa80ac06a6e47a0a6eb2daf52df1dc9292db622ee9fa3 +b66d8e8a1717e4bfa42083b6ef4490e090a73168b2912f2111743e089027be0a4945a229ecf5d0b5eec11b23f0e11303 +8eb764f26904eea4f4169be6e75beaa6a39e4eb524625a15a78befe3d8e3cc82692d9b135590c20ed460d6e4ba630ef7 +b7e4aea6bb09829e53fe83e53f49a7a331a6d7bf76e0073d758577e6d6fbe63dab642b23657355cad48896ad8715119c +8f94207982373a99ffa282673f192aa98d0c4461fb77c31dc4549628bd9687a249f1b3c66b1840929341e42516c5c64a +a9c673cb247b13e17fa5e616f0399b7f5c7ad043e143e44ae68855a840870ab3d2aad737ebcf74c2cc9688d17ef3a794 +b02635104dd28c02068985256975c0af783899eb996e37d021d9a35238deeea9e836760db21869be7b6c82aa687ded29 +b33bc0966389710812b5f6698afa3e9c84839a1b85492ba11e6ded26695260abf66be6fb355d12d3a8524966f0f89e0f +a79c0dd09506951c33da3cbc23843fd02d641fc24c640a205e6e8150240372847312b9381fb03c5d301fe4dbee8d0da2 +b74de6f3a2c502b5b658ebe8a9b7edd78afd036f5a2736aa06502863b6865d131b9e3542e72a86fa2e1d2db4927661ed +99e365def1452ff9fb4b9eccd36ff4154d128469ba5bd73e83ae457ab53977cf6fc04a5d05bdcde357ab539e34bd9fe0 +b4f2bfb95abb47c67870aa6ca38ac8f3ae1b1a2bed064b1be7ff90865ea12e4930fcf66429c7ecd1183fae4a01539386 +ae4bde87f36b912e92398bf72e11d5389e93b2de1b277d7ed4b6fb5a9ab9f71a959ec3bcb734c11079440fe42b86fafd +b826459e568efdeeb66688482b67ef5020787275123fd3192f979b6175e3b0ed59e17cb734a0a052bf13f0afc7bd237c +a99dd735f4a7c85cb23dcc7f4835f9ab32026886909aaa95876b98029c37dc4d621726c872d3a9e50403443c958f4029 +99083545034768010988bf8a9f34486c2cd9da27a1d10db3ab86eb69a1dd9c8ee723e7da4ef2aced63c1dbd53ccc52cb +8ac3209349f0142546c714ef7e9d1b094aab5469b8f080c0a37cb0362da5349e108760f272fbba770aa468e48d9a34c4 +af5f48ed74b21e3f2c1430192adb4b804dc873cd7e8f07130c556c30e7b78df0ef5a14b205368848fa9185e5a68dee0d +b8b741b65d68df89443523ba74203226f1e0d13bab073d183662d124e83e76cd318b2bfff09879c04d81b577ac895638 +914abe4282d11176d4f2f08c6f15e6c2d0cde1ab4de00bbe888015c205f51929d97296a0a8d3ca5641f085a29ea89505 +83ec306b2a9a6780efafe799df90b1aebdbff7d47921a136ea8a5648b9708a97231245a1082fea38e47ecafbbe000528 +95d6b58d70b388dfcee4eda0c9805362ccfb60a87603add565b175b2c14ed92999dfdb0d3724ee3e5d30535f282641e9 +97eeb4de607c8306e1d4e494f0d5db126d53fd04983ab5674ec5996b971899e734fa4011f2c889da21154ea1e76dbd2f +84ff21977fbd873ea06bec444d4ec9ff0e3902edc29dfa25f3bed269b3709e3116e99dc06cc3e77f53c53b736bf8fc29 +8ecf483874a040a4a1c293af145094fedf203a5eb37c3e165857e108cce3e1210e0bfc0f26f4ae5e2194024929ba034d +97d9b92b2ef34609d69402167f81bce225ed3a95718a3b403f702b93e96a121a8f7f072d0ff47e8b25164e204d1576bf +ab87c39cca1803b4e84b32e40ff30289e3cbbcfbe16a70f9e025643824752359be1f10c3e5398df402b6fec64d5a3537 +af84ca57e6944332884b5c84750afe0d5950015e127acec161853d55d48fd864c7da8d59cc5aba4ceceac650b813fcc0 +b1d23d98edbe7089ce0a8432e0eb3b427c350fb4bb39eb2aca3c2bef68c432078cb9b4b2c4966255e00e734fa616638b +8e2b5252e0ea96d40835ebfb5693af49946509975682d68651396d6bb1463f09e75fd0afa04ccea49893b5b9c3e77e40 +8db25e762f1d4a89a9a1cbc61c01698e775906bc88a921b2905735457a35df9ab84bae12e1b1b8dafadd50212f1acda1 +b5f7cd163a801770a4034e2b837e00191b0ac63a2b91032ae9a99ec182d748798df48a14644935fabdbac9a43a26749a +998e7232e5906843d6272d4e04f3f00ca41a57e6dcc393c68b5b5899e6d3f23001913a24383ed00955d5ec823dbd3844 +ab2110a5174ae55ebb0a788f753597bd060ee8d6beafc5f7ce25046ea036dba939d67104bba91103d7838b50e36703d1 +a211972a4f6a0303bec6c86f5c23c0d25ab4df0ba25876cbaad66ae010b5a00aa0c5daded85e4326261a17a563508a25 +a49f53496a4041a01e07f2c2cf1e84e2ee726917bb103fd267451b9b7bb1331c0afde85a79a55409bfde27328b2a4745 +934e915c67c7fc47adeabdde49f63f04644fe234672003be2aa0a2454dc8d9288f94293478936a450f2e3f249d395b5b +b6e69e9d6808ff7f60a01b7aea6781495d7a20f5b547852d3f0af727a7434209d3015a9dd04cbe3e272918e32e345508 +b348d3462092b5c6fead7e515e09611438db8d69650876dd3b56226e303252bbeb9e9f3b888fb911445b0c87132a1d0e +8d6510334a905efe5a32001e167f1ba06f9bc4af7ffbf11b7f7bf3c0076b5cca373d8c47e98c1ba8755bb22632bfe0e7 +a2d5200f20985dcd473d119ee97e1c0fafafa0f191185bfed9cac429cef8198d17665dac4f70342eea66e6e4a7370d58 +8dd7eb6b1841b3f33425a158d33a172b79b2dc8a01378e4174e67a1a4c8f4b887f02c7c3a8f354ed9eac718155bcdf37 +b16ca19388642f71afcd9f7007b490d82f83210ac1a989da9d4bf4c419de07af8c048cd301ec7e01b9d06abda7c169d5 +93cb2d847d1a88de8c1c9d5b3c83efd0b7afb3682942bd2c8ab5ef35b33dc31a097a3e181daab8630d4e840b677216dc +a8b648c769e77a7b41c0c689fe2fba9bc585067e004bcb1732cb7b1618e97b317781c36c23a00680fc780b58c301a789 +918c321100d57712866bdae84edf7e42df30a32853af257e0cb4da028842a43b49e775f3cecb85cd817269c728de7319 +a7b0f6ce42e00c519e69b2c78fd9b75a2e7103e5892d3c1afd70c9b5b9e706180a4bf73dbb2d3eed52bfd521103ec5b3 +90041994af3322b010891356afd8115340bd7fd7ba328716fbc4fe458236c8cad8c7564ae473d6091ec3a54bdab524c0 +acb1ac83809573846231f9be2dc5f3e986cc36dd9574a620b1cced45bad0b11ea957ce8c6cbf964a0af916781c574f05 +ac54677dc002698fc4d454c7beb862ad085d0514f92576f3485a44c0cb47afb9db2c085058918a3508f9b3de0137d97c +8dea56e1bfa150e442f8484b2952b116781d08cfa3072d08657cc09b0217276efc4ab6f5fd726bfd826f6976ced8da29 +a2b09e25baf01d4364b5205fa0c4dea84ef8fe03709113b034f88a0f0a502a81bf92c1d4641e2ac9f3a6f4203d3645ee +b95fe37aa351b4292691a9c2e547224c37ec2751a31ecce59810cb2ae0993da6fbe5efe0ab82f164462fa3764b6eb20f +a3498947e91a3a540e86940be664fc82f1e83ff41a0d95eb84b925e820602a41b7393c8b458bd4ebbe574a754586787a +aa2516d3620c832e5728fefdb1af0be30c871cbad4b166a7a4565af676e73bddc2f2f51acc603b3a022056daad2b330e +a9251b56467fb55f64c70729e2ec77a59d7eac79cc0b4b25ee405ac02aea46bf1cbc858bc773934a6d9bea57cb528185 +ae8c0a4ca7ba6bdca8764bac98df0581f00358db904e57867e6ffdf15542e55f7bad2dedac152ef88038b466ed901934 +b0881e27e52cc6a57c4f3f278dffc7f63a9174b68bc867c16d8a151d9cc4d0aeb703d1074d1927faa9ffb43e10912c9a +b67138465d6654ded486d18e682f11a238d6a65d90f23d6b13eb6a1b7471efbac9ada6345dfb13e5432196d2a256829a +944c69a6f1126edd38f6eef60b8a5bd17147ab511e44e8e0a442e87244d8f35236ee0b8d3dac0631f8598f16486a5f74 +995679dbe03dec775da26708cb9200dabcad983825f1ba601eb9395f9da350ca71e8af61dbff4c668fd0eebac7e4e356 +89de362f02dc14de6995d43cdea3c854a0986c605ba5eb5dacf24e3a85983229bc99a2fcf50aba3df59f0fb20daffe29 +84607f0e2d078df22d0866285614f5d78cf7697c94a7d1b5e02b770101ceecbfd53806b377b124a7320d9fed65000b97 +93e3faab60050dac76ab44a29bcd521813e76ec8e4ae22712d77bb489bb49f98f9087acfd6a77016a09a42ddedab2d73 +b7d64a7a35f21747b8e6a874be31ba770c0d13cbd41448411994e8cebb59591295a26bacbf74ee91e248a5b111aacca0 +8dcad429a2b0d66b9eb8c1c3924d7a72979727db6a535526a3518bed2a9532d12aad1c5a778824ca4cb98e3e513f85f8 +980882895faa347bd2fd1dda7b8ee7ed49e69843afe646f677b371eecc7a10e0f4e40bb55f28995a40080df471876816 +89e8e7fb51df79971e2f7bf65783614abbb0d7f3f1b4a15d3f0d160deafa7ed1c446d9a5ae1a77160d4dd94ceed8af13 +93fda8d350392e9c4d4ffe6534f7e7be53f32483d9319093e8436fbb8166a3c01085dc858373e65c7f4d014e0dc2bab7 +897521a87b7ebf7152de5260c0875e3c7df1c53e734c672569219ee6f9bd196c5ecef159b6a1d3b7cd95e91b9b8803ff +b59affa408a0f7bd7930fa3b88750fd043ce672c10a3adeba95a12f23f0dda1793f761a86f7409ce1e6fd3b3b7195381 +b4422ccc12f4fe99c530cda610053af9ffe635b633d52492fd81271d1f6f91b87171d572d5bd0e46ff63e221fb2fc4a5 +a4542cdf3346ee0867c08d630c2aefc57442f1c05c0eba52d223bfdca5e9d0bb80775cff6ce2e28aa2730231fd7b1bb1 +a7d297bb09118b914d286e5d1e87bdf13f7d174b988e38fb5427902e8e8c674072f36b19055a1070abcf357f8668f35b +9213b0ae24b7cb43ae95e25c09fead8bdbac55141694137d67eb5eab5e90a348a13d4d4d2cbc6436fc4f4f9f7334ced2 +8aed71a0d116d832a372b42a0bb92a1980f3edf8189bdbaed7cde89fc0418b3ab21a04f5c6e1d3b8edf73f1f62bd6b15 +a6c47d77d714c285c84c6b9458cbec5e3b191c0502dffd10ce049cf1ea27ddf868ef0cff13a2377289fa6c932b8e4f28 +92f45622ec02483f2c1e07075a6695416d3768c8984856f284f40734346d56cb5b3322f20c2c9f0ef8e58ddc294a309a +af6450d02b79ac9fc79f35655b58fd3619cd5d38c5317564b453f5f2d79d7a030bf767e399fe01b658a72fbd2cac2356 +a3c01fed5240eb8a61ffa8ff4a120dbcebb53b8e19845949c77fb4f9b2c3dd52c7001df6219ad2f76c785a4ee0f64a2a +af3136bfe8f774187bdf87555a1ac505322a956229a285d28bab1c88d4f4d12245af8dff35914a62e90e49f3dce6acb0 +b20e21d28444fc96737958cd951858fda324b924b4d3d08932540fd4b87150f053db6985b96903906ce83dde0578cbb2 +b7978101071268d1f485134b4dfd1e35f89b82c7d99ae91f58b6745f5e0273b7e06f3b23009033ecc3e41b2e9e85219b +9104b7d75245b784187175912cc0ad869e12f1983b98e052710fb33663224362bffd69ceed43e7d4ad7f998c0a699eb7 +a7624cd71b92699ce3fde0e747976ee04ee820032ac45dd27d769edf3b3379a4b8db358e50c9d057c63b5a9b13d76bcd +9354a76f294005de8c59db10e638ae6e8c6d6b86a699d8da93143da8478d36116211c788d8285d8e01ea6647dfcaa1aa +b85935c04cae14af9848db5339ab6420122c041075ec1549314e3c9c5a610d9b794ea3617c50ca7af6b4aec8b06bc7dd +ad6835a62311c84b30ce90e86c91c0f31c4a44bf0a1db65bf331b7cf530cca0488efaac009ab9ed14c1d487da9e88feb +80339f0245cc37a42bd14cd58d2a8d50c554364d3a8485d0520ea6d2c83db3597bf51a858b10c838bfc8b6bc35619638 +b370420ac1a011f6d8f930511b788708ccf2fe23ca7b775b65faa5f5a15c112a4667ed6496ae452baf2204e9ce0dbf09 +8ceab3dadca807a1c8de58ac5788313419c37bc89603692c7a4d96e2311b7fe9e813cc691a7e25a242828cdf98f8bbcd +ac1526ebc6bd4ac92ee1b239f915e494d0279fbd065e4cab1f1b8a1663f67daa89560f6c99bbc3e63fa845520316d2e6 +8240ab0bc36a29d43ec3059c7e6355ff39567e135f93b243145d3ada97fd1c970743819e0d58bd5171967daec144e7a1 +a99743192a6f1967511b2d3038cc73edacb7e85f84b2926d8880d932d2fa12f5215592311a7548494b68a87ec70c93eb +8ffffc31c235997e59ab33c2f79f468399eb52b776fd7968f37a73e41949111957434f2c0a27645ab34c741eb627cd1f +8949d955309415d6d2cf6ee682ccd0427565142c1bfe43b17c38de05cd7185c48549a35b67665a0380f51aef10b62a8e +9614f727a9dac8ecd22b5b81b6e14d34f516db23a1a7d81771ddaa11f516ed04d4e78b78fda5dc9c276a55372f44c4d4 +aa85d3ef157407bd8aa74032f66bc375fddaff90c612470b5ff5d93659f8c3523b2d1b6937b3cc4201c2aa339621180e +86f8fe8bf4c262dc6a04620a848e3844f5e39a2e1700c960f20ee66d4a559a90141ef4e5091d0f32acb1e915af1e0472 +b3af2eb785b00588371beb3b49536b7919a3f2175d4817de5dcbf7fcc20c512852ef0f313327fd0589b10173f77b92e0 +8388703c512eea59190351f3bd2cce83ff8bcb3c5aefc114cccf9e9b3f78200d8034c3ebe60448aaf6c912f0ff8f0cc4 +95d0dbbbf08ec1ed3975fe7dd542be0a05156a2b3db5092825d918a849411ee536ed958201f74a5513e9743674d6658d +8d1a48802f1a2db247e633ddf61d3ef7a2c062c48dda59bf858916e04f56651a7d51e367d6535964ebf3ae6d2b21b421 +971436871bfe868f25247145a55802945409b3150008535b372c949760d7949dd2fdb40d9b96ae7473bc8f6e9b83ecdb +8ca431728ac0f156763090828a7b6d860bf591e5b9dd3bb3b7f3ba0ca74191f9710ee55efd32db7d18eab5b479cee8a4 +81e28f1a506e84c2b9aba1df720cb50e0b597b2c22f98acc34e710c934cc6f97dcaf33d589e845c2c1f6d8716d05ccac +8f43b11d3f00c41d16c9bc9bc0c44227c056bd77de4f1ca9a799418c5601e744f99066bef47da2d9088ae88eb259327c +8d330aa52744c08ef98cc5599eec8b9b4dd18aa01b803f1d1ca0e29b74f1aa2886ed0224390fc377af25852851fbee03 +a06f5b203b67134c685039ec2bdbcc787353e2575ce73a415db24a517c0c31b59d1de89f12b97cbef0219fb6a1e90a20 +9269a5f49bbb8fec1a387b5d105df88a027de615d5ca6afae20fe89b11746f8d23880db78dac238c955fc8bb3de18046 +af5074b3bc0656421c314547b45b5abd3045ca1b17f5e34ba39d8c1f7928a55d4ca5ea9c2ab59a55909b25255233e04e +8e7ee5d733c8e08f3fb7d85f0628de3de6835121672c65374905dc6d19e02fa2df14c13d5e9835dacd609a4df09abd26 +a9b9aaf83d31e879dfb8e73a0708801b4dbdb5d7c8654b27d2c0f5797ebcacc8d00a82143e2060f0917c9d41f1a03de6 +904872aa1c093cb00e1c8e369a3bdae6931c5b1ed705dd3bffba243dc4f42df3e7d7cf70303d513b34d2245743d765cf +8a4d6b3b1d6afe67383c66693f70b397e510be28e3d97dbc8ec543d699b6cbb0e72eb90a7f65e83cf9f7ef50fb18b128 +a914de13916e6a0dc0e0fefecb3a443cca80d83276513b70c22c6e566a2d41acbd33a0e2836ee09abeffd3a4894e437e +b9c408f5f05934b0aefab301ba22f8254c5ebbf5405b6aa788f76e4b328c150b395f441e3566015a0deb3eca89afe9ff +8d32aa2c81b2a8b89f347c2e0b6567b2117ddbb778fda8a3f19004b7f5aa9dd814b9b3ad35f9223715d2447b2d12f159 +8230e8b9c84cada1bf14ea6aa9ecdadd978d893cf5962fee6c7167ed21239210ea491987f2c8f2e8cfea8c140704ca28 +a5d7b6285fea51c6f21d0976a7c3a97baa3d733a201bfaac0994db6c65611d91c5fc0ebc2a7724ee02b371e575573649 +a54f00a9530f6930069f5e3a8b8b1d52ee1def0aad1763e3c609ec07f25410969b43d5943a94c235ed5eb207b33a402e +a8dc6e96399b81397734c61c3a8154e55a670fa25fa5854b3c66734cbb4ec0d8f6ba650ee3c71da3773ffc9e37abf8bd +8841fbfae1af4d400d49f74495f864804f043416c09c64705251d021b3ab7881f134a00b0241e61010617d04979d747d +95acea7ff4861cc969c1d8cc8775c5eae014ad6e2e0e2d0a911dd916c34ae69f53eef779cc24ff1eac18c2b478d3ba2b +a5dce74abcfb8c68031b47364bd9baf71a91db01e45514ab6216f5eb582ef8fe9b06aaa02f17be8b93392d9b19ab9c06 +89e111169e4ae2f4016c07c574a3bdacd8d2f359561fbbdaa3474de9bc24ef8936784dfe6fe0e29a13cac85a3e622b61 +a4c511af6bdf3892939aab651828259e4ef6ebecfdd503ecc14e61001575b313a89e209cb55a77ec19a64d29ada066ef +923c62156fbf3a44926ffb5dc71f7cef602dbe941a98c61f019a27a18a50c16b6135b6099fe04a2e1dc88a6cad989fb7 +afb9191c541b61afa0ef14652e563cc5a557842ce2afea13e21507dde0ebbe6da5233af949c998c00865c79bb3d45ec8 +8a1f0ad65cb2b225931f41dc53547d756111ecbf5bc57c5ee2cc1ffd61b126d0389d311ffe26cf06eaead95af09c5ca3 +9040b20b5ac2e1a9d30abf7a4eea1ec2db8f3077cb2cfc8736b37222d8d3937f5d9f421167086dc5551e9f0bd2522d07 +b6d888b8c6bd448dccaf99c3f690d47f802e134709ce102fb6f6fc68156943c0762be6f386338163e01eed2d1dd5f734 +b94f0e27bbcda793e4a272603b3dcc739d3bf3207798df7319f8dc9d37cbd850e3724bdd30498c929debad971950223c +9769827767be9d7bacba1b687289e0794c6fe630d33c9b607da1f6a65e3f34cb8bd65327d9287c8c5f3c8b5f6d3d133e +aaac72c993aa2356c9a6a030950441de42b2d746bace29865382f0ef54835bc96958b2f00237d805ee6a69ca82117c1b +a2b1f027d80c1b0e79bfc7dd252e095b436fba23a97a1b2b16cdd39fd39a49e06a1ca9a1345c4dbb3d601ffa99f42bdc +b3fa0ad1478ca571e8aa230921f95d81aed7eca00275a51b33aadabd5cb9c530030691d1242a6ff24e2d4cfd72a47203 +a43ed4368e78daad51b9bf1a685b1e1bfe05bed7340d4a00df718133f686690c99198b60031513328fc353c6825a5f2f +965e145711ecf998b01a18843cbb8db6b91ff46f668229281d4ca52236c4d40804ebc54276e9c168d2a2bfc299bcf397 +ae18e6efc6f54c1d9230210ac859c2f19180f31d2e37a94da2983a4264dbb58ad328ab3cbc6884ce4637c8c2390f7fc1 +83a9200486d4d85f5671643b6daf3d0290b2e41520fb7ea7030e7e342d7789023da6a293a3984308b27eb55f879ad99d +b925fb6ca83479355a44abbcdf182bfac8a3c7cce6cfc7962be277ce34460eb837c561257569be3cb28023208dea80dd +9583dd991b62ae4bd5f379ccd3cec72cfae1c08137ddfbacc659a9641e7d5a82083de60005f74fc807bd2acd218d0789 +ae73bc32e9ff5926e1e06c07a3963080881b976c9875777f8e4cf96af91bf41bdbed4bd77e91253b8ec3c15b4a6d3977 +b2a3ea90aa398717ba7d8c46743e4c487b63c5abb140555d8d20e5115df2f70d3c84a2cb9a5e0536b2d93d24f271b38d +91d119d3bf1d34cd839eb69c6de998b78482ab66bc93fa97e31fb9592f36cdfcd673f52366f8c8e8877e313b92d4a2ad +a1907e20120902cf68912cc3046f8806cabbd7673e80218814cb088e080dd93b5dccba395b13e0025f5755c183276c3a +b2e2011df72504065ec4c12cbc2137b95cfcd1355509671feb7b00dbf7f8d500476a49754cb7fb9219cb5cba7c8afe01 +a48589fb7a74a3dfd782cb3503e6294a81dbb6adb412887569f9408e9079371edbd9822388e0b7ec8d3297ba270f53ef +a203909bfe196ac65ed3e6800d577b6ca5c8fe1d40f7f925a43852951e38883f2ffd250a9e16fab3ed3dc1249650247b +997ac293722a8b98f7e819f8e6c2d4c5bd1103b82d489d8b8aabeb905e95450b9b75bd61442cf68cc957212ec1c55617 +9895a3de62395c33509b153b7820bd94fd2b011f0cac135fcf916482f1eda272ecc79f83a61837e99c3a3c4ab2c5c2a2 +98c2ece4d49a64ec8e06407a0585081003bcef88af35210e22eab91169f8f0c044d611494b755e5bd915804b1d857747 +8bc6dd083b36d076ddf0e0bb1bb87cfd059283ddabb3886f02eb7e27f1f0539b2819527b56b5c13436523c4603ac1d12 +85ab8b7a696333c82dd5e179e12b2e127e67d911de609ff9a03cab95cbeedb1f364aa1f2b5e59353e4ba0d177f996151 +a9478e214afa68c395aa2c7daf8ba1627feb71ad6d8bc7339734cdcdd5a42838e032736c28e6251c808d5a4875ef0d06 +8c53f62cf06a35321c8af3871ee4459768d0745ebf48942b9f464206309f42fc7b2c50f196ae1e43b664f0e2e718a23a +8ba80662f6642d8866e832ec8082a4204ebc993fc304c4b794666856de0407620131a18dc053597bb40a3de0bf8aca22 +8c8fac6b911785d1561a985580c03fb2ebc613ae33e486a92638aa7d4493374118d9a6d9d99121e29c68c3d67ee4e3f3 +90f2c793eee07ad90157040b30558bb3b0164e8ddf856389d6742cf5bd1c712e4c6a8e5678da70a8e9e242ec7864117e +954abed8f6d58896b7f6438c9780236c1c83b02d60a29fa7361559e619e5bc9d67b3646ee39ffafe2b3019bb3357fb50 +b79874f757a33085e1e751544de8fe3afbea92e0234f9c00254c2b36115a16ee46f085f22aa66e0c9177e5106f51b03b +aa148b287cf4f60c64f774282b421aae075f0eaa93a45aab4927750f47e2ef0b811d1846bbb15eeb2f293c80a7612e83 +a588d8825e7b0168d45499dcff6faf0dfe1ba4f090fdc7c06d50344960c0121f10ad109b0b9d13b06ef22de5a04eef87 +8f61ec93d14ebfa9c31731f9ef0fb8907505fedc79378e9a3f65c27bed4d74b41e129c97672ce5f567d897befbceec8c +a008218633f1da10efd01c155f7ed739faec902da6dc48e9f19ccbc8d32bb318d71806285cf2003de2c907bbdd4f8b22 +88ad82c66f7085632d7e348d69da84200c53594553acf5432b50dd1e87f410c802dfea91be3cf804e3117ce13103f23e +8498dba17de0318af227a3f9ed86df37a5c33f9a538be9823f8dce4efc3579e8296cb3b7200cee7c5e0bfd9da23a4b69 +b3c0342231dffe4c9bc7d9265597bc8cc4a82e2980ac6d1407108db5b00349dc91d5116fab51cf2802d58f05f653861d +b3f2730455f9bf5a058598bc60f47740117ba51f6a767e1134516a4e42338b513f377027acf8825da5c4d047a62984fd +816360914fbc9d8b865157bfab07aeb7b90bb5a7c5cd64847b1c3184a52266cd3f8f8f3ef99309ba2edc4622304bacc0 +8fd21b2315b44a52d60b39ebc45970a47b9495f42b88217ae057bebcd3ea0e2476c0c3d13de7f72016ae12ae966a008d +b62014485bc217a0fe892ef1aef0e59604ad5a868face7a93f77a70ba3d7413443fbe7a44552a784d8eae1acb1d1c52b +a905822507e431b35f56724f6c8d2e93b0607ed7a4533073a99cce2b7c1c35367382447073a53036dfdb0d04978ccf2a +81672e39c2b31845142963351de3d9cd04c67c806fdfe77467867463dbbd8a9b0e2400ccc55016e57cbedb02d83a0544 +90919c970ec668de8ec48a2a73bb75cb94f0f8380c79a7909fd8084df61ecd631476ddd474b27103c6817c8f3f260db9 +8fbe37dfb04bf1d3029f8070fd988fc5e4b585e61eab6a8b66caf0ffef979d3ed6a662cd99468ce98ec802e985da5fad +950939aabb90b57a3d667f9820880eb0c4fee5c27fe211ce8ecd34663c21b5543c810b3676111d079ac98644c75ee0ae +b06201ec3c3cfdaf864a66af128effee8ec42d25f1e173c1edf9207979fa52c871757000c591d71a9b6cde40f5001a06 +a79054e8febd0450c96ac7a5fd6bf419c4b17a5926f3bc23a8616f0cfbc2849d97470174cd1baa7c739b12615334b6b7 +81c7391b2a1844ed26a84f054b5f03865b442b7a8d614cd44805b5705fe6a356ac182b66a3c8d415132e389efac5f6b2 +825af1563d0fe53925ec9ac0df65d8211b333474e59359bf1bde8861eecd03f2ac74534d34b7e61031227c2fa7a74e1e +b60dd9bf036f1825295cd2014ef1f6d520cf729b4d6cee0b42cb871b60ae539b27c83aa3f96ee3d490ec27ce7e915115 +89ca43d5b7f3622b42df7887572297a7f52d5204d85e2e1ac6e5d7aa7f8aaea5e3a07280477d910db025d17cd2e7373b +b93a2bc9b1b597f0e514fde76ce5bfb6e61eee39cbf1971ea6db38c3ecb055e7913ec8cd07fb0b0ffae3ca345883101c +8d45546bc30266b20c6c59fc4339eb633155aa58f115a8f976d13789eaae20a95b064fedead247c46665cc13ba856663 +aa8eacfe00e8a4d9815de3f7619d9c420629ada6489933ca66a571bf6c044d08b391e0d9eec7d1cbebe8def1e7523f1e +b32fefc59a0d0319ccb1946b351ed70445d78d9fbb536fa710d3162b9659f10288f12d82b32ecc026d55f16cbad55441 +99c7c45c34044c056b24e8f57123ba5e2c2c039e9f038a66899362840cffe021733e078866a8708504cdc35816cb335d +80def162c134540d5ec071b25ccc3eef4efe158be453af41a310b7916c49ec0ce06bb43dfee96b6d77339e11587de448 +b5f2fa4f68f6a26bcb70d8eab62ad73509c08ee7aa622a14b3d16973ffff508ce6f1aff9ced77b8dcfef7319245cf2de +b4d0436019e779c789464716e1741c189e8945dab7f3072720bd9aa89882fa5b085a1755c48da21541f3cd70a41b0a71 +931e798ef672e1472f4f84c727a101e70d77b3a9f0c0803a5220958d6bbeb8aeeb56c769ab472a3d6451249a13a3f56e +918c10a84de268aa8f1ba24b38fe55ff907be07b1e86b4a4adbf305c0d705c1cf5f65ce99e03e11676cedc89f1a4f331 +8e55a8413b823715ccd92daee357cedd797e69a0e78b6fcdacb7318646b9903dfe05e5501f47b3c52e74055b9eb619a4 +8b329bb63e6c985d7d072dff4680b3f8b1217ed20543277386bd30ec25240d9dc378837dcd5cf4fd9548658635f4c537 +8c2be5386052b22986b33dbc63c5afacb6d0095495564ba4aa28fc8c880a3c78242fb083248d788ed928deb1e30a82c2 +83a2b7bdfcbd25d6b059f27218e009ecb5ecc4da68ead885e00216411d8222062ca42f21c4d9cfa19c31522080af677b +9620334d2633e85646b2e2fc48dc6c3f09c64ef1706ed78a3bb6ce1f6b274a727364df71e97531dfdcb392f70f27f536 +b6c84970ec04545121ec3b79376f4e45053c97e8bf2b11922cc2490a429c38735466097ecb81cc9d9692c74d2fb8abc8 +8e55d707dcf265c5ae29a32c27ce66f200fddb724faa5bbf145ef42280ef645fa2f0cc3cfe2db8599b26c83b91e077df +b910b96b763966402bbebd68a32c15a225ec21e1357fa298478c5981a4310e556103fef0c73bd8903e11c4ed2c065647 +a8fd933a0e9fe8c459809bd93b8ce153e2af55df94b61a1490736b19c89469954da8b72dbd072d798fc06fc3d7a3d60a +811b279c113828e114fd82c2070caa7eb089a46c8cabf865f9c77354a77ebebe0c4c6400dda0e66dd017cfc44d76851d +8ed03e91c331afb3ad6e42767e1b3e8d3a35fb831805ff1b5fd3e91878e04027ff5af1165a3ac295f1578faf2c83b581 +95bf53683d64a0621bf1ca6ee17446783f6c535b7a54d6ea57723487a215759a54f886597a55dfdd560424e368ab2759 +a9bea378768fb1d7ba365a16531c51fc1975f1c73caf2a0891da28509805fa84e2a8db7c6ccfbc620e9002317abf174c +b8308250891015deaf851c4e5a4cf4704d104f94064418488d7e3076d49f36240dcf6fdcf83f45fe8a1d97fb02e3db59 +adcda6b63da21f4074f142f8e7f3a2274f624c733e3a4001054a1809711529c61356aa087f73aed877a58ccb41d38d12 +b80e7869239ae26d1da2e6683f064d1dc93cf4a2b66e9439b3ad9b25324e969bf98014760d29e6b8de7ff152ef498d0f +8e9bf968911df3bb5e3a7655e9d8143e91ee87f14464d7ba9c86e1e31b03ab31b91eda121281b79cd974d9ed2657e33e +9007277e8335a43e6bc3c2f5f98c0ba7024a679b7156aeefe964f1a962e5ac82154ac39d1ffbad85a8f2440f3c1e354b +9422b9d670e997b7c919a429499f38e863c69c6a4d2bb28d85e36ae0895c620f68b71e39eba785e3d39a45be91507757 +926094e01132938000d82dd9a571fef5ef104cd25b4015a25e3442af0329e585aaad5472f0e7a69899ba2d6f734b40aa +95552d8057f7e32c24d69e4d6c51c98403f198a20c5be8826254d19cab2f84d5758e2220cea7e38b7c8a7a23178fd564 +8abcf8dcc8488bcc9ab23c51b9e7a0d91dfc7bebe88b7ed370ee68eceba643e939c5eae66a4aa5fe85120751780e351c +a91bf8198f029e6a4cf6f0cc39b629e9aeff1c77b8739e1d5c73d8c1d3fb5c8f6f23e27b435bf10b5b4ec1cf6a7249ed +b932d87ee3a4b81341511f90fe5aa36c571e8b914f25abcc33dd40ca67a3f6444fe9362c1434744e4af18d6e045c54a3 +a8e960c2be9b1d805d387b3ebe2134d421a65f1fd4c1b4cccdce78f9926f139eea78e3afb449b3d6dd19b5d16ace48fe +a7e2f57cce509fe66707eaba9b4c042c1be93fd6034a9b51d1d30c45c4363eac79d54663d525c9873ab0eec0b1cc4ed3 +aa162a31c2078f4b080199debf24494a8dfdfb9d8fc85b198a861b12a629c73128c55a883e4c2de3dfed6e0e1b83eeab +b5a4d075433eaf4115717a84b4dc37f843d44bba0bf820c92ecdedd5afb61be60f7708c8a151a678d9d5c0ae531bffb7 +b56ab96f7a463c0079e05dc766f3a6a31cae5c5044947734ebe0a26e01367c6763cc8de6c2ee2f3b8218f05bef217474 +b60792ac506b901065a8bc0180a86e028fe34b62ceae1ad640c759538ebf3a2ad9c8c927d662deed6f489ff3ff7813c4 +8c8c2cdf075504d12d441a58542e1f8e4bdf92b3ee4775e836b2734c5ec1e3df919b931386417d04489a1dca806c87d2 +8ed78e91e5c4a68894cefc2f7fa71f02e5e12d40f1bb74332139bc7be4d92c24e07d5ece0e82150ed474aa1337af4c18 +87119c22ff8aa31150bde537d863cad661cc5159b12f084cc319224c533f0deb28526ed8568d00a1441e7d8bb4f05673 +83a60ba5a9cccf22cebadf7318b706c9f29abd25db0e2fc1c802965351b53cbf316df72ee3e9b2d3ae7f3c4494cfdff1 +b73b6a9fdd3e7463fbdaabc9a885b7c82201ad867d1bced1c2484300a01cbbb3f1e21afa95d4c7cbb6cb983416b63b90 +b1d89ad16981ff9217708090d4017662d8838f21f3a3296cffe14590b533905fa06a20e40dd497bd291fa4dfd1bfc511 +8abde560083e071a402e3c7bf31930f537f67d2a7bbc734a7480b1b760aa712ebd1cbcb65b00e11e384e980222fe14a9 +89c731d8f31afea8bdc9c32527bdca257f2a840764d40f6e49403b8e75ae51017d505ea4fff91bf28b6f3a1bc65b8bbc +80e9ac8e077e86ad050ee73dfce268a69564ff1b8419e9c236d981fe7a5f0c2bc756e8603ec604b3b9e36da8fe10a49c +b4f1eea0f304898b1323c6382732e6f40e556bfc68af9ce73f6d54e92f5f23cc4f78eb3f43d578d81e7627fb40f092b3 +a0e3a8d1348f8f153e08ac4839232d75d1d6e81b5de184ec4724f8213baf98d3fe739a96f6b39d79a053b628c3a09981 +a6915ba0b52ffe4a381bbb8ff3791d9d3b848bf89b3bacbb2a7d2e5ae21f1353cdc304b3cb6e82416f7e604035c27d7e +b2c4c9cdfdd2fc9a340ba3ade9423344b9f429e8c7e20a8abbf26400376e312f3ae35d1c456be99dfb5c02fc8a36cbfa +9657d57ca0641825a0aa5687f3f87659d893f33aee819bafa5b1ca1db554811c1c844f971e278606e3a2f096defdc67c +a4ad24d0a557704ada24d8e27a15604bca28679e260b2c69ccc8e6cae5499866724b700605a90df7dfb35130756939b9 +b18d9ea6682f73a1f99a9a4fc98c38fcda02c1a18e8c5fc080cf935a2ac877dc5223fca273dcde190b906178d0fd05bc +8ea5fefad0799c885f50ff10d94bd0af5b99b0a446cd1f367ae5ff529cc47e09f3018115f3c0ccac2fa05bb65b84945e +92450d52e6c7d13ebfcdf5674d6761bbae2fc5aabc865d35d031b588c383e0a64cf69a73dc93948632e2b98f74a5ed86 +a356f171a98df4ec5a96d556eaccc6ad34b4238aafcf0e94ece27cdbb491749fc9692e78b84dfe80bdef2914079d34b5 +b918703a4d3507d266414712ba8eb7ad17da07cc5f952b5c62ef130cc6ed1ae3bf01237fc8848c179725bdddd465b301 +ad2b0554570bfc9d97510cf59bc38e10ca54a93649c30ac9919bd0255e43bf525ab11b74f78a51ac0973cd0c5a5dcb54 +a7ecaf4b631d179d32ac1632390d95196a0035e00da6c0e6e13b5c09ae44b15ae6c21538b5a31b73bc5f650ecd979b59 +a37704eb4d728df2a367e59fcb6c26023136230e37f3b8a2f3ceeb1467f5cd30186fc0116f98b64a8146fd2c5903e8d9 +b09373ce92314678299ae10ec1f93c702911beb4115c6b5ba6efbcab9c7afb599f59793912df70a98868bce6545a33dd +b52a878a1393094fd2b93f2d1eccabf2830ab10800ba4cc24dcc7849cd0978733263aef2fcb766a7cb575a7a99383db8 +8dac097e006fda4fb9d6d7ae52adabd9448ebc8d5bd5b38ac0c4ed38ceb510763174f7adfb0b473c38e52147ccab4239 +86b19c41efb949937d74a7875549ee5e997f9fdac7f7198085afda233cf74341a38d0ca3767c76cd35f875b89a35f78c +99f0d927e5ad25cd134f1c70b72631cc6b5cb4ddb86c0642b900464e33d971213a5239dddaf71f7a42f2d6d02a12dcc6 +8355c38806c335d747d4e97f0083fb96585677da18b409a85175ec35dc3f74671817b34203eb18c2f729717ce083ede8 +abb3603adb061a036eae0afa5f23d79c3b62442e0e3bcdeef896f88995585c1105cd3065410368456a4d36b5b0485a83 +9051c5c0011784885187d04749f774b9b4f6bc594b0e4e18226de79dedc4d7aefa3529c3d2c728e180f96f3e204d578b +91888213e7d321d0bfac884edbd5cb756b280753bb5f8bc6acfc208f525757beca24bdf86fc68d3d8736ef176a960b49 +91258bd7ce6e3b7516fe2f5391a368d826da299e0e99b1f82eaa44b62b110ab696adc92debab8ba098a52f38dfb3c5d8 +96e3907340dffa9da3602d3b94bacff7e1bb8649edd3b9bbd06e1bc6781e78f91ababab12c0b9be7c66dfedc7001b66e +9513555688fcfb12ba63952ab36a67b36affdd71f7b843e8eb99ccbd45421698024608233efbdc905eaeb26b334b33af +9913ca9bcf11eeb408da02e4317c5ca0010fb2f4490b282ddb758001c08b438c3b35351a8cbe10b7fffc1293ccd22d4b +85dc2471860ebca88e5a2766161fdd77f926d2a34825d1134a30418f91a741759668e32fd1e37c415d07ab5824338e8a +8b128917e828a0b5eb6fa8ed72b52fae2dfaf74febee69a2e2f87e8df702f0c5bc0fb620c8d1d2a07f35a15ec9c0f5a8 +964c39e7840c130b01bb481ae7bfc92682b0f124c9c383f9dbf3027f2249151925f4faf36905af476a54778d69da3f48 +80671ece658cf850e522d46d25678f934ce6df043f25f8707235125765d40c2eaaf39eda6092f75039b22cb58bf2c29d +ad4bb0e79fdaa340b1347a46b0f64e801c72a89770dda0a6e4bfd35f2df5146fce9934e4baecb1c2671077c771eb8089 +80b3bd3adc6cf198fcd997f8867d2839a2eb28f57390352ec423b8a14cc1f2ab21c6e286505d6a21fb134dcd8d8f11cf +a26d46a6b8a75748895a1d599e7fd120d896340e79813167a400b2fe463452532a4cab419074663fe1d29fa716b76a33 +82b1f3a8a1df29207d7ff020809113ab06080a7f0c631f76ad33f47cdfb6a567143144df97b4ed7f676d929195b04bba +ad96633a3744648ff0a2e4491e8219c9c6ba6e655cb058c36320a8f72cd5f72c00bddf97083d07650ea9ddc005fc1ff4 +91d0783788626c91662359dc3ff36a8bcc6831e3f4114f85c99910256b1d8f88a8612f53c7c417d55581dea486f38926 +84edd9e87ff3d193ebb25f43474c33fe502a1e2100fd3f93fda6520f5e42214cc12e9f8045f99aa2423a0ee35e671854 +b55e06a4b1fc3ff9a5520e0b7c8b5ac11b28385cce78d91ce93b82f1bd7f7afdd4195d0c13a76e80d0ed5a4f12325fa7 +b0b15c7ddede2b81d9c835ecaa887650622e75d0d85f81b8bbec7ef24e9a31a9c9e3de1f382d8c76d878d1b01373f6c8 +b1adb47c20f29784116b80f3670182d01b17612d5d91bd6502b0dcecdcf072541f582aafc5e7dd9a765cad52151684f4 +8efd1018df9c9e9814a9c48f68c168551b999914a6719229f0c5bf0f20a288a2f5ba4a48ba966c5bffb0fbd346a4fcc6 +b34ea2bd3269a4ddb2fbf2514401d2712fc46c22642f3557e3b9c7acbce9b454dcf789573ede9aa14f39605fdd03f8c4 +a9e1428ce24eacfc460aec2e787c053327ba612f50d93510d58b2cb0f13291ca3d16358325ab3e86693fe686e4f526f7 +91eac7361af4c66f725c153da665a3c55aca9ae73ead84ca2662cf736fe6a348a301be1954723206dda4a2120202954b +a6f02db89739c686407825fa7e84000ceedb9bd943e8a0908fef6f0d35dbc33c336072ba65e33e15ecfcd5714d01c2f0 +a25666faa12e843a80365c0fef7d328a480c6e3cb7f224763c11d8cbabd0e7e91a5b647585ee905cc036afca14842bae +b4348576439cd2e48c01cb9cded7cc4a0ea364ab936dd679ddc7d58b48807e7fab070f2f1ea88595b11af4500849026a +a8c6c731e0d0464ef7e4fc1b049065eb4ce100c01e1a376365c636a0b23851022bf55805963bc15eb57434a837e81167 +b0952937b154e3a4c206f96cd96c76ba37624956b0e4d43470bdd97b4af878326b589e3eaee82fc192437123096799a2 +97d07ec31ecc9923192e48d37df2cf08750050fb452dcfbdb350fbc43e146bae3590c5b732b31ebfa1ce5d884ad5ad57 +a69359aebbfe4cbc4d39d178150039fbf284cbc0edc68a6bd635ee3a1c76569a4a575c907fff691b2a4d82a384c2945f +b321c2c0f6b5902ee9056cce7404d858da9a573d27348c1a6bfea29b2746f2aee7abcb6192504e5a583b0caeaba117d7 +a74e738aa6eb4eea58855ae6f422af22812fb388c83aacca5bd5fa4a88d4c01463174a229aea2830c348dd9ab9307854 +94306a3b106bc1644346bc45c05cdc8287811d5c86cad691bde0c65d6a686eb9c0ce79ad91baa4547e5d058ae8bf7310 +b64140fd77a07633e4ca8d60786452311dcdb8ce7095ba51dad8486f57c3bf4e69bced92603f71da992a48ad817ab275 +affe7f4310f1dc68e5e3cd640bedf864f51bfb46bb752063bfc18e95930021f784e509261ff9c560f53000c361b142d1 +b0d2fee222c6f963ba3385547f921a48964da031d737892604f8f2677d4905dbf615046db57eae6c6dd756709ae6932a +81700c66aad7c2e51168e028b0fe086dea75d3b17d93a4dc1f47a6a0f025df0bae1c8c997901837ad859a84197e7bb00 +aa4ac5fdd602f8b79cace18690e67bad557a93d00c0e295074185e8c6b4059a65495d9971685de2fc01d2171ac8b706a +a8becb3a64fdf35d65d2857898dcf8053b5057a73ab8c5bb5324af1a8015cff47efb85dc3eae7364cd5c850b7962bedf +b72ea09bd0b72f8cde3466f359ea69b194ede93dced534efba1b9ebc6f3bd53942fe2965e992e82edb6050cac4ed88dd +85bb8dd7eef023a251fb6f220af54687747f4c91983ff728163c4618ffac40ee6edc29a0aa6d455276bbe017f63757c2 +85a485254a11b4c4a943d9ec509c0dd1cbfc0ff5273a00cf5c9f0babec973efb15348e5d9451b548293d778e3a2b62a5 +b109f3ac809391e772b589c196b013db69a9b2b10ac3898feb70b986973731f30722b573cd0c9324158ec20416825385 +8a4eb579a840d438bed008644f373ea9ba2f28470d50cf1d70af38ba0e17326c948527b1719dd1bd9ac656ebd5aedd10 +a52e9d66ead5ee1e02ce6108e4ded790d8ec83164a0fa275ab1f89a32200726c8e988d66df131df9e62dd80203c13dce +b541cee9febf15d252475507e11d65c4b7819c26cf6d90352f5e8a8f5c63e254eddf22df0c35a7be5b244233e8e4ee5e +8153c297772adf4603c39349142f98cc15baeccaeae10c3230ee87d62255f6814d88d6ed208c368d2c02332426589748 +970dc9782f1828474e9fab7dcdec19aa106725465a5844caed948eef5c9e48199c1b6bc1a637ed7864116927e84bc65a +a975a920624967f4ecc77ea5d9869c434caa64c330024194615a8d0640c5d4d4fb139ea11a0c73a5c6ae6dd3fbf0ab5d +811f0f9e0c12acfb4b9dca359eaef3bed18083bad96188befc036ad3143b121fff4777ca6dc70a835bbc4921bd25f5ff +82341c6ebdb97c8b72910da95c7eebccd1308b6a92999886aab552f0642882d5c7cc60931577d200efd6066530c998dd +860f7162c2f5fd1c0953c6ce75bd8c52eaa48032b914410681b8cc05e00b64130d1f96ec5a52df66a04c78a9f9f42981 +8a578e674875571fe1a0459843495a5ee1d9fb6cd684b244feb9488f999a46f43363938cd0542879ea18ed14fba10a6e +8df217aba4da6781f0f5139aced472025523ed6e17e504511c04b677ca8197488e237d8bb5dff7b6b3898cd5a6393dd5 +b2c9230ad35d7b471d3aee6f771517cf3145ad26200bd6fe9c7cf28120e2945fed402e212d2330a692f97bb9ac4dcf12 +b78b89e29e8b782603b222cc8724eeb83b2d9d56bc02f59a3c899ab76429dc721358b07dcdaf422f59520b7e7ab4fb55 +82682a5617843c4ac8d4efb4c3ce715c76c1da2c3bab1ede387db503f3489c1bfdfc07d9231d96f955df84fd225bc81b +b0f53725cc610e78b8e8a4e6823a2ffe44dd15a9a5bc8151ab7a3787ddd97e1d7f2f0e6efd2876e5f96417157143e3bf +92c5a93233085e2b244519078770c7192af62f3562113abc8902f9d72591eacf52bd15ce78653ab9170d5067606287f8 +a43ef97dcd9b6ad288846bf31fccf78df72f94bc7ad768baf5bf0d5dfa27bd74ffcc6b6c6ed1d1f09e09be3afa5eaedf +817d43bd684a261fb30f709f7926cc4e1a31fd3a1a5e7e53ba4d664856827b340d7867e23d55617ab3514c8a26a7040d +a599e22d3286b32fafaaf79bd5b0c5b72f6bf266ec68948478f055391336d756b58f9afea0167b961fd94234989f0f02 +b70db7d8e8356df2e2070f8d658e560081442f3f3b95e20f4bf30106835d76161101163659d5d12cc0f335fb042dc66e +b8f725b70c957aa3cd6b4bef0d9647393f7c9e0b7343e92439372f0e9aa3ceddd0cb9c30be331742b87c53f2eb030593 +b2fb5e7762f26036e7e966f4454f886758804d1f4c2da17f3d13b0b67ca337f1fd89fd3cc798b07da6e05e8582c9537b +a377f944dccc300921e238ed67989872338137fe57f04cb5a913c787842e08b8a1adcfb4d2200abdc911fc1c766a7092 +b82e98a606071c2a33f2ad44e7ace6d9471d5434500de8307b5d4e0083e3a5cbc67f0609ca8055f0ea0ee7501b9ed916 +8e58f9a04d33a41ace4944615041662dc35057e645f63e127cf0d70f96ac307d33a62ce98f164d6eed8536c1a747dcbe +b5b11388071ffbf57ac47fc195736613b964ebb91cc8e2c17b32646f91d64ea506282b881897fca96c317364d3290de2 +a40ee9b7551133856cfb3904837f9949a9558e59a418898affb78adf1500fd6ef6328fc4422161909aea2c79ad08c14b +81f9eb4ef28aacdb43e11dfc9aa92ba990be4d3c14b484fa677edad3a3fbfeaa859a7f9322b5e95818240d7326215abf +84939b2b6bc859437d1a7a8d6ec9a357c6b716c4b4cc22abc274af872655940cfc72c99f5d0283d90e05191fcdb1c232 +b78a5b74a90a805410b6225fb9576d6d73752520f25cc3fd1edf8ea9f6559d3080f9acaa2246809b6a66879cd2ae446b +8d0a92baa88bf38dce5385ccf15d345b28e2e5d0a2d469e689353d80eaed8e8408933816d70ad752f226c59a0d5b5f0c +a7e15f8a8c1655b7b346c9488cff278c793505379b781b31b273b4bf09b3bdfca1c8ab2334746075d636b2e05859f215 +b70daf14f2adce03c7b92d6aa181f0c507a80a37493d8dd12419d5ed5f943a98099fefb46ac827d6e4efb9b8233c99d6 +8c2480814661744d116fba7355bc6b1914975e44cf0e976d50b6a20092bb1c636b7b44ed3fe8d63b5555ffc89fa759d6 +a6059528a4fed36abb74ab992b22a4f9bf1d05c5de2bfe6837b9af1adfed98bc37ed7481b5a99675d432743021fcfdb3 +b7e19f1b25bc159e5a769811e773c3a8ffe8be8ac77ed0b711540915e5c6e7bafdb407cf9b85c551f67fd621ce8142a5 +a2f66d4f7d16ed3e7ef5fc90b42676c61a98ff18bd26ccce91de03b6a0130c1db17a6bc57be135e410a76d2255b15813 +a139c916927dc3d3fb83598da9217ca64f0ae127215332e9a7ed82be923b89a801c44580d5617297175f9dafb1c4eaf3 +af08e1e1b04ec95366a12d99c80a9a9ac40ac984a575dd0230cdf4eb346a7686da55ef0a276f3356f814af31f9cbf1aa +98840aefe287369221c0721cd7c1b15b1d670c3cbbfda191cdb5434bcad757e59c30ec82b2d8c75947405888d44da435 +b7c61c8d42daf2e278a12d8f6eed76090b71c82275f8b33504aba75d95103840e8acd083e97a5a5aa79897876a68940d +a0264048d2a2061d32eee4f661957ff351e78436bf49ef973c059612874ce9c91970869d011dc13a5b7c754476880a68 +897199a4d8db8aa2db5d9be3d4f4312e41fa0739eb06c62e2e046c4b9be829a447e5d47227e2d96195d3b7b66eb59da6 +b512a9082881f5dc90b02f8bc4f38b133348c2e933813852f6a8e7d8c270c9ce68a5524af7d1d3123e53b2d02a53d465 +80b332469254a96f53c95ec79bb5a8bb1c387d40e58b73d72f84384c696ba0d3c81d6ac90be2979c364c44294e90432e +ab680c2e547ea5cbf95bf813020beb461d50ee4341dea944eb48f6a8584d35682d20186e3b190b849a1ba25625a7f499 +9070581993a0531d6be372d370c2e4ab2ee53f30e04a75ae61ea0fc2c320914506c4d2d4b4487c1f8fa88356fc45c895 +8424303dad6b4051ab633ad27ee51783b2ead61c5a6dae1eb3ed72fc1f36e2a9b1f315504a4bd90f9664091f2f403d4c +82225611eee626556553b9316dab4043aff241a81826a33aebd9864a91e299b765ba1fb43eea2c2047e6b75b6d7fe3de +8a3fb221c616ad55c352dd5e0c09ee892022013d6965aef40d4f277a42e9fa01226fe973cb99aaf6ffe4f4f348fb54d1 +b07c07679aa51713e8a7d7bc304dc15ed5664b66bd371877023f3b110b3927e09e259ef22895c4001421a69c6c013cc6 +83556c76bdac0dd8db6da231b863c335be076e7299802eebc259e0818c369f933a4a4b18e2df8ca07e82f60767b462e0 +a516f659b7915d2f7cd0f0f5ea2491b15f0c84dcb191e7671b28adf7cf14a56d42cfc0da94b3c269b45c535f6eeded49 +80d7cc6f26066f753041b17ff1bd27f6d4b5603a43729d33d596e21a67356db84ca9710158089def425f6afaf3207f9e +b802a47f9009dbd48851209ea1e2739020e717f0ae80671d9f97a0e43de923273f66b7fcc136a064c8467372a5b02d28 +ac92fec1864a8a911633f377df87aab56713876316d48240fefeee49ab97f7406c22e70f4938b5912c5c4e766146b7a5 +89224225b9835d04428b0a74edbff53dee2be285ddd1e5a3a8c37307c0500578155f0c4052e4bc8be04c56862fac099d +b1d3c8492fbf22ea60732745edd3b0163ba5a20d1a3315e3773f2540ee38cf308d42ec72cbb3e3dcea457d1d132c3904 +8bd00e38ec30ee6c44a0e5b222f1f737c9ed2a4bb9225f1741d6334df966318c8a0fd2fbb109557fe8c9479694b8d8dc +a930ce5454efc0b247dc148aff869963fc5c240241d5590415cbd36634801a04d3873d93635911bb9c0c42ecb005cc63 +b83d4f80e9e0fa47b42175df74935ba8aad2e559b80e84478ab1685bc3eb65d51b93e5738d5ca968cc055ca0c552a03c +b3ae21258f98051f13af3878b8103bc541fe6f20b1c3f8fb4689ddb8800b3c25cca9b55f0a4104bdf15dc4d5844abb8c +831ef8684c1cd446c58c59d0152aeade5cc305bca6aa296b92162615f052ba280fe289edd62fda6d9f0667c186445f52 +97bf9659b14f133885916733b7d4ac7e215495953caba970fa259f7bf6b79e661090ec8d79e1c9ce8dfb17e8552f93af +84d5a89cc2332baaaf3d19627a65f4b107f8dd9228a1434b327732f59883bb54fb8ce60d6acd026ed4b0e94e545d1c33 +8e66cb743f95ca5486400b0d89d02e20b98044be1e3a12983ff9fe086179e5a0ebf4dcd5098703191552e9aa660a6de5 +87b4cfb35bacec805f8148786788db84eb8f4bcecdd0570ecb592c705450ce1a90b6d183d37ef58780ede3995be67497 +a72a4fece5478011973afa543f6d8a8ea06a64b241cf7d8bd81fa3740ac2a4cf10e5120abcc1c1101f94da89507a40ca +89dc6001a96adcd2679916f43dd19ea00508c8d5dd6b0090eab7982fd2f3571b62f3029588a0649e73f49124525407ea +8ca75edf1259599e873530eff6151c822a4018e71a340534219ef8641cb6683215891df41d4e3c0ca2560e57a7aa913e +9282d32f868e5ee6f7fc229dda5b94b603476de30cec0a44a30edf396b52dc0ebd472b8f726d4b67d76179fecc1666a1 +afa24704223707db89690bcf9761f07a093f6009ca9fc945e0a8801fc29f9f51292bf95243e466fe736088af36c55ca6 +b51332508ddd9a2610edd2b0ad120272ca342e96c28baae37a2c4f07e689303a46c237712d07e446b1d67c75aa8ce32f +9219249f3799dfa4eb4770ee323f821e559e7406bb11b1f1889286221b22c8b40ccacbd9ac50ea3fa9ed754860bc24f0 +993515270c128ede64fe6f06755259105d0ec74947b7eb05924a375fa5c6d14822f3d7d41dd04fa5df8aa2aa205a1dec +a83be4c2511bae430034ab15b194ac719d7b7041f9c0e321317f513a97db39e97b9ee1df92a1962f265b7a3e98cdd753 +8ac7feaecd26f7b99fda3ed0b8a08bd6dd33ed5ba687c913ec0ffc64bbbefcda6f265072add4d944f2005634601ce68b +b4e3ac6b09299db9e1a469f3a0b2d8d724ee47a417a517bebc4c2ac3efc5cde086b57b9aa4efccdef2bcf8f456d973f6 +9262a24a84fb7b2a84d700f98dcf3fefab8b47293778c20bfc356860cb84e0bf102bae9facd9986d92d1762e0a955836 +97be2041c42bd25e5eb519279163b0857f8bef627492c27b1182f8bf0033769246be5886422cbd2409c08a2615352465 +b0b87d059a00e3effa2e5e4925da913b245785f2932ac3ed364ad19a064d3561b8aa6afea22c951316074f0df179af36 +891644b7b3321b06a2a40cd96c2b8b29d81cde5b48546483fdda439000982a9cbf1f6333fb6c089d39da6492cdfaefe9 +8da9149b7f4783a24240b7b9c7e6df4abf8d699d3834e31ee591489bf4744141ab199c173db64397c1f9bd5f9c862ca1 +8ad7f9fb2742654aa2964fd468e7645436cefd1308b064fd63fdf0d3adb4caf6cfe5426354f6cc284f208b03d6b2d918 +8435e4668f7aeb027100d21e4e0b6ee22b401d21966a3736b95610de86c7e2f2c9ee5d0f901353675eee5ff458dad69e +9010895f045538bd11b47bb8996f27198c8d6cffd3220569e6b7407f68f35c47d1efdbcecbf9b5e241c3c2879a4f6936 +92a9aa443b5ee7bf13b6f43f2d8d8db7f6f33fd4073a606ec5772421a55f464831419726130dd97829a7d4bfeb1ab078 +843f3266560be6dcbe0258c3c7d7e332330e10630c069892954290288eda301e247f479505a8a1bf7e59c99ccafd104f +915bd1dad808f8a568725bd243f80b5476a2999d0ef60ea3ef6e754155bc4121b2b879d01570725b510c5a3f09cd83ef +97250d781815b1825be192714884630e9f564b9bd737d55b8ac79ab48d0fb3ca53bd21ead7b2fa82a05f24083f25645d +81e2d52333391ff2faab39611689a62d6ead77039e8703f4e012d53eea17a4d46f2e3342e44b6edbe73a542b461bda45 +89c9f9fd5f638156b018831c1bb70c91215f4a2f5a73c84b1208bdf6ad652a55df7213336ce12bd910a0e1a726474f95 +92bd02984d090ea7e2f3eb7d36d1e7b9d731b6b047e3cdd4af7cc4ee177415fea7a145205e484b366d84191f06af85c9 +85a86fc61d5d916ccbb219db52953e1495230aaaca63237e9165276405f07ad9644e253ae394f1ccdd231944e7143313 +a2ca5b3fbc9f3530f88c0ed7071ec3d89b272174c366eedb5d15d2b648c65d23c0faa4e92c776357e7c6883a0084d03c +ad171f5badcc99c8ffc9d8b707d792046f86cd0aa478e0e2fbb32fe095f96cd134ca548d1f7713057694dc6b26465315 +96bd15d57da9980870fbadc98c68db76824407dff2700c45b859bb70d98374d4a4ba99e3ed0b0c17f480fe08f16c6b8a +8300bac69ca088c3ff35749b437215e9e35a16393e9dc094f520516ba57a485def7029d30adfc72bca36eeb285c19301 +8a09e20be64f346668fcc7b07fee9c0ea8094c935cbf4f3a4cdbb613d4b936c1edb9256b7c884efb72393d97c0da00e1 +b1f85827ee6f041f93ab174d847a55710824fa131c9ade9561168c3962a25c617475ebc4105eba6e738961a754442bc8 +a131558f92e215969f41b6a57d1e2f424149eea531723821dd4cf8c54325cbe66b002de2c8287de6b41ab4b5c35f060a +81ba492b8956f73557f361a856c6c884ebb300d828287d5699e22e0cfa75c8e77a61616551d0be5178263898c461d6f7 +b2608f44d3c22fac8e13cb59e4ade8b9a98c4eb1ec0959ea400c97eb937ae3f66837e91917057148befade8389af2f6a +a6ff0323b5a18a4becb2cc6b376086b47cb2baffbfd1b0f2229ef2286fb4a34c5cd83a5faed5def7bbad519fcab8a856 +857d879cb9eff22501d883071382832730704bfcc5cd5b07cdce7ab8dc41c565a1eb0e7e4befce8e0e03a4975d3f11ef +a2879a20c0360c516811c490289be7dfbf7dbd41d2f172c9239f99e3d091957e0446854f9d0f753d90384a80feb6fa56 +83518624f33f19f87096a47d7b8e5f2d019b927e935a9021823fac6564c4f2328dcb172e25bb052748191e75ac682bd0 +817ec79132faa4e2950665712b2c503d7fb542aa57b7b36e324f77cda79f8b77bde12314e2df65c5b5296a6bca9bb0b4 +b2abf8fb7c3690816fa133d5b4aa509cd5a6e3257cfeb7513d1408b12371c4d58c44d123ac07360be0d0dd378e5bcf99 +a9fe1e4fb1574c1affac5560939face1af6657f5d6abce08d32fc9d98ef03186dbb2dbb9fd1decd6d8f4e4687afecce9 +89b2f41e51f33c3ca3e44b692e8a6681eb42a7f90b81c9e0a0bc538341df9e2039ee61f26d2ebe9e68df5ed1bccf8cdf +8b35aa7b1d9e2135b35a1d801f6c9f47c08a80e48603f3850b425f64e7fb9860d1adda04f92a1ba22d00dd0a26e781ca +960574978cadedbd4cd9f764bee92f94e08b7af65403de36b21bffc9424bcee845b3b028af2e9e545dd77cf1e69a6a7d +840aa0f34b5b6c39471f54d9e85f1eb946468c4fc01963a9027cd7864df01f73c2e864f1f07aeed4b1b1af72808dfa07 +834464a84a11200e3c60f816044c254a7d9baed64aed45a17325cef7fd62338e0a26da78d199d30ac3411714dc813223 +b4ac6fe2f5059546f4ad9a361426ead33237b6b9030b129bf0122085c85fe4ccb33cf90f5a7f23c5b708a5ac64b487f6 +a12aa9035464795f2a67f3eaba478d5ebc838ed9e997c7dfa241e1ed60a94b367d3f969ccf0ef02028c35215698b309f +ac8d926492ec2bb68c6d8aa9bce49085d3d266f3d5f1f924032b87c42b44e41da7c047eeb01e4618f9d0f123dcaa537d +a5142425825d813ed8ce1849d81aa40b11f1cc3daa89a9f798dd83065c74820b4da6122b3308f528b074531df66e1a5e +87ff55c9f5aae079e7bf24084dd9c6b3bc260727d942d79cbe8dc13341d98525b4ece3ed8169994b56a387642f09134a +88e680f148ef2ecdcfed33b61f9e0224790fddc9069bd6999e9bede1791e761637c0fd60b52990b6c93e6e5429e483ce +94bc20bf5aac6e9f1060d02eacd06c42aeac9a1c5635b15a83985dfb03938ddb4999a822e865635201489c7f75601b29 +849221cab7599f25f0b114df092bd5e8c2430503ae959bef1543a101de0790a78245db6a145e26f40b5f9bcf533219a3 +88b6f2c2e7a7954fad11009d839ce50780921f80292320868d481e38d26aecd80fa607e82219a99532d88cf33b39f562 +b0d82947dc23c0b88b86c321b582c15decdb825ed909a731b42d46bc895009515a3dc646c98dbec7d71b0722df82392e +a2cfb9f7c1a76c8073363c1c3bebe5dc29fa76533caea41046c51ea9bbdc693a121b957cd96be5b6da18704d1865cff7 +8f0ffab9a83355a22683a9d998d1c1089449eb308711eaad4265f05927ec6d0d1ca39217082a0b372e02234e78dbaaad +ab024661e2b2937ad374c8cf2e3669f1dc55558a3a881e9ec4d461f27e0fa92e2bc88230f038bfb051cf2145ca747a07 +b98d9b9ec9eefa56d38cca959ce1aee7b6d4b41a8dbbd34b3f50c0a5f97f84ed2502ded1ce8cdb5895872360d4ba6d61 +851244158b3184a62d2c98d148e2b1102cf0d5500906bbc2deda95acc5e3bc4b4a3344febbb31ce05a56dfee86a74913 +860d9e2cb886bd3620b5d7499d14b415532482569bd45fd76e3e8052d78a73ae4b2b41f139f9cfb136564108cd93c0f3 +8305a052a0fb2bcd41f3aca075c5f7f233bd8f861451d03f3a6e6e31f7d08dd89fe1eb4dd7b238a78b12ddceaad9768c +adb703e4778c7e14fb83541ab00b5fc344108243ec6827c5d9b302ee68321aa569da1718424e6a57979ab7536d5eb43b +b1a754b87b9e21aeb86217ec5b4fadb7535344567f1bd15e88ec12a833fed68e26bfbe03b7709ce24ba6c925ea0a0e07 +8c1e2f6bf820e1653f3b8213e9d959d8649196223c2aab57b7ebda094f4919f88d883bcc6a0cd0be335f26f5a2a9c962 +a082deb9865fe8668e91db0e4fd7fb50fb3fdae3e7bf1217ce0aa6f286a624624cf936d762bb2b6c3fead6826694f846 +a10540ca05fbcccdd0a2a66aabab3b36e9bb525794cbae68bc3dace6116f58942218e9d5e9af10d67b5f6fb6c774fdd4 +b81d22c4ab0ccaf447cc5fc2ff3bd21746617e6773bf43257c0d80331be2e8437b88c9c45309ee46402b38d3d4911caf +84c7c6e924713cab3b149f641dabf63ad5abbc17c1d8ee7802a6630507aa1137f7e034ba1d12ec13f1e31efbab79bf13 +8773b9d236e5fcfa8c32e471b555264692006bf9a869a3c327aed33da22dfbf5780ecea7158904d4d6ac4acfe9789388 +a4c2c1bb7290eb7af2013f7dde78282148593f066b09faf42e61a3fcf81297caa5a00fdbf6b93609c8c5782a0f25341a +a7bfa6e3f273da3dcfac7cb9906bbe9fa4fc2872b184d79813ee273e6cc4d7f37f46164362707a1976f5b6a2c5d7ed1a +8b71502019e4263fcda354a0fd10aaa7da47f4abb7a0c715c7b017e9eea14f2b64009b29b467394668c7ca995adedf82 +ad7460fba7deccc3f9a7d204233de47ce30ffa55e1e164975cdf06480a6108720bc397b93ca8c959df77d44a1e1f05f4 +a5b8df96ccb7b078a3918e74b1b10da21df982538d2c9313f5129b2797c8a6db9ff8707241ff72d3e9d5983397321736 +aa6cfa6386660c01879656da6c4e72497690708bae6c5cd1d088f443cb5bbbe75561d6eec256a72b9728377eb83ef973 +b9699ce7c5c878e44114ab7a598646c6c7616b8e08a9ef8ec291189ef9945c1a538d2abf1ce3b0da0f8eecb303b81b43 +b8d0fd1d278f53c455de92ec4357885fc6648dc5f276930263da7dc885b4a9628a2113e28b66b1e64fd08189427c614f +84ad8d262f6ef5d93e82ff6f4af995148eedf6d8e079124daee9b99f506e2968922eac2c7d4aea741fceb7733f20b2d2 +ab5e30ab54641e3a44450118b8235554e0fcfffdfbe1430ceb3f7ef33325725741995fbbbb0c16f0875aef0f1e0c98ec +80e2cf8bf386ebda46045852751611f2af80eca2e910d9ec5f6e2c7376611534604ceafa639272b3d503b02bd66525a6 +aaac69af8fbb87da1c1b7c1b9e59942887ae839a91f0c1d191c40fe8163d7f1dbe984e4fd33619c73e63abfa7058f1e3 +a6194224ad838ab86e84dc80e9b8abb121ae6c3c7fddc476463d81f14168131e429a9757e18219b3896a667edda2c751 +b68f36aa57aedc7d65752b74761e49127afa65466005a42556230dd608ecc8f5efdb2ce90bb445a8466e1fc780eea8c3 +886c3fa235d6977822846b3d6eccb77f1e2cd8ba3dc04780666cf070cae208b7513dc4525d19a3fb6385cb55f5048e2a +a9801273ef850b99eb28f3dee84ba4c4017c95398730c447efe8c1146b0719f252709d3397ce60509e05da74ed0f373f +a58c2a5dd13e08ffa26a6c5e5eb18bd8f761ab64a711e928e6101512401ef2b1c41f67ba6d0823e16e89395d6b03ebb7 +91318b564ec8b2d8c347ca827d4d3a060272aec585e1acd693b2bafa750565c72fec6a52c73bb3ae964fdaa479700532 +a058db5d76f329c7e6873e80c7b6a088974522390ccaf171896066f0476742fd87a12fe9606c20d80920786a88d42cec +9838e07f9ed8b3fbca701be0ef32a3f90752bbe325aca4eaea5150d99eb2243332745c9e544fd1bb17e7e917202edab9 +85a9ae7dd354f36e73baa5ecf8465d03f0c53b24caf510036b3e796e4764a2bc17f0373013af5b9f1b8973226eb58cd1 +896a4ff4508d069a7da6ef7bed66e1080991daee8b227f3c959b4f47feaf75fd1b9e03d0917b247c2db11e105395d685 +a36d9a6a037bf498dfc0e535f2034e6cd433c7b52e520469811eb2e9f04499a6ce40257d2905300df7d81f38d1bba075 +97aac3c5492aca879b4c06db1834b30b8850a244d29296046a84c637d9580c8521ab4752ef814c96f255a139660d7639 +8552bf592a84ab4b356d01643c90347377ebf1f2b38a8c2e55a3f34537b8c7dcbd62e6776d6c2114f2bc2d4344d1567c +84474ad163db8e590943ccd1dc50b4f444beb8275919b33f53d42cba89831e9d42ce2de52b26f4412e2a0676ce913277 +900799dfaf5eafeb297c7b4f892438bf2a65ce04034d66f8e5cc3836e4eaffe782fba4f4455a0fcab49102a240d1780e +817176415e35ad4a204b9fd5771bae6cc270f6ff050996cec89efbe461b2940ae5dd3c6c7d7e31b1da5285b207efed27 +965e5791c927d47569bc54ec9b4c5305788aecd87a26e402aabeaeccc03480df46f0586ca2e2a9918885cd03332af166 +b96d9ada4b5a04a94807d71726bd557de94fbd44042d7dba40560eebe8658d1da49eba54499360619f3b2c38e8b5ed6a +a07b6d641a43e02e7868f30db4dd5069a2f221b4f122ce9b11eac04abadc4f25f3207f1d2d86c7935b1a3d9992ea9814 +8250d4d8ccac846a4b1a9fa392d9279b5bf2283c8b95d8164c3c0d199fec8849eab85755f2a2a99d584a0407742e3200 +8324cf49f56fc14162f9a9ebda1ebda0388d09d8688f1938aef7dbf9505fc119069efc552f68cc7cd9213f96fda2c6de +a98e6f1e85268dccbe3bf4e92c9f455c58dcb53de1dba3b78589adf2e50e79f8e245f956e0d098eb46f5d3746826c6dd +b103ec12f266b4153d67b54d8fc079357ee342cbe5008adc3e0689a7f788534c4601e60e939731f49e4a1e24fd589f82 +b2d7681e866420413cc98eae67614d383943e3762d5742cb3c57e26157633c20880eea1209feaf68402d5d33dd699708 +99fed0ae4112ec9ed74baac70d202a885aa51cb555a3886b49016744dd4017640dd5dd564998c4d842a9f38f3e004e68 +95c35401314467219c8bfb1ccd1f1eae6ef4fa9e48fbea14f70d5315e67b16c46cd03554471840e4a5030b077d2a3856 +8d029380e0c294400d6b8673a23aed43697cb6460fc1bcf217aca3b47cf240886644ed09521d6a05f6abf56f99722d84 +8ef54d1dc0b84575d3a01ecba8a249739edfd25513714dd4d1941fbde99dbbc392f7eb9fb96690d7052609af23aa57f7 +b8ad2b7af4812417aa8de8f33a26547f84bb84f39501d4b7c484cc8bb54c7e166c849b95240fbe459a4719a6e3bf1651 +9858545de898721d19930d8b360cacc5ce262c8e004867a050f849f7a2f2aba968c28d51f24a9af56aaba23a9ded4349 +94ea5043b70df1db63f9b66b4f9d8082776f721b559f27d37b45e0a84faf47f948d7c4532dfd854a4bac49fb2ec8e69e +a2fd88d7b15e3c2778f6c74470d0f9e1a1f979a4d58bd205361eacadab9973d585a6508e685e640b272d6f8a448eae05 +88defd6bccd55db8ca84e3c8d0fc55a3456b41788f1e209d0aec19c9c70febebf3ae32cacaa1dbbf796d7ddea4b17995 +88b8cde2449d5ee7de2ee2f32e845d27e171a51ef64f1d3d8a5fd7dbb9f898ea70eb7f6410cddfd7b7ae70ea8073cc2e +8e044fff6ec557824866ac76301b6d93ed19b7177aa6baa95046330f5d69b572b59200e3653cf2f2b559455e782e8960 +b5446b4d6741c824885790d2d26258729dc0ba2f469c85a47d38886d933b785a4f38a951d37f3ef4bd5091c03fa3a071 +956c8afa8056e9a71ab2e8be5241ddbb3a8b3cff2110cb0e7389493d9fa45e6c4b769ebef540a952db6dcd8bd55baf64 +925950cae25615246e29d594ebf34fa7d52f78a9867338648158f2131e6eb4dc17e18f9db8a5fdd76d017b3a9798b3a7 +a17ea4b43211ba990270c21562690b3ef154a46c3d669c4674c80bd424cdfa95d8850c8e882b8d06504f929cba3d93af +b315ec723973a138508afc387ef651fd8a8804f93975fc36c2eeb796a304eeb1508518d8703e666a74d14318253f526f +a995742d7433b3f230e622de23cb2d81cac76de54831491cc29768eb4a56da60a5cbd573e1da81fddc359b489a98f85c +adb2e89f0d15294d7118fc06d4fdbd9c51d3ecbcc23c69797e5b8197eea0d6cd1240910cf22fcab4ef1e2dc2dd99da91 +b5ec9f9fcd0b5d176b643df989bb4c4c1c167112373d662fb414875662d1a93160dc0b5cdf540e8a30e5fcbe6cfbbd49 +b1291b53f90aed275df8b540c74a1f9c6f582e16c5df9f5393a453a3e95624ab7552e93d6e2999784e164046e92ef219 +8bc7b7b1a584a12d5ae63d0bbe4dc1b63c9df9c89bdd1095ff4b8e7c822bf8c1994c92310a3644033c7c9689f4b7d2b0 +ad7fc45506a10ca48f991714ecc055cea376c0cbe667f3b40ee8dad8446218835439ae59bccc474cf47b053748ceba6d +b134756828a5f5725c0b95109e09ca450e3834b127163a0aeeb544e63cc0cdcdf66f8ed98c331c7c98758f46af369a84 +94535bf1636be0974b112fcec480ed8eafc529933f3065c40e417e608e43a392206cfde8bb5a87b720263446c90de663 +a4df4f6efbc3701000fb072e5cbed2754b9ef5618386c51ff12f95d281d1b700fea81fc1365f4afc66a7c83bd0228fbf +b0336b3552b721087c7e2194976a9119aee13ebed9f1c3c494353707fffde52d004a712965f460062ec9443620716302 +99a39d1d1ee4283b75fa8c1fa42b6a3836b734be48bdd48050f9b05e48db6354fef509623c6ec8d447d630a9b3352b77 +8e3dc3583d40956f9e784e8bbd0b5e65671d2ff2a7c387b20fcb7da9b969f2d122aaf7f054d450dc611737604548c03a +b5068ec5b7bcb5d8583d51cb25345990f50d1f7b82fe535a6a6b17756355885047916f466ea3ab09eef5516bbf2dda90 +a8284ec1eb1d21e693f31a6c074199ee85d8a8da2167bffab5fe240defa2773971c8437e358a18f7e58d1e2954f57f6f +aa7415639d29081acbaac3e9c6b059d68e8702db3f430b86bb6e220d476fa74841c875e9d471c8a5423c58b6fee3cb54 +8afcfe6f65fa6e07c2cb3e1756c0ef2c589830be96edd50c3c248e3b17f51a4b08ba92ef7eed7991d81667ddfbf2bf7f +83b9c8dec8ca8f9b85f0e36c08c5523cfeafb15a544398e6f93b48b5fc4b15a0bd05c0f176a9c2469664acab8dffb0a8 +82a128a89ea46b9debe5c903b950c0ab30cd7570b979ca911500b5c2cca5c4ee6b2c2fa414b5f28e367f4671ffce60f4 +b79fd0ccd2629a361cd6f9307c02ecd4d1f07e4ee03ce4b542997e055b07a026cbc0ba05fe3da309efc58db2e401a8fe +b190751141093823b4b5324cc26c4f3258552f7893241201f2fca1ae9b1a1d4d4964a9abdde8642cf308ded61ce5ef09 +935fd48b95aa6f9eada0cf9a25a573f0ffe039888b3410788c41d173747bf384c0ec40371bb4383ddcc7d9f2db3d386b +b9affe100d878491ff345636ffd874ce1f27852a92417694afce4163e6a80c78b2f28d78102fd06c3283ef273ad37642 +a877670276d49ec1d16c9f1671e43ade11c0c1a1413755f6b92be9ad56bc283e4bd2ad860367c675d5b32ff567301fc4 +8c660d16464878590761bd1990fd0fc30766e7e49e97b82ec24346937856f43990e45aa8ad37283cb83fa16080d4a818 +ae1412087da5a88f3ccc45b1483096aeb4dcf4f519ff3dbe613f63712f484bdd8b2c98a152a9db54cf1a239ae808f075 +ad83cead97a9c3d26a141604268f8a627a100c3db7e5eefaf55a1787ddc1dd5ffc7544e4947784cb73b90d1729003c8f +97c3140ce435512a509e6ff3150da385fdf9e0883a5dc7cb83d616ec8d0a0014e4e0fa57a4d12c7997cd84e07d49a303 +a353773ff68f1615454555bf658eabdcca40a9c7bced8537ea6fa8d54764fd1f032889e910d2a2a342835513352e2d2e +89e8df0c17a36ffe08149c2ef8b27306d04cdf437135aaeba697abc65e3c8e91bcf1817919a8a826acdbbe7dce79a18a +9928c2da15ac6cb20b15859c22508cfcd452c5643cd22eb84abf5f0a1a694fdefcd8fc329c9b40babc52630743d6b65a +99d837b556f8d13108eef6c26333a183f59383b39958dd807b10590c3d37f62ade6c4a320ca2e70567e0218b0ad5807d +9272da080e4aa18720b634640b01bf1fe506c7c8a89dee8759a53e2ca5cdbbd4a4f3aca54924c46b935362cf1eca066e +b4d39752c882de1c1daf3854202c1d58c2bcf35c882006eb640fe54a97be2655281cdb91c30d1a41c698617c2cf64b01 +8bf827f4a7d47e07374d338a3d8b5c2cc3183015b5a474b64b6086fcf0cdcf4852046c9e34d7917d69caa65a9f80346c +901bffc7db9c9416e06f593a76d14f6d9e5dea1c5f9557bd8c93b9e70aa4782bab3518775c2a5b285739323579f7cf0a +af7e204388568627ca23e517bcf95112ca8afd4c6056b7f2c77c4da4b838c48791191565fd38398587761c8047d11c47 +ab2576b5366e6bd88b347703f9549da7947520d4e9de95d7e49966d98249406ed9270fe69347c7752dad47e42c4ea2f4 +b12e3b228b761dedd99d02928105494ded6d4fea3026d73d65ebffa2e85e2cd75b6d091135d418dd95ac102c22b5ee31 +a20b4a752685d5e31ee7e2353c8a1b9a5265f12bb775004d282a3ecd9deda44831bac1ac5151646428b66909b2a423f5 +91a1d4bc0062a86cc6786a96fd3eb4436d8a4a187b7cbba02190d1cd6ed3c3797d9ae7d6ddc413f1c94a21f62bd04ef5 +977f18da1a5df5cfdd0276f583cfba2b2a0fc6139520664e20068f8dfdde33e29d179abfd722f142448f4677aa47be6c +abc3ece90f0f7b1d80fd917de27ab0d88cca584ef959da520825e54cb5a71336b15f8b348532d08d47a6fa600527ef25 +888d36a2c7cc13a1c1aa338a183a74a1f57713e76cb825f9837f43279ce4741999b76a16928147537bcc20f2e0195b0f +af3f5dfdc2dcfe19de893f385f39f550cb1dab67c2e97f1d5fa735e5ec96d6680066803e8a0eb010dd4399f654195513 +a0fb4e08ff56530a940a86c28830956eb6dec2f020f7faaea7566faf0a4fafe0cffe01480e87763ec22f201be51a6451 +92343c5b107910b203c64a79c93d354f7ee5b7d1e62e56732386776e275285561cb887019cc00d3fdbe3b5d54460bec1 +acfe7df83c4624188a1011ad88c1e1490d31a8a8c8016b40aebcdd7590d9c0793e80d2d7ce6a7048876621c252a06a5e +a7da001dc1e33e0e129c192d469d2bd6e5d2982eb38f3ba78bae0670690c8e70f40e8114a57bd0718c870ca5dd25b648 +a903de5ff97dc83628290d781e206ef9d7c6b6d00cadc5bacffb31dc8935623ab96ade616413cb196a50f533e63641d6 +8f9658d42ad14a60bbf7263f6bd516cfee6b37b91a8f53715d69f718a090ad92484061c2cef999816760a78552fae45b +8c15b72b3d5fcb9ffd377fd67d9dfbdd706593fba9629002639973db12aac987bd1db70250ded31c88e19efff612cdb8 +88a2a4034decd854fb557960194ff3404e239953818a8a891bf72a0b26a8e570a65c4a630884de991ae7452b3234f31a +a09cae5c4c190537bf1dd75bd7bce56f7b799762af865bb9d1ee970f6a133c27cce0dd0f14a0e0516ceac41054e6998f +9760ebb1b40f9a97530c3b940d4ef772a225e5b63bf18283f8e302b9436c5209f6294980fd37058060e429fb7fdc3a56 +adaa9400eb86d857dc591b25dbe3bc8f207b69e77b03cb5ee01f7e4b006b5c8f6ba2b51b5a45687479885708509363de +949efe6b00b3248846747a9ad4a934d6e4255994c2b540a59fbbde395fe96d69bb67908441cfadd8c8bbb561fe52da03 +a19a45504b6b1dc3a0fe0e6a1384734a3dcd5a7cb8fb59eb70e49426c4fc44946547443d558e5719a04884ab3a2811ca +8934c9ee21e8d1435426fd0f64232a0670a7946ec524c054cd4f2cc8b1be9f89cc11002ca8aebae646a2050d91716b10 +b1150ff8ffb34ffdcf7d603348c0aed61e5f90ee0a1b814079fc2a41325c75f2f9ee81542797ede3f947884266a772e0 +86ce8cc7c1f92af68de2bca96ccb732f9b3374dad6657dfd523a95e8a931a0af2a80df74098514a06174406a40c16ba5 +90faabb9ace9e13fd9584932846ab28a618f50958d2ce0d50310a50c3bc6b0da4338288e06e5fcbaa499f24a42c000d5 +af4a935c2d8df73332a16dc6da490075cf93365bd0e53e2374ef397514c30c250bcac569b6df443985cf3720a4534889 +b7f948ee90f394789eb0644d9f5ad0b700c8e44e5e9ed0e49da4cc18483676d25740710b1c15a557965da635f425b62e +a917913091245beed6a997ff7043ecf60c4d655c4db0b1ef1c704fd9b0e1ea1335ce8b9f45d6e120f81805ce31555e30 +a48099da8406399bfb1ba834f6f7d864111d0036969a5cb64089947a63dd9467d3857b605e9f57f5ad5f4ec915088d9b +9784c3f9be42eed354542b1446d734521f8e3f01cd9d495ae98f2e4a3a16767fe2ad909e0def5d9a6267f3fc6a172cd2 +8d9afaa323847a3226ad7d7b60d87322ffcda2e4a8df89f58a076f7972d896588de685a2e155e243bcf9456b0a0d6d1f +994413faf0b843f4ec1842c706c45ea5f24351c68674a27887bc8b182eda756856e507a4e8bbfd937e2c4c581b629ee6 +b3e72d9d1ddaa00c7d22f25462d6e9f2faf55e30d138dce8bb1517eb0b67132db758668aac26164fd934d732633bdea5 +8e95875e338f714e9e293df104f0ad66833bbd7a49d53a4f7f5fd5b18a66a61aa0a0f65cc31d55e0c075e0d3e412cb90 +b980091862b1a9f9334b428eae14bbf1cecb4849e3a5809773b0d071d609727270f6ad97f329eca896c178ce65883db9 +915d7ae5ae780bdba27ba51a9788a8852a15355b569581d1f18f0d94bcdfed2c1ed5a4f58e049e9825cda11f92b2c2d4 +83e581058edf9259d0b06128282327cacbb6afc939578223cbf93544599f799a8dce1fb21d52464f990a877086f42506 +803612a38b6f6efb97941997e101ac1878e192456f8fbddb3359aa7f3023434ed8fa92e60ec8e7b4473b1948850e4311 +864a1bf4ac046161617dde282e44ab3cc1843da01a09ca58aa00ed00eaea9351a07a9ec16d910819e7dcc28b8d2c8ada +922eb142845975d5f6f7dcfee6cac8c299b3730400e6bf82cc0bdd9888de21de9d9f1530640f702c003e1ed63b140cc7 +a7db03c5be647dce1385ebc02f4825a654447fa8c4c8d4b22e635dbdd2b3ccdf219384e49a80cfb1e9e6182b6e4227ed +a167289ff0f0967bbab6479e4a8a6f508b001bbe0d16cad36ab4c105ad44f3f180e39a6694e6cd53bc300fe64dac1e8c +b7766431f6379ce62cba22ab938cdbb1b0c7903dfb43980a417e0ee96c10b86b447241e9dd4722fa716283061b847fb3 +90cda18c5d66f5945c07c8c7dc453dee1370217ccb851bbea32578599aa669b4dd245dd8a9711b27c5df918eadf9746c +ac690cd2af39932874385fbf73c22b5d0162f371c2d818ec8a83761e0a57d2db2fca1d757343e141e1a0348016d5fc44 +abac820f170ae9daa820661f32a603ed81013c6130d1ca1659137d94835e1546c39a2be898b187108662cdcbb99d24fe +b2ea5a5950096772f2b210d9f562f1a4cfacc021c2e3801ac3a935f2120d537471307d27b13d538dcbf877a35ff79a2e +ad94af4d0699cd49ba8ca3f15945bd09f3f7d20c3aa282a3113cdf89f943d7793e59468386b067e3c1d53425dfe84db4 +83788367ec97cc4bbc18241cbed465b19baa76fab51759355d5618067009298c79d0a62a22e2a1e6dc63c7b90f21a4a5 +a3e142d879096d90b1e0a778e726351fa71996466c39ee58a964e6b5a29855123d4a8af47e159027e8e6be0ca93d9955 +860831f8d3edaabd41be5d4d79c94921625252aaec806251fb508e364e39fde8808d38b10d557e487603a1b274c9bc3a +88da39f334bd656a73c414ec17dda532059183664bbbac44eb4686c2601629ef8ff9da992c337a842e3885b684dd0032 +b50addbdf7164e8303f33de5ce854d6f023d39c1c1984b214d9e5fb6f6001cd5bdda816f048a438ff3d696872672f805 +999e58c4c69a912b84561cb09610e415b43832beeb95897eca8c403ef4754f4277754d492eef3673afd4362f50060fc9 +b88ea0f60f8119c5a1fd9294796d387472dfad22442b29659713d1d88e7d854cb7cf5c9ef773627781188626bb2fb573 +a068b3844e9dbcf74b54fd55904d56af754d8ce4c619fead7a07f9bfb9d02118db7c512ccec2489d2a84374ec1d1fb6d +871dee023768636003c799e6f6fd8d31315a4c0da7286345cd64264a016693b3485e0732be1bbd34dd5fa04dfa58a983 +8021e8f508680df12e4a5a1bd49f2d7142df65158b0a7198ffa83abd16053a542fb93ffc33e5279020ba8c6a26feacf2 +b5d3cd64df5bc965228b0bd4ce9e5797c409f7b64a172ba165e44a8e4b38e3d5fabc3e0b9a19afbfe427f887c40a315d +a54fdebbb594bafcefb1a03697711e0091c072e1cc24fb441fefd4e0a0518675a1d7b0966cb8294051d7ec0ac175d0cd +93922202337f72969d6d6e14a29c9c75e0420dfba712029941d1504b9f6f9761d706cbc0652cd09a1aa5d22aec766af1 +9711ebf1c7c7426190d4afd5dd03b014a456bbd9d90ed101623866a280550df26a629dde400c03ee3699f7d827dc0bb9 +b4d686d8bc5c1e822a50124c1cc23c6bc3a1577a3d0b8d4b70d1797418aaa763283c09e8a0d31ae6d4e6115f39e713c4 +a533ea2ac683e4ba07e320501a5d82a1cfc4fa1d65451000c3043f0fdac0a765cc1125d6cc14fe69975f3b346be0fdde +94ee563134fe233a4a48cf1380df55ead2a8ec3bf58313c208659003fb615a71477e5c994dc4dcfb2a8c6f2d0cb27594 +93e97d3f3f70664d0925be7aee3a358e95ae7da394220928ae48da7251e287a6dfbd3e04003a31fab771c874328ae005 +b57440d34615e2e7b1f676f2a8e379e1d961209fe00a0cf6798f42b7c28dbd03172fce689305e5b83e54424bc3f4a47c +97644084c6f7b4162bc098bed781dd3af6e49e7661db510975528f1dea8154f3d87e979bcae90c3df3a7752eb0752889 +a923b27b225b2a6dd5bdc2e3d295b101cac5b629a86c483577e073cea1c7d942c457d7ff66b42fcf33e26c510b180bc2 +86698d3b3873ed3f8ab3269556f03ac8d53c6e2c47e5174ec5d14b3ed5c939750245441c00e2e9bb4d6f604179f255ef +87946826d3aa6c7d53435c78005509b178fdb9befc191c107aee0b48fbe4c88a54cebf1aae08c32c3df103c678bad0ca +860864896c32b5d4cb075176f4755ea87fea6b9cb541c255a83d56c0a4092f92396a3e2b357c71833979b23508865457 +b78fa75d687349e28b4ddfe9e2d32bb6a3be13220b8f3ff1ded712088bd0643da9b72778bcca9e3b103b80097f48bdd0 +8a188b940446598d1f0e8c6d81d3cada34c4c1ae0118ec7e0eacc70d1bced28ae34b99667d5793d9d315a414601c3b22 +842ac6f7dc14191ab6dddffcbc7cb9effba42700a77584aa6a8e17a855cd444c5d138f9d61bf55f43c6ffbcc83f92bc9 +b6742902c3d145a6af9738c01cf9880dd05c85f0d0ef7dbe93c06fdd6493333d218339ebc2a02be1895436a2f734a866 +98bf18488483c627b7181b049d3e6f849fce1f15794de59dcde6e5a9b0d76fd484a46e48822a6a93001d3aa12f48bc6d +8769cac10bda8c53a1c19419ef073a5998f73dcf2ba1b849561615a17cbc0a49bfe3eb4ff8801dd36a22fa34b9a3a7e2 +b45c084d58028fdfae792210fcd183abc4ffddeb4cf52ebf3f8a50e4c4eec2a2758f1241b0920bebcb24b757c778577c +85c1216eec8e1fbc1af9b36b93c5d073a81d5fba86a6daae38748ec1573eacc6bef209e76c87a6efbd7a3f80e11d4c3c +b8007e34bb3f927ec06a050b51e633d7eb9e9a44715d5b39712e69c36177a03cd68391090cc3293098e54f6cf65f6caf +8e85527b27c9152b1ba3fdd532a76a79064ab097570508f233e09978761dfe3012d537411b47d0e4b65265eb32cea2ae +899779f3c31a20b76068ec8d59d97a64d2249588ddfd69dcbaac6bfaee8ce0ff3c5afc4e17c934ae7cd041b760eb555d +a5dac3d8f5fbef018509612e25d179f60d2a62451c76426bf546e9666fcdc73263d34aa6fa7e2bfd4c9947bbf5095eff +896900eeef9be2b2e755128e7b1c436af6fb3984f1e66c444bc15fcf3959013b4902c381f0eab1247f878a6ebd1f4ee0 +8cb17f4b0af2e9b2cbb56f46e6a5d6874ea0daf147aae77303020b4e592ddc92e0dd058def7da96258b3a68b223bf22d +a1b6d3f09a9fa7ecc021ab7c5396541895da6e9bf1f9a156c08fc6f2b815a57f18c337ccfe540b62d79e0d261facb2be +ae70888811434ef93da60aeee44f113510069fd21161e5bb787295492eb8df85103794663fc9305f04adcbcf11ff0c5e +a84bbc8624100acfae080ba8cfb48fd4d0229a60b62d070bd08fade709efc6914dc232d3f7bed76a59204f9252321aad +aea47d54652abd8ca213cfc623c8e30780f37b095b59ac4795252a29c2b6bc703a5203acff8831314478b8ee8771d4d7 +8dd438eb8be14935f759aa93021c2b24e1d588f7a162c42c90ec3a647b0ff857f60e24c0a8953eb7bb04e04be70f11ce +922b07b5469680a10e7532766e099896f4dc3d70c522d8add18f5f7765d4ddb840df109146607b51ceddd2189fa7b9c0 +83ef6ebd0ae6c569d580093e8b0b78daa964760556272d202d343e824c38eccb424262e5b7809d3c586f9e2e9c5c5f22 +97f98bd357db6e093e967fe180cf67ed09fa711580a5ad48f07cf095b2e8fabbe6319f97d1f15d62c0ec2227569d8dbf +a1953a4a22fe6c2beaf2a5e39666b0eb53018af6976e3a7aab5515550ff2efa89400605a43fb2c4ac1e51961dbd271d8 +a5cbd67f4c0bc98e20aa74c09e6f5fb6f42c08e59aaa477b4b4e61434c8884bc14f17cf11faecf46dc4b6c055affbad2 +87d96818f2c4f12fd7705cf4060a97bd28037c5ac0f0cc38f71189ec49361e438ce863e6617651977708094d5336d1da +85e7c2daae5fe59f8a1541c94df50402a671a17dbb8838113fa4b7aaff6114cf2bb5969410cf21e6a162857f2f7a83a8 +a19575083e1731bb04bb4a49414e97aaadb36d883aa993d1f6847db50007315444814740e67e10177a14e0e074fd4c7d +a00ebfb5bcc3a6da835078189038a1e56b7dab6be74332b5ff7440e53b0f9e1eb9973effecbbf37000021fcf50c7c1ff +8969d7943abd3b1375fdfc7d6124dde82b0f7193068ed6ec83bcf908734daf3487a6a30f7b322e54a4818ae5f86d91c0 +b959c8d210fa43af9b20d1fe0ea8c4921280eb4544ef6ea913309ff9d61c9327096707e84dc1662960519be8e7d080a4 +9011d8ac651c42e0cb03931a9e960f58e02524c6b666047525e3b9097e9f35fb2b4b278efcce2bd5ad463c6d7fd56694 +937e3b22ed0fcdbd9ea5a1b97b84bbe86b7f5b2de3866a930611112f2217f4ee7d9822c4ab1253823f77bceeae0c8e10 +828997e5d121f4c305e018a0a0ba338bd6a34a7b4dc3c5ceab098ee57490311c130e2c045b9238a83908d07098d9fc32 +8d114808eac0f2e1a942d80dad16756ec24f0276763cd6771acb6049472e05a9bb1d3bbd5957f092936b415d25c746b0 +a063c5c26267ae12887387cbebbe51fd31bc604630b3a6e8e177e71d4f26263be89112cd12d139dd4c39f55f0e496be0 +ab1e1582c8d67196d10f969eeb44e6e16214f1316aa4a2a821f65ba5834326da6cba04373eabfd3b3072e79e5c9717e6 +a17b1dbaa11d41457e71a9d45d032448091df7a006c1a7836557923ab1a8d7290ec92a7a02b7e2a29fcea8f8e374c096 +a1ed7198da3591771c7c6802a1d547cf4fcd055ca9010756d2a89a49a3581dfe9886e02ee08c4a2f00b2688d0600509a +af09aa60c0a185e19b3d99ffdc8c6196d8806169086c8ff577bf3801c8ab371e74165ba0f7329981e9252bfe965be617 +98c04cc8bb26ffce187fa0051d068977c8f09303a08a575175072744e0a5fb61191b1769f663a426c30d405515329986 +a542bf1c9c3262d488ea896f973d62923be982e572172e2461e0146190f2a531f62acd44a5e955a9f1e242b3e46d63ae +aef7b7f30efd50e4a66c87482386f39f095bff6108e68f74fd3bb92156c71c75757912b111060cdee46a6b3452eed657 +8afe1e0ccd00079702f16ab364a23bbbd3da1889d07c4f8cb04fd994bf9353216360dbd364492932bfe20b8b69ae8028 +9896c690999db3c08cd7b25efb1b912c3e0f976db98a3e830f086aef93222d06ce570a7b2babcd7c81d8f9955169669c +ac7bcab6a281468907ef1ea8a6c1cd624159c88839131bef6aa0c22f331fc87ec6128a2c2a333fb79df549e4587e1a12 +987935c08a30b099d19f96901315a2e60591baf898581c40bf5eddcda806ff24a4536e30ed1e6c0b128a83fc77b6e81d +a0a6945bbede3bb09a4a09ef27baa20619d3e15af5673b9350601bcebe952597c989870746cf75767ffb73b32c6c9c6f +b0f5590079f0a0302b08a0cc1b7a5f39cc6900c2a5cdc7baa333d8328a731b2df5dbb67e27a154d3c44ed1a795fc4adb +a7294bdeea210e528f277f3d50e89e6d79950494478998181ecb38de675020130256f2f2a075899170be964d478458b0 +8ab3041b895a631869b439d5599a66facba919226ca9b39d915f19d59f9fc82393ea781377e9bd3bcc5a310e41376914 +8da399b59151fd48b2579948bb82698e3c9804d70ec7d6f3cc7e82901f9f2de5ee850349a7d6f43e5e9ebd47bd78620f +80e8c32de83d1083916d768b11a982955614a345d26d85b457f2280ff6c52bb776958add7c1c8878f7d520d815b8e014 +81bbec7bd99d2917d2dcd8a288722fb33ad5a4bf5416fba8609fa215fb80e0f873535349e7dc287f892aa56eb9e39c4a +9665796fe04c8519206fba58496bc84a8b9113e7ea8e152b65f7f732e88beea271dc97b1ea420dbc8257cc4b18a77463 +a97e342aaaf693ddc87e02790278e4bb50117af4413cd703bdf3b7cad2d1facf31fde1303b43ab2e0265467474f97a8a +925549ebebed348886e37773b05cd8ad04906eca4536bfed951d1ee41b3d362ddc6e1a302c21ff3a2d1e70e95117922c +818fdf74d7903502101551bbf48d3c7819786b04b192d9e94362d2fcb85760d8b6f45165a5443aa5221bef400525ddb4 +a9d29de7e8fd31b59f4a087168d062a478b1329cd3c81c31e56de4fb40de7a5be9a5269ef0be452c487443a0b097dd50 +a85286ad573db4c9aa56221135da1e31d742e0f6ff01d6b159086d7258f78b08dad55ec8eb5c91ee9d3404b2eeb67e1e +92a79b37db5e777f9ebbebde24a95430a199e866e56597c7d0b0e7fb54c7b092c2f6cf61fb24470ddf250cf609898281 +8d79f5ca67ed67d52c82949af342a9fc60fb793c47c76d84b4863c550796fcae2dd59e285897c6fb96fe31cee1efa62c +8ad2e0bda03415ab86324992bb62dfa3612d2d003765bcad1468087c27971d08bdbae5252681f0115a184f4885d444e4 +a08815af979286538c31b4aa5ec805053790af1ca58a8c4341be51136d094a8a05e569d876a079033298ad355ccb7ca8 +b96c2978d0165d619d08281d295e90df78bc2375d0afbc3142ebff9c2cd4b0f0aa97a9a0e3740bc4dce0ff8a9fac8252 +b7752cd0e582f35ab0d0036ca9c0a9fe893a6ad325164d78d865a604a85d3d23729e0362553e8b8a3d51816beeaa30cf +99cef1fafc29e7adfe247c753c475ad4bda7a5f9558b79c86e8a65968ede67adb38dc30071925c9d66a13860027a6735 +b9f6c65af178c791b6137d71980651fb09cb5b42f268999c728c6e129985a9c7d77b3dc3b50751bd29ec9ee0b3111dfc +8d73ae61fff5be883a281782698075c5650083f00399992688738856d76d159803be0059fbd9dec48f4f0432f0590bbb +a8a4a2865226de9bbf19e12c7e75318439fa6cf1cbf344d5e79a8f363439d3bc5bcf4df91b54581e7866e46db04eaf0d +894582aeff222e145f092ba15c60d3207340c38f2c6792ee2ab4d82d50fb544ae366c2985cc2b6c2f970bcc5f4b46385 +956014ba2d20a056fd86cb8c7ceeab9a2c6f905dae24fc1c5278fa5b84335148ebdefec5dcde8eb9b084700724fc93d7 +af217fe2b654eff6d11a2a79fe0339a1d4cb3708b7be9f09d852158b5a44b4f9b04406d6d67c4f144fb6b69a41ae9d0f +a90752a784bc00df94d960e523f5596695d16a534fc806179e0f878fc0e82a91b25e758e91a165debd815dd1af5f1028 +a697606fb32979549ad822b31df8eaaf50de4ead984439a0a33e955937d326519bb9f62c8243ad37f764655f8d32cc80 +a3ad4a30922e45a3e665551e5611384f1c2d414f6fa806184b0c826af05f014dc872585e255543794ee41e43cdadd856 +b29c255843a82ea74a013bac6c36a694646e61e6b9cefc4c130e2ee261e3bb5da3e0fe3ee7e6fbb009deed0530bc1c82 +87e1cc7febefa829cf050aa2aea59385d1048f8617abba691f7ea9ef58eb90ad12eeb9c439af228b0e34897ba1cf1b47 +994d3222f89e9c8c154362190be7167c8c2662f0cfa9d50eb4d8175b255ff0de09dc548ee312fc8226963c8c16f43e8b +8f1a980be640820f2d1e953264ca4c30330878971669852be3d5d6b41c488be1628b935388bfa2bd4de484acb0fe661d +854d90d0721579c8c88e147a4aa83553c960617b18075f8224b975562dccb30b0e02e81fa9df7070f356a0eeffc3b14f +8e156da9d4330a03e32a25a2f0b861fd3ea5c719fa4f834119baab6e5fa5236a9baaf0d44147bf0841418900037f6eac +96586fc49e53a6799242ddf617000db5a0ad20c6cb1686af2102623d64a71aaddb8e468b15fa6d100d0384e448548db4 +b44d8d85c8df95d504f82d597f8c515866d4d4a326fa1b816dcc5bb0cc4ef1a52647aa5d2e84c62e194c01cae0885d21 +b75c43e676a7efd199f8b32ae31f176ec667e714df355e9eecee97246f72af5bef9c5b04c11e7e90fc37bb9163f957ec +a49835ac0565a79f6a9078cf0443c5be20561a68b448289589721fded55188583f1d301925a34eea647f90a6e66c6774 +b47c17ff6824a00b8f29df0adb7f06223208d062bd703b0f763c6eee4ae62d4217eef2da4f4dde33f0b469c2f2db9e42 +957cf039cea6f6d41e368e2bd0cf77315938a0738f15ed9ca342f0a28658b763659ac1d1a85ecb362f13de12b77bb582 +903a52f8d2439fa63f59e1e9aba864d87b0464ded63814474947112375236a6f84e8fa003cc4433c8208d80e05fbd1b0 +8afd524209ff08d1eb6312b078f7afeb8e1155af649e930ab711dedda226dc2db6b0354aab9652eea7f433f90015bf7b +a95c3c9277b11bc8fe191773bf567641be57c0549913b973fb18740ff9cd7b3f7ce198fa4dc1086b2b8a446012459193 +9455ce8163fce04aeff61e7808ef3aac4725e51404f0858fe5d39d7344f55dcc7871ca332aa5cb1a63a4399529e48907 +809fa35b6958f94e781f2c584438b33f5ed528a6b492d08960cf22ecf63ea3aa1e2d29bc879e17296e0a6cc495439cb6 +b0f50774de212dd33e5837f6b496556215c665437e657f674fc5117e5c07dadbd0d057e6ac4c42d50a8eb81edfebf315 +844c65e263891d0b2fea7db6934cc4b7fb6bee2c1d0b9ab4c47f2eb3e9c5d7197dad828d38c54139123740151420280b +b13c78c9efcbb3b28eb3fe0b971380b7d5151c80948a99cd93c78b4c3ab0e86df6226a64d91e0a2ea4a1c0a46bc0404e +90300a541decad460c348b8f4257f7a29687b2362ebee8d92fd03cc0e85b285ccb0ab1cb2ff5e29c5cc5295e351017cd +ac49b409ded770c6d74f6e70104c2cdc95b7b90609da0743c9923179e8e5201ead03becc0ab10d65b3d91a5be0d52371 +a257b815bd8289dfdfc21af218aaba12ccfd84ebf77642cc4cf744d9b0174ca0b0d7ab2a545c2a314fd5f63c140f41ab +a34778d8446e4d74d8fe33de64b2694ef1e50bc140e252af6eff3ce7b57acf8b6577a02ba94b74a8ae32e5113cf0a29b +ab9e935bcf0d8607e3d66f013d9bce7909962cb7a81174923db02dc89e485c2b1c33d6065bdc7bbbe0450b5c49fbe640 +94d2c5c5c309c9eac04be4636f61bc47fd9579b47aded57cc6c736fefb8dfd8f8a5de32210f7baf2052d04c0219d3b4b +b8dda9046ae265214086355101be3460421f7cd0ed01bde9c1621da510941d42bc93cd8060fd73f374fb1b0a5f38d45e +a6674649dab5f92ab9fa811d9da1d342cf89ff6eff13ad49f4d81de45438e81a384098d3ae5ccce4c67bda5dbe246d95 +8d619f7564677bacba29c346c4ef67c211f7a3a14c73433dd1a7692e16a7e2562f1d0532454af62fc04c2fd2bb1789b0 +a2b93d2fd4c707f5908f624a0fc889e20164d3c61850af9125f47a1719757a6ce6375aa1910eafa4c1e8b6e20c312775 +a07d5585447654d82817ef4d199984542328b238157976eb9a267f0bdb2229acc25aee510be68f65a312b68fdd9e0447 +8ef55cf95e2b24d8ec88e4136399a7763bd1b73d5e90ea45e9845123e9d39a625cc336e9b67988374b8ebcbc75f2ed21 +b62c1fc32e27c767c461411b02fe9aa44a86586e1427406f4ef0b346d077db91952abce79318b382ec75b7be23058cac +b252900345f5fa15a4b77fb6af6a2d04db16e878b7bd98005333f7f6e3c8e6e46cf38fc5d1b2bc399c5c2ff4af730dc6 +a4ab5ac0cc15d3d17b1747c6e3133d586870eae0a0d9c8fa7fd990ebd4fbb62e9090557ca2792a6bc6271856aa3c9a05 +8e706b3f2e902faee10b22742c6c33bea6f670a8937c243db96885143c1db5c979e33ab73a38359b52b8d668ccd092a9 +8a6792190ee6c959d79f60c22980ca140c638d88d75660adaf9bcbe6dc4692ab5f01e0c460170f09f74d5e582e85ff1f +97ffeedfc94c98ec85ea937e064d7b290a326838e62cebd407facd1ab4f08d9c0c109d79af7cb6170fccfa6c8243c127 +b79970b67c09453614ffd83a0c923c17f857c6ce3c87a356298f8351cab0def7ed83efd4f6638f48df67e07bef4ad9d8 +b90f1931c7cf1822cc0a97401119910cdfd0482daf09a4d7612e4e05046295cfb4cc50d5214b31676bb1a1c9d15f9c7f +922921ad813c01fb5d12fa7fb7ed8e0b0abbf7b19affa190b36013c55b88fe3c7df0ae663c970eec7725ba37b95a7cb7 +a124f33e7f28feabb4089a063a08d52b7395d24eecd06857a720439dd9414b7073bb86fbd0b04e7bfac62d3dc0fdb2f2 +b252fe50bc6677c004550f240fe670974a33ffe7191ed7675da6ac36c780c2f8d02be7da5d92cbe2d0ce90147847f8b1 +ae5f8c9c56070f919f3df2d2284348fa4b2e39881f7bc42c9b2f5b7cb1ebeef8ecac000f37329bbe04cc1680cefc7f4e +b432a4575caf7337f11eecfcbd34a6705d0f82c216301725ceae2b3c9df20fa53d1ebef65513e305013d1e0c2df522b6 +b7c016fbbc4614cdbb12db1c9ac41f9a45d5e5ce82594d568a30cd2c66c3cc9d91a2c959697b67c582a0913de661505d +8f6f3e5e0347dddc1b2a34ec0dbbbb7cafbf976f19c9c902efb5c1427d1bbd4b71abd9f3fba20dda75c35a39393c989f +b0042a1d33a1ee9fdf3fad2299b8d70c4f1862d8393b5ebe3ac2189a2c5a58bb826128cd7a39b70d524a6dd976097e26 +85297c4e8ae8d9b44c3fe51aa926c77d55db766c2a9f91b659040de36e34c9a4fc6f44380f8d61704498f6fd52395a49 +8c61a988b6a00fe5a277450f30bf6daa932e42a2eae844568e3babf8815e09311f3c352dae6eb2d57a98d16b7beb2d22 +990be28aaecd932e7edb2a97b9be2789a3905cb88737b1c79881302585801c69a3dd5fb230808b39db1352fc06e0b4a8 +82fd14bdb335aa46f022dfe0ed4d631911e6b6f5eefb10d11e9e2e02a7df55012ed8162249d10b58eb76ced5a7b06cda +ac39cb058df764e161db9c39b185f09aa210bddbd66f681f1697ddbe6b305735612d5dd321d3ffbb4876771bdb321e2f +858a3f7e57ccb81387caf8e89f9b6039e9aadeab06886d8688fe6427151a59ab2e77e85ba850c67d099965426c97779a +b57fb9ea623cec432946819937c6bded0b5d03c8c67b52b44a4b67d34adfb055e6cabca67a48e4d859b4be45162c5083 +b84d2990b563d6d7fe1f4c1894989db25b81745090b94b1fe2ef708ac3b2110ef93d647820b2a51fcf78e3f00fef5412 +817d85b9f5e1521733d2b1fa6d4f4957ac445dc803f97fc495e20b819b14e651332f9e0573d684b854fd47824c53f0e8 +b09e18e97e93a8523101af594422fb71afc5b8826002314269016fcc1b44002d91bcb7c90d923d460f0cc03bddfe9af1 +b867cbede82102de7cf6cd0dae68506869576eaa66c3fc806e73585310602682fc912dc37adf5ff6f0f34a07831735b1 +b1126255798368b692f2796a3470ed16e5ffdee2d8c9e0f7ee3d2e92950c3e6365c32895171c3494aff2a6d6356f7e25 +b05f0a0996dec16335c770a5df3f0b08e20020c838c2caaa1d3a4a2490ede98552f5de349de2ce6e4c4a839731d80919 +98c512bb91c8fa191120ddf5d63c88076581cf41e15eec3c168822f12b3dd0ce4d6df74a7e3093d3e35cad1cb3135421 +84ce38fd97f7f90012c2c1e59a67bf9f465a7ccfb6f308bdd0446cc82b8a26ff7c30e5c7cc375011718cad1b31adaa9f +93139db52c9fb96dee97a0825f21e34c5d6d36838e1e42f4d12d01eacbe94426c85a811fe16ca78e89e08f1c27383d28 +81454037b1e7a1765f67e4288b8742eebf6d864d9b0f508ab44fa3243168ce0ed30cb5f33dfcdb995cd2c2710ff97a6d +828deb2a26efb2ff1842f735e2cc27162360f619b6e3e27a85bedf384912d4726bb2759a3016937973092ece1bf90540 +87e5a7d4e7bd301078f625d9a99b99e6e8e1207c9f8a679f8ebbbfb467bfa0b5f7ef4a4d577c7d2670efa88221153012 +b9dc9d0ea48deee201e34379447bec789c8924aecd030eeb93db159af77eff230976ef60ea9f4b4a9e9e95c1f9f4284e +aa6528268d46bf0627d87d58e243d3ac34b863513c725908a2617e4c6a46ccb1d8c8334bd6dd0eea7ffebec44259dae5 +8d26c9ce07293f6a32a664d31e6df9a7ace47e6c38001635918efd9872aceab62de7757b13b783d422eb67bd28ce7bbb +b0d3ca88d9829a7459b89b0dcbdb8bbb5180b00d750bd959bd110f53c2dd5d4db554b6005c4765fbe7ec5903669e5ebc +a94d1c72bf3b2dc6bfebc9dee40f6a89a516b252bd9f4fad96f156e3dbfc151a9b8a02324d764c7656d59230a18eb61f +88996e79171e30b16505638d8ecb25afd875e5f3cc3e29860937f2b5e751c66e78dc77f744a0cc454a8a655142a93ffb +af4d94f342665fe7ecda318de6cf1bc1c40c37dd83d060fedaf827459728152b5f0e280286ff5e6a0012036f6715f53f +96beaa7a2d565ec14a4e5cb895d33624c69da56b75c8d06ac729cb6d0cb64470ed4f9b0387083cd827b1609c8cabde8c +96b773fa2fcb7377bf71a7e286f37f1f24ee42cba5b4f33903c4566e5e5bcc501ea360e3c8435749107c3de84e272d8e +a69ac6218454c3f40ad0beb48821a218fb0a4f33ebade986d2fffd9a3900d8cfa613bc71676c46cfeaa5f644d1f239a9 +857f139c08fcc45370f448ce3e4915bcb30f23daa4134407fc6d78efac7d718b2cd89e9a743eec7bf2cc0eccf55eb907 +adeeba36af137fd3c371a2adbefea614c3ae3a69f8755ce892d0dd7102fb60717f5245d30119c69c582804e7e56f1626 +afa97ca3548b35aeda6bfed7fbb39af907ed82a09348004d5705b4bb000173270ce44eb5d181819088aa5a2f20a547a2 +8423bd2d07073b0e87819b4e81997e4d3188b0a5592621a30981dc0a5a9d0578fde1638a364f015078a001afb00891c2 +b92e9d4ec3966981ee574695d6e4865810b8e75313e48c1e4bc5eebae77eb28740e97ecc3e5c42040f9eb1ee4b13b0ea +b07b218321d54cecfcd2ed54a5fd588a6be8d7a5b6a66dff7facfe061222c40553e076e57cbdfa0bdb08e0a009c94ba5 +a71e1ae4d6096eac9ea4c21f621c875423de7c620544e520fb6ec3cb41a78554aedd79493cbd2c2ba4f0387f902ddd2a +807cdac291246a02f60c8937532c8969e689b1cfe811f239bfdee0791e7aa0545e9686cfb9ed0c1df84748e5efa5e3da +a1faeb4504c057304d27d54fb3ec681462384a354a4f0b6c759d4fa313253a789250c6b0f44f751b0718592637438a19 +996bcd3215182d49f1cd15a05e1e0a4bf57e264400bf14f7253c6611d2571de7130cce81fd28e0411e0a80e9054f4f98 +89d15b38f14bcd46f4b2dcae82b0e7bf9a35e40bf57aa947e9c4a8f87a440b5cea95229708de08ca596762062c34aaa0 +8d8ddcaf79374c750b8b0b3d196acb6bb921e51b4619876a29d09161ba82a42271066187211ef746f9f40a5ca17b75f7 +a3dc7f70f3a6c7edc483e712770abbaa94bfa3174cfee872b2cc011b267e0ef9baa1ab49e4a6c6c30dbba0e0a1237117 +aa9e958bbdcb192b19c43fc6fd34afcd754949fdada98e9f4848e8db0e23acb27d19dd073c951a8819000f2356aa22e1 +a4714e45ec853eadfe5c3bee7f683b81f97857bbd7833192a48936dd1460aee68f700a21658658b74b737c4fecf90c7f +a1ecab4215c1892e4a8ff3405d710163875e5dfef8a8cb84f5cac4e317d89c7696e3f496ed1747ca6f52b304190f4ba1 +b9b48943eca3686219575026d395b969e6ff8159dc5317005df090e79d26901984e40ae4b1af060ed3ff6f42e0417d76 +9644b9f90a66edb0396abd8c00066886f978ebf56fc22081031fbc9ce371bf9b04aa5a4ef59e59319b3a05bb7fb88b43 +b2bb14f1c055a78596488e4e2d4135a6470c1ee43961952160b8498f674a4d23040606e937c02c1fc23dbd47e9bd4633 +8c61f2fce9a42b94a389c7e52d7d093fc011099d0f4914f6d6f05b631df7b88182826edf9bbb1225971a080ca5c0d15a +aa6a7b8499cc7d256043eacad18528d38bf3be970bea4c6d4cb886690280bdb373688ceba3e506471e1d9493dc76f3f4 +8127703363b3b35b06762c2353d4de82b7b85bb860db1028d3640f46bdb78f2d104fa77ee3e0d9db83833d2b12a966f8 +b7b01f5909f2c66ae0fab156be5d79954e3a304615e1fe55945049dd4bd95f973bb3821117eb54db7e9ed1ee9a527652 +8be47ba5dfe212420649193490838670c40540e0ea24adbab18c4a66e7ac3dcf94f068dec2533b60e08c1f64e7533e54 +905a6c7e24b86aa54a05c329a6b4616d335bb0b1f1e9987562eee0acf82ad302c7c44981a1dd6b24c6121ca12fb92996 +86969ccfd91deed93b355a2c21319e3bb08cc652b741463bf68c626b7ba2afce3f7cc397f2fb74588c2893477c948ae2 +b5a9d20eb12c331d0d300fd4b85b0ac0bb74573178a5fac8ec9dce5e95acba07fab444260355ece442a846737a2dcd1c +a13497c11df21b11fc1a63b0ffdcf7f432da4dc2c98f8d07d36da4fa68aceb57af2158088e5b05e334fe0f264aeb7a97 +882e4597cc66498a45e86a2ed9ee24652da4699af00ad35f73b5e74fde6ac3cee70630962d5ddd86162d4aaf11bbc11c +b748858c2bafa4a14ce44af35195e9c52aa75e109719243bbe278095acbfd6a7ae7e084caf8dae6939039b5a4e8fd675 +83a2e0524507e74f51fe976441108f8226ba1b3a33f4e16ec45c5661ce80cb1840a93d17122cb8ca9e0f80d14f69877d +846cd2946c93ee5f24243d9ebc69936b3a1a6d59f45fec6c79b1eddf15ce30a8e73ad03cf606ee66baea3d8ff115f70f +8d98d0a3a94f6efe158f8423c041b546416145c5c2254bfa157efea0d1c99fe58acc7df6424ef29f75960b18d664ea4e +a39fa47e4b79f54dbf59d0b1726f1e78bc219fcfc56ad238c84b4b610e7892ff1e65d537baf5118a32f5e2eb80d5ee0c +8c30969a4519131de5e30121c84c04f67b98c8ad109fa4710dd3149cae303d51778add3f258f0482f1c89c169824dffc +af7f80d141ceb78b4762015de17fef49d7ff6202d292e9604deb508272ee7569f7fd5be3b2438da1dfecf0c26533ef86 +97cf82f70128251944d79b8845506975405bd720e150d836205b048ff36ba8801eb74cdcc6425f28f6bc0acec0a81463 +8c276c876eb88688957d1868bf3a1462375e608ff72b49870a5dac82cbf6584e00e3f36f236f732348a47502ccf9539d +964765f1a5c8a41d8025ddf56dc01b78424703d8a64a4e5539e477cb2445cb541c70127c561e717256d13f91a830ba83 +a2aacd9e21b8c8efaf2319611addea1b9f41430aee42e7f2a640cc693aa395287cc8fdc2806b76b577d84fbd05378ead +ab11eabbf5be4345a77323a3b75f9ee93b011fd2a9d0154e88183cafe47f82a7888666af16b40d3cb677c94bcc755ff7 +a0bfe715a7af5a29b1b6148b8cbee585d2b49fa6ce59bcd173ea3bbc60d71a62f9da27ffcbbd5a6da75502112fe44d70 +902e6cc38ee42245103d90b65028a471bc7a48b825599d361aa81d8c56e0fcf9fbe8d4c13802040d2cfb85b7e022eea1 +8832e2b5014fdef4003bdbb87e3298fdbdbbe49673f6b66e2373f1cb2605f9c4af2cdf9bfd45d1993208681d29ee1c9d +a7d39d3fa1ec1e0c87730fa43d4900e91932d1cafb36c76b2934907becf7d15a1d84d7234591ad4c322b5a24673bba8d +836ed5f09d99624204aa3aa7ac601980fda223f3b4b96b4a8fb235c574a3545d518787c12f81bd5851987f2860d41886 +94235e94445e6086f6e9331923262070a4c2ed930ec519eabb8a30133bd4fc6debb99185f4b668431fae1b485c5c81b7 +9828ffe20b9405f117dac044159be2d3c6e2b50ecdd1651d6a73f7633e6e2a7ba3d783ae939973604446d3a1ef0fb20f +92f03dc365dfe9154743ca70e6dd2758f064e3286fc543cf8c50f68effdf7c554bd17b3507c6ff4127046d9bbb5522ef +91ed07df479d8eb3d31292a0e987672a7f3d45ecafe72935b7abbc3f23493605134ce573f309e226c9efe830b6868220 +93bee582661e6d6cefeff29002afc2f36dd2c13dbf33f0574c35b290ddc426170a5f7f196369ad592efcd72cfb6f8fc0 +89a51467d966f48fed15dea5a12dda54d0015f69e2169b5e34f44c7b5a5d4c282d6f138116a0cd06a8476980e420f8d8 +b8ccebc14b6679ba2399370848864f15f63512fd6139df7359b7b93e82c1007fd85137ecb0597294b46643e1a9e7ab5e +841fa301567fc57b2cd09508ce75326684e12bfb8add671dc208f579b2500b93d5b641e9f59bba798ed4ed1259757f7d +b3cb45c15eb00b4ccb7013299f761cb8fefc17adf6db50e9ecb8abe927a3bc7f28e359e64693813e078e1dac800ad55b +96e55d3b9f445f5679e34fa5425b3e87cb221cfbdd07f8353868c7f7f4ba388ee3841cb9a1d638583bc20d03a9d071f2 +a7dee9377de740270c5b57cf86699004ba8dc2766af56b388b5cb0814ec71bb99ecf43ee3d82a552733854ecc7def0fe +b129dfff23b3c1c95ddb214c4711961fcb129efe2b6557ec9e116ada909593d0d2eec2c628434493393c58c52aa86847 +aed2670e201cb3e38a8be3c86735a4d76255e1e5a4c67b91df6ed262d09c8d10b0a3891da3e6ab934058cc9a7178931b +b20b8921ae52e5b3c94fa3a8b46489044174f7b897779e7763d6eb419e808d76705b7e7ba5131576f425aa81b6b0de53 +a7e45bbc3ba1bc36617291ba7663806e247f1b57a89e31520c64a90cbf8d426cac2e2f381338baf78c8f92fdbbcb7026 +a99e651e73a507e9e663e2364fcc193ec77e8afdc08c2bed6ad864e49b537ec31e9114ee72291a7657899f2033a849e2 +af966033636c2e9e8280d173f556fe07f8b6940bbcf6b2df7e2165c30bea66cced2596f6c17ca7c1aa0e614174953ba9 +b69ca7a79e3d55ef21e0ebdc6f0c4bd17182d30cf6290cccca7d2551c91c12b966020d8e40e4ee4179488c9809c03ae4 +b981cd36244e035fef043f70b1d7188d7cd045b4de0581c459fc5730e10eb7f3d5893b54cc4243849c0855e4e621167a +b20fea858a36921b35a3051ce787b73f70fdecd3fef283c15a2eb1bffb1dcba5991eee4a047ce4e87802da923fd9457b +b040e6f2e56dc1860274c263d4045837456f74b354a679f6b5ea70919835ebe5d32bf1f519e218730096c98ff396dc9d +8d2dd60e702c923a7204b530e7d6c193c6f93ca648c4f7bb38f4edbeb0aaed84184213afafb8db6aeb9197c24364276c +95dfa7348709e43d71285b28a0bfad3ca805b6ed4ae99753e9f736c79d58a35a3a50b42760ccdd03eda50f6e59494968 +b8585632a13f18c139a411bb2f02df809591834d127cd1ff081e26d0abfe0e3fbb54abea26538b25a0dcb4d7e969590e +b46ba47858a29c6d523c9982660949567666daf2582b93393a4802a9e077eedbc0d49d454731696bc8e46ca50c7caa40 +84b756b901b98a4404e58d70f39f6ccac877146c866732ae65e7e82727448d1550343bf7cdff1bfd4ee1ed73793db255 +83e5be888eaf877a2c755897410865f64a6d1169a8ccf0336092f3932abab915e542ab75a35ffe016042340d581ee987 +8cb274fc39285aed451a7def72cfbf73168ee10be02affe355a2bf87cf361a81ad284e9334cf00c5bf99a13d9f75e116 +91ff6220924b94ae13f50eeac16a159232e4f16a73fbd5c22c0e185cd1998403904d36bad203baa82b85819ee4a8ac10 +87f46e08e09aea2ab37b55fc300689d9b58ff3e72f1cffe023386035888f714fac4673c7c5193d3f3f3c568c640694f0 +835d7d84ca7641e1b15095830114aa6072fe12260d2202456cafe2308c22651af9ffbcf6b7e56af97167dd0c4e2a4cf2 +91202183f79794f114fd9e3b9bd05553c0e8985919965101a57d97ef666b028863e6cea9735af016dc1864f1542dee51 +81ab2b02a9b0a490a74ae615ddd4fe560734c1bfdde6b8dd13303c1481ba0e8ab14473535a93cfe4e824a0ab29445f8c +8a32d73f4fc006551d4e2c61eec6130355ec9b8c39a65c24ec1edc00e80155ca83a8ef2455e892521a3d47634d82a987 +af70d7b8f13bc90193cc1cfb0c400c4224cf10f1887848aa93e6380f7087782fc41a159926ab53c53eb95c2383b1a849 +989bf42f9d357c51774f1c7c0f7c0c46a8cb7398a74497141c32685be098e38b4230ffe833a6d880ec391a35b1a747b6 +94cb6715ee95700020c630b8c19e35f231de970219bd7e6ba7ced01899197da473b6c45cacfab0d652ddaf547b4ea58c +b12e3331f1f7d7458393a785e22e9a5e1d1daea521b4e78c0ee8ca59b41ade1735a29820e18f6afb2f2c3c56fecc16b6 +ad4b7cf654349d136fb41fb0dd65b588199f68b462b05f5c4e5c2b468bfaa6c26329033e3c3f7873dc8ace89cf873ea5 +a3279969e1ab596df0559ffc5ac7a6dc849680354e01c3f4fd34c6413a3f9f046f89c1e1be0b315d8b6dfab3d23d5c14 +ac74cc5562836ed89d09a9ae6a3644c936d64bdda9e77659d9982f1be29541b03ef2723236d5465e398373ea19a4ccc6 +98138ebce1af531dd8b631b3e74c84f0c700355a2a9bde31e5e51bb10c8bbd766559c63f6041f4002568803fe08438e0 +9006445da131349fe5714e0777a4f82a82da343612589a0c1596393e8b6894ce1cf42784f95ff67a8384ffe1f1a4ad76 +88502a84a85e4ce54cfed297b5d355867cc770a8ffd0714a6f23b1ab320a9903c6e42809e034bb67dbf94c4fc0d9c790 +aa8b4bf123d1a6ccaa44b86be8f980005f2a0a388a76cb111b0e85cd072ef64167fb0c097c7b23c4bca64c0260f6cce0 +ad49eb35dfea9feabb513a78dd1152ad7eba22fbb02a80cefc494a7037699c8df81202dfec12acc1b9e33ad680cb72d2 +8694da730231b29afd5196371ddcb15b4dcc499574bdd063f4864ab80749833ea38ab8b0ca1629a367fe378e87a60a86 +8eca7b488e810c479e7e32e24b8afcd837f7df183fe4f621a0336b53a9ed77603c84bdc365d8be68179a32b71a1deb7e +8875cd3e23c7e1af55af1b091025a08255743984186770bcd43f30b4a58d175cfdf1984bad97a15e08dac2da27198c3d +abdafcf58ec72997e494d4714645f40d09dcd0fbd0733e640eca44eeea67c25bb0c270299c459991f2fae59d13b4f4d5 +8f040970141e61489284f3efd907705eae6ec757fe8e1d284eac123d313e9ac1e8dc14ae3f04d281e1effc49d5d2f51d +a7ff115f0d2dbf66c0e8770b3d05157b37357b9e33e9a447f0f3fa9da69ad04e371fd1e4848cfb9e8d05e3165bd969d8 +a39b1a8c39d317fcc97bf6c396e6ed4a85640aeeadbf45166bd02bc3bdfb6266509159c03afd492e642384c635b824c0 +a2e1b90f3dd2d0038eaa5be52127844ccf35d997143179d95ffd3749c0896398b130094d01eb1bb31ffe80ef34b42b48 +a2bbe31f89b0c3c375ffaf63c8b7831860a921d5e388eb7907dbf61f2601ea40db86bb3952ecaa26a5eca4317a848ff9 +87d885bb0f2ce04b40ce94d2557c15f1698dc652e938f9a2d69a73ccf4899e08eafa1a59a20cae92823795f5b94f04b9 +8f7746370f8a24a2889d351f3e36b8a7d60e75e50e8f5abeea7dafc75441e95915721654e61ceac51bb6f112780d352c +a7272847526ed3d9e0d0fea1d8685b07b5b908971490bf8a46748c8b1783c629b8644feb5bac772ae615daae383d5e72 +978c9aa2996d8bd6fda7e0393fa8b38747f8f99712427705c00f6e9a12c36f8d8b4cedb03fcb9867155cbddb5200e6e1 +a4dec4a2354b2b32434c5bcdc380bf84580c6f9940f94dc0498a5bfe89c675a0921e66b807a3d859a6059a464cb2a9ac +99459ddecc7abce437f68722dae556d8ffaf8ed974f459e52e6d4a64f176caa4d42c2f2ec57e8a5b5f2034638e8acb0a +928c68c0c9213fe6258ab5bb0c693d97203d15da359784de7824dec143212da57d062a1fc70a79172cee31adc7aff382 +aad3f318f1622ea87e12541dfd982d71629b8f1ded4c301f9f6b6af9432716ad057773c33bdaa6f15dc151b0ee4505ea +8eb8e978f149a983fd6ad01773f9aacf57bd0cc622d8a301e404184b37e610123dd081faeda571a0ab1f149a3960af10 +851e7191d7b94bd422bcece5b92609fc1b1c8556229bc53e32963b2d2fd1cacd8ce5da9040b599eca6e610540f8a7987 +9414157fe9d50e5a0b5a7397417681bcb3a651eec1cab63f2a88d5df68ab1fef6e4c1d7ba657cbaf241a7cb790297633 +b5cb2dafdc5408959780754a58b2da55b2a9136672ebca42f34da4e329ddc89360e7218cde3efdbf784ddb390deacc57 +ac6b70f65503a8e94b773fda3e72615745824930114fe72b6d833484285462392617c1b2eea4a250fedbee88f503f3ba +b0829a5312f9ac6c06fddee2f835a3452fe994f6d42c9edfc390d7d5b3240ca544433b544cbbddd6516b38a6d5d7c21d +95f8e2c59905957e34d53be3d6fb85732f834e2cb9ab4c333fea2f502452a87ccd035fc9075d7c0bd8530bb0a0c96527 +b93f279b7045f2d97c674495f6e69a3e352f32f43cc60300193b936c2850b2805c15457251f7e3f633f435cb2b60405c +915abf16cba1a0b655b92a8a70c03e7fb306b86f3bbfb66967ca63e64c003b59c7a5953675efa4fa0bce9bed536b6700 +ac2047f50a319d09df1ec44d71afdcec5ac3bd2765dc98aba347734aa780863545df9f6d71214d443e3f37edc0dae45a +ad49c74ddb24c8a26b14ec08bc807313c77c5967fbb36237f55994d7511bbac8d7e7b9b8ec53eb1b3b066989f078dbd9 +961483105f605e959213fe9e8a52b76dac62d7efd2319ec71fc4e92d68fbe44cd2f65d7adefb2eb64d591b91648b8085 +b67fcafc97d8df2b3075bbff7b3d7471dbf1f3048f309e55d5e2c5bcbc7a73aebcb0697859be9f387cbc7ce98041e154 +8da70ac16468cab6066992389cb37c79ff5e0babbe67d76878aef9408b9597a3dc2eb5de87428bc761a0d78957b0eb28 +aec0ce89770d299b631f15ae12f94b1e1014ac57d38fcf037c2c7712d770d074affa06e97c60691bad8733874b6ad2ed +8b702c85fa4c915a09fc86507f44d7aeda0993b77af87780d70cc98d580c6e996b64b7c16cdb4dd4562cb0f75da36ee7 +aaeb43aa472aac2253e211fd1066c3a5422ea041cef20168702d0618a1a742a44f7fb30a76677640fea1a24e7fae1996 +a8820e92825d6e02b9b4ad5ebc86161d3244cddd3d244333ba1576b6ae10948145b68d9e926bf6b7a2c25dab4cf43f3e +8ffdae28a1f1d15d7ffa473628a66ee9a739073f59ba781248286b39cb8f7255f66d62337064246713cbb5017e615174 +adfc5dd142b7911326d8424881d5d92006f3b17de4cce91674d6ea37f00fbb266c791ac13f6c7a0f61d04f2a952e6a04 +87f98982444bf661f539bec73a10256f079a4baa88a1cea0351ae3de929e1c500485b2d1b5d933063cd7d9123d5050e4 +8f217ba4dd404c5ee384f0c9a126686db001ff0344c01c82174c5e5ef89d1a241b146008c534b13a0da6c8afe7450fbb +afc85476dddaf1cbb4ba8b22186789f3818c7964f9f613e55010278800cd95422702248bdf9c73760702ef24854795ec +a59e0f6ac2ccdfbd01f002008034390c0ea78716f5e0de4e474e3558755705c9c7afb6e3c5c4370e7bbc85958a9c7a63 +97c0695c58d792ec31d9b86d3b2fc1382f0855057b24d5f6a54c41f76f9e2f52882cadc89a8b2f121530e7f1393faa95 +8e49112de0b2649c08a96cf737af68fa8055f1af594846a2d0534c94df6f926f200405edaa6e6ac9db7e380707a2571d +99a1bd83a7ac5f8d77ddf044c80ebfc5745b998714696d67b94d185c97e9d6db989bacac646d9def463127a8b2febc00 +aba80725f9f9f7abe10760eca73ba427ca8df864a157122eb9af828a05b0199de3add02019a297750bdab5380e505c58 +ae18f62573275c1eb268f74c5e54e8958547f9e7d1d36a05b084eb53e5704fafe2200b8aff95cc7e9af5be2391c42b7c +908b8031d09d22b2aefeaa876a998e0a97c7a1070aad9e9c97836cc5aa6d2d5ef94230e1222074837b5e21b4e6490f01 +b3132282e8b41ca6789ec5c43c1fecf3a65b8eefbc2f3d10f746a843b9ba4ce6db664678e75e424f7b11a00c1440de15 +a1eb49440cc106ebc09cf198c93e8070271eb5a936d31c04858a2b311a037350100c7957d5545c9653f396aa968b91f4 +81df6ad1bdd5eee4cc2f94318467b8602d15cc1be2b48b09ade12cc46ee05cbaaf77a20397e5015030b1f1db5dd9dac0 +87236c68a2a93c8442d15d7f1d1dc01d1fd123439c183e1d843f4ddd2bcf638c128f66f1ef9b710e5d1f64a52726007a +84f2e7f85563bb2f61b10a712c7605d63f79af5be0dba056814fd3efebc20e9c53227c56577b72c68d185571b775eff6 +a36d4ae06688ece2927aeb2c7f058a3cd2aa1de1601282d4e688e1d76ef20728b892928deda2314eba41675eba3912f1 +b8326dcbcdcfce017b263c456c47692fb476c4225c95981666fff0b7d4522fc23b7f12273f0f47cf0442662124e6648f +84c66463ab277cda2cc7007d0509269e89cdd41c5e0d3773a92615f0fc5da63811186b05d7a11088048a5d4834a7e0df +b20d3571d970712ef4699b0e7034fd269c361f53e1572e2ea2676b4245e992d43b8b5931a801439a44d977a988cc360b +94dba6007e6d4998ca1eb84aa8e2a7e9f5c164b9d80df2825f2208ce5640a05aacac2e4f08918268990f43ae1ccab69a +a1c25f0b3ef9d1982153207570d9ce8d692e1b6963b509958dc4d9bcd80074bb221c46804a6d9a29e76149cc7787c282 +8857748fcdab1199fc96084323a81d3bd8b5a7f0b1abc5bc3b5252a19268344e2e7d2d086c90fc9b5fa4b92feedb93a4 +8b9c1d841447354b6c086549e4d1d435ab64c13933488c34bc30f0f6eb36c5c5b838b7b6bb018542247edd1ada091045 +8f5b655416da0e719a204fc567e93792c301acb4374cf7bbabc6ce51dbeaaadfd75c2db0e16ce073ab8e91fd3d7ea9d4 +90f2846b19be46a75c5cd0cafefcf9192e6fd80c479e8d6320c4b8d8d7d96703c9e77ff31a67afa9858e6b7bde1f7cce +a53e383947fd98aa1a55ac956214b46b20a52758461e8ba41341a23a835ebb713038bf048edb1202bbfd0b56a96bf292 +9542d7debbcfb9cda6fa279c699a7b655c03b9a9b456a5d3cfc41a826c94eafa43e01155a29e39ff0bcd965f4c0c512d +a43792864ec5fc549f7afc02622454afc0e425c310c4039ba615067243ebb26a4c7ebfd19bd4d57ff412a4bb2a7958a0 +b85123950e30c048465bf32365d24a5d4b21fffc6183cdbf71643a07b87463989b72dd9a6a47f134856f704909a6b38f +944ea689aec1376f855c0bc9c51378ad06ff758a2c075b95a60b535b88b36eca0be11e4edb5152e98cb2137d6e749f27 +a6bef52cda22325e4c62d323e2a0e3fa91c5552fcfce951edfd52ad6f652bfdcc2341f1cd349e6b5d447924dc569bfe2 +b56bff8ffe981bfcb30791836da10b87f2ccbe17ed969e7f7a650af07d27ae0223805b1264d985148208483be50578a6 +8b209cac898dd580c82d854a553e2517497ad1a4cd198e1360b8b50639b380aee70ee4b87625d9b2278228ff644cd25c +877cce233fec74c7158b3c5bf108365e98238418b8a71f058f1aca44a0fd3a1021e3e9025bd11fe244d9fe0f5034ce7f +b1b871aeedb03d6f6accc99816b89f5958178738d8d8cd9717527d04363c80fdb5f6848122ae19fdbc450cfa11e753c8 +858aca51b9e5b0a724e88688d5124eb24c9faf01a3d465e74d31de6da315f311143f22f60201ea09f62c92f61f09d889 +8521d409615dfc8c8289e00f6aaa6297c2c4e1439b25952afd76aac641b81c70b9cef07cd58c1c0198382bddd2bd8544 +88647c3e41666b88acca42505f1f5da226937e0522b538fe0cebb724e9a99730ca2522989e94a96cac94109aef675c0f +b417fdaf719caf38854e89ce52031b30ce61a632e6c3135adec9002280e022d82ab0ea4ac5ebdb21f1f0169e4c37bcda +9367a6feb5e23ea2eab8ddd5e7bdf32b4d2419fad1c71a1ed327b77362d8942dad971a1c2e6f7073885149cdf0a0c339 +a71c5c08d50c57d094d6a4f02e97d3799bada92f238ffc07bd223bbe8379507b7310d20b28f5bbbf331e5e153515e491 +9630a9a3bcb044b51299c4d3d3388a4ff47308dd27be3229601985478c0f6b55faa7e20815d8694f910611396a9d0d45 +b0bfaf56a5aa59b48960aa7c1617e832e65c823523fb2a5cd44ba606800501cf873e8db1d0dda64065285743dc40786e \ No newline at end of file From 0570b6084b25b9489b921bc5fe977b56ce4c6c33 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 11 Mar 2025 17:07:20 +0800 Subject: [PATCH 091/107] feat(event): optimize history event service close logic --- .../core/services/event/EventService.java | 35 +++++++++++-------- .../services/event/HistoryEventService.java | 14 ++++---- .../org/tron/core/event/EventServiceTest.java | 6 ++++ .../core/event/HistoryEventServiceTest.java | 4 +-- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/event/EventService.java b/framework/src/main/java/org/tron/core/services/event/EventService.java index 0dc61a7809c..d4ec52c7730 100644 --- a/framework/src/main/java/org/tron/core/services/event/EventService.java +++ b/framework/src/main/java/org/tron/core/services/event/EventService.java @@ -24,32 +24,34 @@ public class EventService { @Autowired private Manager manager; + private EventPluginLoader instance = EventPluginLoader.getInstance(); + public void init() { logger.info("Start to load eventPlugin. {}, {}, {} " + "block: {}, {} trx: {}, {}, {} event: {}, {} log: {}, {}, {}, {} solid: {}", manager.isEventPluginLoaded(), - EventPluginLoader.getInstance().getVersion(), - EventPluginLoader.getInstance().getStartSyncBlockNum(), + instance.getVersion(), + instance.getStartSyncBlockNum(), - EventPluginLoader.getInstance().isBlockLogTriggerEnable(), - EventPluginLoader.getInstance().isBlockLogTriggerSolidified(), + instance.isBlockLogTriggerEnable(), + instance.isBlockLogTriggerSolidified(), - EventPluginLoader.getInstance().isTransactionLogTriggerEnable(), - EventPluginLoader.getInstance().isTransactionLogTriggerSolidified(), - EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible(), + instance.isTransactionLogTriggerEnable(), + instance.isTransactionLogTriggerSolidified(), + instance.isTransactionLogTriggerEthCompatible(), - EventPluginLoader.getInstance().isContractEventTriggerEnable(), - EventPluginLoader.getInstance().isSolidityEventTriggerEnable(), + instance.isContractEventTriggerEnable(), + instance.isSolidityEventTriggerEnable(), - EventPluginLoader.getInstance().isContractLogTriggerEnable(), - EventPluginLoader.getInstance().isContractLogTriggerRedundancy(), - EventPluginLoader.getInstance().isSolidityLogTriggerEnable(), - EventPluginLoader.getInstance().isSolidityLogTriggerRedundancy(), + instance.isContractLogTriggerEnable(), + instance.isContractLogTriggerRedundancy(), + instance.isSolidityLogTriggerEnable(), + instance.isSolidityLogTriggerRedundancy(), - EventPluginLoader.getInstance().isSolidityTriggerEnable()); + instance.isSolidityTriggerEnable()); - if (!manager.isEventPluginLoaded() || EventPluginLoader.getInstance().getVersion() != 1) { + if (!manager.isEventPluginLoaded() || instance.getVersion() != 1) { return; } @@ -57,6 +59,9 @@ public void init() { } public void close() { + if (!manager.isEventPluginLoaded() || instance.getVersion() != 1) { + return; + } historyEventService.close(); blockEventLoad.close(); realtimeEventService.close(); diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java index fb202734b22..12bdbcc3c15 100644 --- a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -29,7 +29,7 @@ public class HistoryEventService { @Autowired private Manager manager; - private volatile boolean isRunning; + private volatile Thread thread; public void init() { if (instance.getStartSyncBlockNum() <= 0) { @@ -37,22 +37,24 @@ public void init() { return; } - isRunning = true; - - new Thread(() -> syncEvent(), "history-event").start(); + thread = new Thread(() -> syncEvent(), "history-event"); + thread.start(); logger.info("History event service start."); } public void close() { - isRunning = false; + if (thread != null) { + thread.interrupt(); + } + logger.info("History event service close."); } private void syncEvent() { try { long tmp = instance.getStartSyncBlockNum(); long endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); - while (tmp <= endNum && isRunning) { + while (tmp <= endNum) { BlockEvent blockEvent = blockEventGet.getBlockEvent(tmp); realtimeEventService.flush(blockEvent, false); solidEventService.flush(blockEvent); diff --git a/framework/src/test/java/org/tron/core/event/EventServiceTest.java b/framework/src/test/java/org/tron/core/event/EventServiceTest.java index 373bfe7d3ec..ff7aafb1d1a 100644 --- a/framework/src/test/java/org/tron/core/event/EventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/EventServiceTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.mockito.Mockito; +import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.utils.ReflectUtils; import org.tron.core.capsule.BlockCapsule; import org.tron.core.db.Manager; @@ -38,5 +39,10 @@ public void test() { eventService.init(); eventService.close(); + + EventPluginLoader instance = mock(EventPluginLoader.class); + Mockito.when(instance.getVersion()).thenReturn(1); + ReflectUtils.setFieldValue(eventService, "instance", instance); + eventService.close(); } } diff --git a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java index f51d2dbe490..b34d2a5f338 100644 --- a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java @@ -44,6 +44,7 @@ public void test() throws Exception { ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService); ReflectUtils.setFieldValue(historyEventService, "blockEventLoad", blockEventLoad); historyEventService.init(); + historyEventService.close(); solidEventService.close(); realtimeEventService.close(); blockEventLoad.close(); @@ -71,7 +72,6 @@ public void test() throws Exception { Mockito.when(blockEventGet.getBlockEvent(1)).thenReturn(be2); Mockito.when(instance.getStartSyncBlockNum()).thenReturn(1L); - ReflectUtils.setFieldValue(historyEventService, "isRunning", true); Mockito.when(dynamicPropertiesStore.getLatestSolidifiedBlockNum()).thenReturn(1L); Mockito.when(chainBaseManager.getBlockIdByNum(1L)) @@ -80,6 +80,6 @@ public void test() throws Exception { Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent"); method1.setAccessible(true); method1.invoke(historyEventService); - + historyEventService.close(); } } From 2519294ec84eace7905b9490ad77de87ed1c994a Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Tue, 11 Mar 2025 18:20:28 +0800 Subject: [PATCH 092/107] feat(event): improve HistoryEventService unit test --- .../test/java/org/tron/core/event/HistoryEventServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java index b34d2a5f338..7a50c8a0c35 100644 --- a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java @@ -80,6 +80,8 @@ public void test() throws Exception { Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent"); method1.setAccessible(true); method1.invoke(historyEventService); + + historyEventService.init(); historyEventService.close(); } } From b753741f1afeded93d4609b67132d4ca58de6df1 Mon Sep 17 00:00:00 2001 From: waynercheung Date: Thu, 13 Mar 2025 22:26:10 +0800 Subject: [PATCH 093/107] feat(jsonrpc): eth_newFilter not supports finalized as block parameter --- .../services/jsonrpc/TronJsonRpcImpl.java | 12 +++ .../jsonrpc/filters/LogFilterWrapper.java | 3 +- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 83 ++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 5ff915dbdc9..8be1f6a5faa 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -138,6 +138,7 @@ public enum RequestSource { public static final String LATEST_STR = "latest"; public static final String FINALIZED_STR = "finalized"; public static final String TAG_PENDING_SUPPORT_ERROR = "TAG pending not supported"; + public static final String INVALID_BLOCK_RANGE = "invalid block range params"; private static final String JSON_ERROR = "invalid json request"; private static final String BLOCK_NUM_ERROR = "invalid block number"; @@ -1114,6 +1115,14 @@ public void disableInPBFT(String method) throws JsonRpcMethodNotFoundException { } } + public void disableFinalizedBlock(FilterRequest fr) throws JsonRpcInvalidParamsException { + // not supports finalized as block parameter + if (FINALIZED_STR.equalsIgnoreCase(fr.getFromBlock()) + || FINALIZED_STR.equalsIgnoreCase(fr.getToBlock())) { + throw new JsonRpcInvalidParamsException(INVALID_BLOCK_RANGE); + } + } + @Override public TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, @@ -1234,6 +1243,9 @@ public String newFilter(FilterRequest fr) throws JsonRpcInvalidParamsException, JsonRpcMethodNotFoundException { disableInPBFT("eth_newFilter"); + // not supports finalized as block parameter + disableFinalizedBlock(fr); + Map eventFilter2Result; if (getSource() == RequestSource.FULLNODE) { eventFilter2Result = eventFilter2ResultFull; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java index 7fcbab33ee3..e1d448b00d7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -1,6 +1,7 @@ package org.tron.core.services.jsonrpc.filters; import static org.tron.common.math.Maths.min; +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.INVALID_BLOCK_RANGE; import com.google.protobuf.ByteString; import lombok.Getter; @@ -83,7 +84,7 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet toBlockSrc = Long.MAX_VALUE; } if (fromBlockSrc > toBlockSrc) { - throw new JsonRpcInvalidParamsException("please verify: fromBlock <= toBlock"); + throw new JsonRpcInvalidParamsException(INVALID_BLOCK_RANGE); } } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index 8ab6611dfdd..4cbae5ff931 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -605,7 +605,7 @@ public void testLogFilterWrapper() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); + Assert.assertEquals("invalid block range params", e.getMessage()); } //fromBlock or toBlock is not hex num @@ -644,4 +644,85 @@ public void testLogFilterWrapper() { Assert.assertEquals("Incorrect hex syntax", e.getMessage()); } } + + @Test + public void testDisableFinalizedBlock() { + + try { + tronJsonRpc.disableFinalizedBlock(new FilterRequest(null, null, null, null, null)); + } catch (Exception e) { + Assert.fail(); + } + + try { + tronJsonRpc.disableFinalizedBlock(new FilterRequest("finalized", null, null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.disableFinalizedBlock(new FilterRequest(null, "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.disableFinalizedBlock(new FilterRequest("finalized", "latest", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.disableFinalizedBlock(new FilterRequest("0x1", "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.disableFinalizedBlock( + new FilterRequest("finalized", "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + } + + @Test + public void testNewFilterFinalizedBlock() { + + try { + tronJsonRpc.newFilter(new FilterRequest(null, null, null, null, null)); + } catch (Exception e) { + Assert.fail(); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("finalized", null, null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.newFilter(new FilterRequest(null, "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("finalized", "latest", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("0x1", "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + + try { + tronJsonRpc.newFilter(new FilterRequest("finalized", "finalized", null, null, null)); + } catch (Exception e) { + Assert.assertEquals("invalid block range params", e.getMessage()); + } + } } From 4e404ece6f197f4e525aa937f49b1c6b62865a82 Mon Sep 17 00:00:00 2001 From: waynercheung Date: Fri, 14 Mar 2025 09:46:24 +0800 Subject: [PATCH 094/107] refactor(jsonrpc): check finalized in newFilter, not as a function --- .../services/jsonrpc/TronJsonRpcImpl.java | 13 ++---- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 41 ------------------- 2 files changed, 4 insertions(+), 50 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 8be1f6a5faa..6b90ec92283 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -1115,14 +1115,6 @@ public void disableInPBFT(String method) throws JsonRpcMethodNotFoundException { } } - public void disableFinalizedBlock(FilterRequest fr) throws JsonRpcInvalidParamsException { - // not supports finalized as block parameter - if (FINALIZED_STR.equalsIgnoreCase(fr.getFromBlock()) - || FINALIZED_STR.equalsIgnoreCase(fr.getToBlock())) { - throw new JsonRpcInvalidParamsException(INVALID_BLOCK_RANGE); - } - } - @Override public TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, @@ -1244,7 +1236,10 @@ public String newFilter(FilterRequest fr) throws JsonRpcInvalidParamsException, disableInPBFT("eth_newFilter"); // not supports finalized as block parameter - disableFinalizedBlock(fr); + if (FINALIZED_STR.equalsIgnoreCase(fr.getFromBlock()) + || FINALIZED_STR.equalsIgnoreCase(fr.getToBlock())) { + throw new JsonRpcInvalidParamsException(INVALID_BLOCK_RANGE); + } Map eventFilter2Result; if (getSource() == RequestSource.FULLNODE) { diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index 4cbae5ff931..6a0ab4a3745 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -645,47 +645,6 @@ public void testLogFilterWrapper() { } } - @Test - public void testDisableFinalizedBlock() { - - try { - tronJsonRpc.disableFinalizedBlock(new FilterRequest(null, null, null, null, null)); - } catch (Exception e) { - Assert.fail(); - } - - try { - tronJsonRpc.disableFinalizedBlock(new FilterRequest("finalized", null, null, null, null)); - } catch (Exception e) { - Assert.assertEquals("invalid block range params", e.getMessage()); - } - - try { - tronJsonRpc.disableFinalizedBlock(new FilterRequest(null, "finalized", null, null, null)); - } catch (Exception e) { - Assert.assertEquals("invalid block range params", e.getMessage()); - } - - try { - tronJsonRpc.disableFinalizedBlock(new FilterRequest("finalized", "latest", null, null, null)); - } catch (Exception e) { - Assert.assertEquals("invalid block range params", e.getMessage()); - } - - try { - tronJsonRpc.disableFinalizedBlock(new FilterRequest("0x1", "finalized", null, null, null)); - } catch (Exception e) { - Assert.assertEquals("invalid block range params", e.getMessage()); - } - - try { - tronJsonRpc.disableFinalizedBlock( - new FilterRequest("finalized", "finalized", null, null, null)); - } catch (Exception e) { - Assert.assertEquals("invalid block range params", e.getMessage()); - } - } - @Test public void testNewFilterFinalizedBlock() { From 8841b5e2cf1f3aa949b8e6d8a439696a6162baac Mon Sep 17 00:00:00 2001 From: waynercheung Date: Fri, 14 Mar 2025 11:49:40 +0800 Subject: [PATCH 095/107] feat(jsonrpc): keep old version err_msg when block range is invalid(from > to) for eth_getLogs and eth_newFilter --- .../tron/core/services/jsonrpc/filters/LogFilterWrapper.java | 3 +-- .../test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java index e1d448b00d7..7fcbab33ee3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -1,7 +1,6 @@ package org.tron.core.services.jsonrpc.filters; import static org.tron.common.math.Maths.min; -import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.INVALID_BLOCK_RANGE; import com.google.protobuf.ByteString; import lombok.Getter; @@ -84,7 +83,7 @@ public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet toBlockSrc = Long.MAX_VALUE; } if (fromBlockSrc > toBlockSrc) { - throw new JsonRpcInvalidParamsException(INVALID_BLOCK_RANGE); + throw new JsonRpcInvalidParamsException("please verify: fromBlock <= toBlock"); } } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index 6a0ab4a3745..7af59f28ace 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -605,7 +605,7 @@ public void testLogFilterWrapper() { LogFilterWrapper logFilterWrapper = new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); } catch (JsonRpcInvalidParamsException e) { - Assert.assertEquals("invalid block range params", e.getMessage()); + Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); } //fromBlock or toBlock is not hex num From 97213d996ff954361c910e128c90ed0f297e9b77 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Fri, 14 Mar 2025 14:10:51 +0800 Subject: [PATCH 096/107] feat(version): update version to 4.8.0 --- framework/src/main/java/org/tron/program/Version.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index ec0e14d786a..feff4d0f92f 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -4,7 +4,7 @@ public class Version { public static final String VERSION_NAME = "GreatVoyage-v4.7.6-12-gf4da4fafb1"; public static final String VERSION_CODE = "18386"; - private static final String VERSION = "4.7.7"; + private static final String VERSION = "4.8.0"; public static String getVersion() { return VERSION; From 4aa4a98944c71ef39006cca6bb4fd0a8b937115a Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Wed, 19 Mar 2025 17:06:03 +0800 Subject: [PATCH 097/107] feat(event): set internalTransactionList to null in the new event service --- .../main/java/org/tron/core/services/event/BlockEventGet.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java index fd34a1fe50f..be15a499d3f 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventGet.java @@ -65,7 +65,9 @@ public BlockEvent getBlockEvent(long blockNum) throws Exception { } if (instance.isTransactionLogTriggerEnable()) { - blockEvent.setTransactionLogTriggerCapsules(getTransactionLogTrigger(block, solidNum)); + List list = getTransactionLogTrigger(block, solidNum); + list.forEach(t -> t.getTransactionLogTrigger().setInternalTransactionList(null)); + blockEvent.setTransactionLogTriggerCapsules(list); } if (instance.isContractLogTriggerEnable() From 716af38ed4428c7f5c8ed32e0d822a81f08138e8 Mon Sep 17 00:00:00 2001 From: Liulei Date: Thu, 20 Mar 2025 10:45:37 +0800 Subject: [PATCH 098/107] opt(tvm): kzg precompile contract log --- .../src/main/java/org/tron/core/vm/PrecompiledContracts.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 8a1e7535754..5fbbdde3b21 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -2239,8 +2239,8 @@ public Pair execute(byte[] data) { } else { return Pair.of(false, DataWord.ZERO().getData()); } - } catch (RuntimeException exception) { - logger.warn("KZG point evaluation precompile contract failed", exception); + } catch (RuntimeException e) { + logger.warn("KZG point evaluation precompile contract failed {}", e.getMessage()); return Pair.of(false, DataWord.ZERO().getData()); } } From c1ecb3cbbce672e8b75de908826e409b5e43a804 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Fri, 21 Mar 2025 17:31:27 +0800 Subject: [PATCH 099/107] feat(event): limite block loading speed --- .../common/logsfilter/EventPluginLoader.java | 20 +++++++++ .../logsfilter/IPluginEventListener.java | 2 + .../core/services/event/BlockEventLoad.java | 10 ++++- .../services/event/HistoryEventService.java | 7 ++- .../core/event/EventPluginLoaderTest.java | 43 +++++++++++++++++++ .../core/event/HistoryEventServiceTest.java | 9 ++++ 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/event/EventPluginLoaderTest.java diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index 7896eeffae4..0a7a5ac3a76 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -9,6 +9,8 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; + +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.pf4j.CompoundPluginDescriptorFinder; @@ -31,6 +33,8 @@ public class EventPluginLoader { private static EventPluginLoader instance; + private long MAX_PENDING_SIZE = 50000; + private PluginManager pluginManager = null; private List eventListeners; @@ -73,6 +77,7 @@ public class EventPluginLoader { private FilterQuery filterQuery; + @Getter private boolean useNativeQueue = false; public static EventPluginLoader getInstance() { @@ -537,6 +542,21 @@ public void postContractEventTrigger(ContractEventTrigger trigger) { } } + public boolean isBusy() { + if (useNativeQueue) { + return false; + } + int queueSize = 0; + for (IPluginEventListener listener : eventListeners) { + try { + queueSize += listener.getPendingSize(); + } catch (AbstractMethodError error) { + break; + } + } + return queueSize >= MAX_PENDING_SIZE; + } + private String toJsonString(Object data) { String jsonData = ""; diff --git a/framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java b/framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java index e1ef5b59536..63e23d18842 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java +++ b/framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java @@ -13,6 +13,8 @@ public interface IPluginEventListener extends ExtensionPoint { // start should be called after setServerAddress, setTopic, setDBConfig void start(); + int getPendingSize(); + void handleBlockEvent(Object trigger); void handleTransactionTrigger(Object trigger); diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java index 382973ccfa5..577190333b0 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.logsfilter.EventPluginLoader; import org.tron.core.db.Manager; import org.tron.core.services.event.bo.BlockEvent; import org.tron.core.services.event.bo.Event; @@ -26,13 +27,19 @@ public class BlockEventLoad { @Autowired private BlockEventGet blockEventGet; + private EventPluginLoader instance = EventPluginLoader.getInstance(); + private final ScheduledExecutorService executor = ExecutorServiceManager .newSingleThreadScheduledExecutor("event-load"); + private long MAX_LOAD_NUM = 100; + public void init() { executor.scheduleWithFixedDelay(() -> { try { - load(); + if (!instance.isBusy()) { + load(); + } } catch (Exception e) { close(); logger.error("Event load service fail.", e); @@ -62,6 +69,7 @@ public synchronized void load() throws Exception { if (cacheHeadNum >= tmpNum) { return; } + tmpNum = Math.min(tmpNum, cacheHeadNum + MAX_LOAD_NUM); List l1 = new ArrayList<>(); List l2 = new ArrayList<>(); BlockEvent tmp = BlockEventCache.getHead(); diff --git a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java index 12bdbcc3c15..8f79ee47a3c 100644 --- a/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java +++ b/framework/src/main/java/org/tron/core/services/event/HistoryEventService.java @@ -55,12 +55,17 @@ private void syncEvent() { long tmp = instance.getStartSyncBlockNum(); long endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); while (tmp <= endNum) { + if (instance.isUseNativeQueue()) { + Thread.sleep(20); + } else if (instance.isBusy()) { + Thread.sleep(100); + continue; + } BlockEvent blockEvent = blockEventGet.getBlockEvent(tmp); realtimeEventService.flush(blockEvent, false); solidEventService.flush(blockEvent); tmp++; endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); - Thread.sleep(30); } initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum)); } catch (InterruptedException e1) { diff --git a/framework/src/test/java/org/tron/core/event/EventPluginLoaderTest.java b/framework/src/test/java/org/tron/core/event/EventPluginLoaderTest.java new file mode 100644 index 00000000000..658d42f38d9 --- /dev/null +++ b/framework/src/test/java/org/tron/core/event/EventPluginLoaderTest.java @@ -0,0 +1,43 @@ +package org.tron.core.event; + +import static org.mockito.Mockito.mock; + +import java.util.ArrayList; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.common.logsfilter.EventPluginLoader; +import org.tron.common.logsfilter.IPluginEventListener; +import org.tron.common.utils.ReflectUtils; + +public class EventPluginLoaderTest { + + @Test + public void testIsBusy() { + + EventPluginLoader eventPluginLoader = EventPluginLoader.getInstance(); + ReflectUtils.setFieldValue(eventPluginLoader, "useNativeQueue", true); + boolean flag = eventPluginLoader.isBusy(); + Assert.assertFalse(flag); + + ReflectUtils.setFieldValue(eventPluginLoader, "useNativeQueue", false); + + IPluginEventListener p1 = mock(IPluginEventListener.class); + List list = new ArrayList<>(); + list.add(p1); + ReflectUtils.setFieldValue(eventPluginLoader, "eventListeners", list); + + Mockito.when(p1.getPendingSize()).thenReturn(100); + flag = eventPluginLoader.isBusy(); + Assert.assertFalse(flag); + + Mockito.when(p1.getPendingSize()).thenReturn(60000); + flag = eventPluginLoader.isBusy(); + Assert.assertTrue(flag); + + Mockito.when(p1.getPendingSize()).thenThrow(new AbstractMethodError()); + flag = eventPluginLoader.isBusy(); + Assert.assertFalse(flag); + } +} diff --git a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java index 7a50c8a0c35..49f77ccf597 100644 --- a/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java +++ b/framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java @@ -26,6 +26,9 @@ public class HistoryEventServiceTest { @Test public void test() throws Exception { EventPluginLoader instance = mock(EventPluginLoader.class); + Mockito.when(instance.isUseNativeQueue()).thenReturn(true); + Mockito.when(instance.isUseNativeQueue()).thenReturn(false); + ReflectUtils.setFieldValue(historyEventService, "instance", instance); DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class); @@ -39,6 +42,7 @@ public void test() throws Exception { SolidEventService solidEventService = new SolidEventService(); RealtimeEventService realtimeEventService = new RealtimeEventService(); BlockEventLoad blockEventLoad = new BlockEventLoad(); + ReflectUtils.setFieldValue(blockEventLoad, "instance", instance); ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService); ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService); @@ -77,11 +81,16 @@ public void test() throws Exception { Mockito.when(chainBaseManager.getBlockIdByNum(1L)) .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1)); + Mockito.when(instance.isUseNativeQueue()).thenReturn(true); + Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent"); method1.setAccessible(true); method1.invoke(historyEventService); + Mockito.when(instance.isUseNativeQueue()).thenReturn(false); + Mockito.when(instance.isBusy()).thenReturn(true); historyEventService.init(); + Thread.sleep(1000); historyEventService.close(); } } From f22c18a9c5e78c9d119256298f8d0ead41fc1915 Mon Sep 17 00:00:00 2001 From: zeusoo001 Date: Mon, 24 Mar 2025 13:28:33 +0800 Subject: [PATCH 100/107] use if instead of math methods --- .../java/org/tron/core/services/event/BlockEventLoad.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java index 577190333b0..75829bf0e5e 100644 --- a/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java +++ b/framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java @@ -69,7 +69,9 @@ public synchronized void load() throws Exception { if (cacheHeadNum >= tmpNum) { return; } - tmpNum = Math.min(tmpNum, cacheHeadNum + MAX_LOAD_NUM); + if (tmpNum > cacheHeadNum + MAX_LOAD_NUM) { + tmpNum = cacheHeadNum + MAX_LOAD_NUM; + } List l1 = new ArrayList<>(); List l2 = new ArrayList<>(); BlockEvent tmp = BlockEventCache.getHead(); From ab4b70ba78858bbc5b9b2d7925c62f1a5533bb7f Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 24 Mar 2025 16:13:35 +0800 Subject: [PATCH 101/107] feat(dependencies): remove org.quartz-scheduler:quartz --- common/build.gradle | 2 - .../org/tron/common/cron/CronExpression.java | 1669 +++++++++++++++++ .../java/org/tron/common/cron/ValueSet.java | 7 + .../common/parameter/CommonParameter.java | 2 +- .../java/org/tron/core/config/args/Args.java | 2 +- .../main/java/org/tron/core/db/Manager.java | 2 +- .../tron/common/utils/ByteArrayMapTest.java | 32 +- .../org/tron/core/db/ManagerMockTest.java | 2 +- .../core/services/stop/BlockTimeStopTest.java | 18 +- gradle/verification-metadata.xml | 13 - 10 files changed, 1727 insertions(+), 22 deletions(-) create mode 100644 common/src/main/java/org/tron/common/cron/CronExpression.java create mode 100644 common/src/main/java/org/tron/common/cron/ValueSet.java diff --git a/common/build.gradle b/common/build.gradle index 25709c9b7a6..c6ce8cf44f9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -38,8 +38,6 @@ dependencies { api group: 'com.typesafe', name: 'config', version: '1.3.2' api group: leveldbGroup, name: leveldbName, version: leveldbVersion api group: 'org.rocksdb', name: 'rocksdbjni', version: '5.15.10' - // https://mvnrepository.com/artifact/org.quartz-scheduler/quartz - api group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.2' api group: 'io.prometheus', name: 'simpleclient', version: '0.15.0' api group: 'io.prometheus', name: 'simpleclient_httpserver', version: '0.15.0' api group: 'io.prometheus', name: 'simpleclient_hotspot', version: '0.15.0' diff --git a/common/src/main/java/org/tron/common/cron/CronExpression.java b/common/src/main/java/org/tron/common/cron/CronExpression.java new file mode 100644 index 00000000000..b656bdafb33 --- /dev/null +++ b/common/src/main/java/org/tron/common/cron/CronExpression.java @@ -0,0 +1,1669 @@ +/* + * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +package org.tron.common.cron; + +import java.io.Serializable; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.SortedSet; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.TreeSet; + +/** + * Provides a parser and evaluator for unix-like cron expressions. Cron + * expressions provide the ability to specify complex time combinations such as + * "At 8:00am every Monday through Friday" or "At 1:30am every + * last Friday of the month". + *

    + * Cron expressions are comprised of 6 required fields and one optional field + * separated by white space. The fields respectively are described as follows: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Field Name Allowed Values Allowed Special Characters
    Seconds  + * 0-59  + * , - * /
    Minutes  + * 0-59  + * , - * /
    Hours  + * 0-23  + * , - * /
    Day-of-month  + * 1-31  + * , - * ? / L W
    Month  + * 0-11 or JAN-DEC  + * , - * /
    Day-of-Week  + * 1-7 or SUN-SAT  + * , - * ? / L #
    Year (Optional)  + * empty, 1970-2199  + * , - * /
    + *

    + * The '*' character is used to specify all values. For example, "*" + * in the minute field means "every minute". + *

    + * The '?' character is allowed for the day-of-month and day-of-week fields. It + * is used to specify 'no specific value'. This is useful when you need to + * specify something in one of the two fields, but not the other. + *

    + * The '-' character is used to specify ranges For example "10-12" in + * the hour field means "the hours 10, 11 and 12". + *

    + * The ',' character is used to specify additional values. For example + * "MON,WED,FRI" in the day-of-week field means "the days Monday, + * Wednesday, and Friday". + *

    + * The '/' character is used to specify increments. For example "0/15" + * in the seconds field means "the seconds 0, 15, 30, and 45". And + * "5/15" in the seconds field means "the seconds 5, 20, 35, and + * 50". Specifying '*' before the '/' is equivalent to specifying 0 is + * the value to start with. Essentially, for each field in the expression, there + * is a set of numbers that can be turned on or off. For seconds and minutes, + * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + * 31, and for months 0 to 11 (JAN to DEC). The "/" character simply helps you turn + * on every "nth" value in the given set. Thus "7/6" in the + * month field only turns on month "7", it does NOT mean every 6th + * month, please note that subtlety. + *

    + * The 'L' character is allowed for the day-of-month and day-of-week fields. + * This character is short-hand for "last", but it has different + * meaning in each of the two fields. For example, the value "L" in + * the day-of-month field means "the last day of the month" - day 31 + * for January, day 28 for February on non-leap years. If used in the + * day-of-week field by itself, it simply means "7" or + * "SAT". But if used in the day-of-week field after another value, it + * means "the last xxx day of the month" - for example "6L" + * means "the last friday of the month". You can also specify an offset + * from the last day of the month, such as "L-3" which would mean the third-to-last + * day of the calendar month. When using the 'L' option, it is important not to + * specify lists, or ranges of values, as you'll get confusing/unexpected results. + *

    + * The 'W' character is allowed for the day-of-month field. This character + * is used to specify the weekday (Monday-Friday) nearest the given day. As an + * example, if you were to specify "15W" as the value for the + * day-of-month field, the meaning is: "the nearest weekday to the 15th of + * the month". So if the 15th is a Saturday, the trigger will fire on + * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + * However if you specify "1W" as the value for day-of-month, and the + * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + * 'jump' over the boundary of a month's days. The 'W' character can only be + * specified when the day-of-month is a single day, not a range or list of days. + *

    + * The 'L' and 'W' characters can also be combined for the day-of-month + * expression to yield 'LW', which translates to "last weekday of the + * month". + *

    + * The '#' character is allowed for the day-of-week field. This character is + * used to specify "the nth" XXX day of the month. For example, the + * value of "6#3" in the day-of-week field means the third Friday of + * the month (day 6 = Friday and "#3" = the 3rd one in the month). + * Other examples: "2#1" = the first Monday of the month and + * "4#5" = the fifth Wednesday of the month. Note that if you specify + * "#5" and there is not 5 of the given day-of-week in the month, then + * no firing will occur that month. If the '#' character is used, there can + * only be one expression in the day-of-week field ("3#1,6#3" is + * not valid, since there are two expressions). + *

    + * + *

    + * The legal characters and the names of months and days of the week are not + * case sensitive. + * + *

    + * NOTES: + *

      + *
    • Support for specifying both a day-of-week and a day-of-month value is + * not complete (you'll need to use the '?' character in one of these fields). + *
    • + *
    • Overflowing ranges is supported - that is, having a larger number on + * the left hand side than the right. You might do 22-2 to catch 10 o'clock + * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + * very important to note that overuse of overflowing ranges creates ranges + * that don't make sense and no effort has been made to determine which + * interpretation CronExpression chooses. An example would be + * "0 0 14-6 ? * FRI-MON".
    • + *
    + *

    + * + * @author Sharada Jambula, James House + * @author Contributions from Mads Henderson + * @author Refactoring from CronTrigger to CronExpression by Aaron Craven + */ +public final class CronExpression implements Serializable, Cloneable { + + public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100; + protected static final int SECOND = 0; + protected static final int MINUTE = 1; + protected static final int HOUR = 2; + protected static final int DAY_OF_MONTH = 3; + protected static final int MONTH = 4; + protected static final int DAY_OF_WEEK = 5; + protected static final int YEAR = 6; + protected static final int ALL_SPEC_INT = 99; // '*' + protected static final int NO_SPEC_INT = 98; // '?' + protected static final Integer ALL_SPEC = ALL_SPEC_INT; + protected static final Integer NO_SPEC = NO_SPEC_INT; + + protected static final Map monthMap = new HashMap(20); + protected static final Map dayMap = new HashMap(60); + private static final long serialVersionUID = 12423409423L; + + static { + monthMap.put("JAN", 0); + monthMap.put("FEB", 1); + monthMap.put("MAR", 2); + monthMap.put("APR", 3); + monthMap.put("MAY", 4); + monthMap.put("JUN", 5); + monthMap.put("JUL", 6); + monthMap.put("AUG", 7); + monthMap.put("SEP", 8); + monthMap.put("OCT", 9); + monthMap.put("NOV", 10); + monthMap.put("DEC", 11); + + dayMap.put("SUN", 1); + dayMap.put("MON", 2); + dayMap.put("TUE", 3); + dayMap.put("WED", 4); + dayMap.put("THU", 5); + dayMap.put("FRI", 6); + dayMap.put("SAT", 7); + } + + private final String cronExpression; + protected transient TreeSet seconds; + protected transient TreeSet minutes; + protected transient TreeSet hours; + protected transient TreeSet daysOfMonth; + protected transient TreeSet months; + protected transient TreeSet daysOfWeek; + protected transient TreeSet years; + + protected transient boolean lastdayOfWeek = false; + protected transient int nthdayOfWeek = 0; + protected transient boolean lastdayOfMonth = false; + protected transient boolean nearestWeekday = false; + protected transient int lastdayOffset = 0; + protected transient boolean expressionParsed = false; + private TimeZone timeZone = null; + + /** + * Constructs a new CronExpression based on the specified + * parameter. + * + * @param cronExpression String representation of the cron expression the + * new object should represent + * @throws java.text.ParseException if the string expression cannot be parsed into a valid + * CronExpression + */ + public CronExpression(String cronExpression) throws ParseException { + if (cronExpression == null) { + throw new IllegalArgumentException("cronExpression cannot be null"); + } + + this.cronExpression = cronExpression.toUpperCase(Locale.US); + + buildExpression(this.cronExpression); + } + + /** + * Constructs a new {@code CronExpression} as a copy of an existing + * instance. + * + * @param expression The existing cron expression to be copied + */ + public CronExpression(CronExpression expression) { + /* + * We don't call the other constructor here since we need to swallow the + * ParseException. We also elide some of the sanity checking as it is + * not logically trippable. + */ + this.cronExpression = expression.getCronExpression(); + try { + buildExpression(cronExpression); + } catch (ParseException ex) { + throw new AssertionError(); + } + if (expression.getTimeZone() != null) { + setTimeZone((TimeZone) expression.getTimeZone().clone()); + } + } + + /** + * Indicates whether the specified cron expression can be parsed into a + * valid cron expression + * + * @param cronExpression the expression to evaluate + * @return a boolean indicating whether the given expression is a valid cron + * expression + */ + public static boolean isValidExpression(String cronExpression) { + + try { + new CronExpression(cronExpression); + } catch (ParseException pe) { + return false; + } + + return true; + } + + public static void validateExpression(String cronExpression) throws ParseException { + + new CronExpression(cronExpression); + } + + /** + * Indicates whether the given date satisfies the cron expression. Note that + * milliseconds are ignored, so two Dates falling on different milliseconds + * of the same second will always have the same result here. + * + * @param date the date to evaluate + * @return a boolean indicating whether the given date satisfies the cron + * expression + */ + public boolean isSatisfiedBy(Date date) { + Calendar testDateCal = Calendar.getInstance(getTimeZone()); + testDateCal.setTime(date); + testDateCal.set(Calendar.MILLISECOND, 0); + Date originalDate = testDateCal.getTime(); + + testDateCal.add(Calendar.SECOND, -1); + + Date timeAfter = getTimeAfter(testDateCal.getTime()); + + return ((timeAfter != null) && (timeAfter.equals(originalDate))); + } + + /** + * Returns the next date/time after the given date/time which + * satisfies the cron expression. + * + * @param date the date/time at which to begin the search for the next valid + * date/time + * @return the next valid date/time + */ + public Date getNextValidTimeAfter(Date date) { + return getTimeAfter(date); + } + + /** + * Returns the next date/time after the given date/time which does + * not satisfy the expression + * + * @param date the date/time at which to begin the search for the next + * invalid date/time + * @return the next valid date/time + */ + public Date getNextInvalidTimeAfter(Date date) { + long difference = 1000; + + //move back to the nearest second so differences will be accurate + Calendar adjustCal = Calendar.getInstance(getTimeZone()); + adjustCal.setTime(date); + adjustCal.set(Calendar.MILLISECOND, 0); + Date lastDate = adjustCal.getTime(); + + Date newDate; + + //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution. + + //keep getting the next included time until it's farther than one second + // apart. At that point, lastDate is the last valid fire time. We return + // the second immediately following it. + while (difference == 1000) { + newDate = getTimeAfter(lastDate); + if (newDate == null) + break; + + difference = newDate.getTime() - lastDate.getTime(); + + if (difference == 1000) { + lastDate = newDate; + } + } + + return new Date(lastDate.getTime() + 1000); + } + + /** + * Returns the time zone for which this CronExpression + * will be resolved. + */ + public TimeZone getTimeZone() { + if (timeZone == null) { + timeZone = TimeZone.getDefault(); + } + + return timeZone; + } + + /** + * Sets the time zone for which this CronExpression + * will be resolved. + */ + public void setTimeZone(TimeZone timeZone) { + this.timeZone = timeZone; + } + + /** + * Returns the string representation of the CronExpression + * + * @return a string representation of the CronExpression + */ + @Override + public String toString() { + return cronExpression; + } + + + //////////////////////////////////////////////////////////////////////////// + // + // Expression Parsing Functions + // + //////////////////////////////////////////////////////////////////////////// + + protected void buildExpression(String expression) throws ParseException { + expressionParsed = true; + + try { + + if (seconds == null) { + seconds = new TreeSet(); + } + if (minutes == null) { + minutes = new TreeSet(); + } + if (hours == null) { + hours = new TreeSet(); + } + if (daysOfMonth == null) { + daysOfMonth = new TreeSet(); + } + if (months == null) { + months = new TreeSet(); + } + if (daysOfWeek == null) { + daysOfWeek = new TreeSet(); + } + if (years == null) { + years = new TreeSet(); + } + + int exprOn = SECOND; + + StringTokenizer exprsTok = new StringTokenizer(expression, " \t", + false); + + while (exprsTok.hasMoreTokens() && exprOn <= YEAR) { + String expr = exprsTok.nextToken().trim(); + + // throw an exception if L is used with other days of the month + if (exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); + } + // throw an exception if L is used with other days of the week + if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1); + } + if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') + 1) != -1) { + throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1); + } + + StringTokenizer vTok = new StringTokenizer(expr, ","); + while (vTok.hasMoreTokens()) { + String v = vTok.nextToken(); + storeExpressionVals(0, v, exprOn); + } + + exprOn++; + } + + if (exprOn <= DAY_OF_WEEK) { + throw new ParseException("Unexpected end of expression.", + expression.length()); + } + + if (exprOn <= YEAR) { + storeExpressionVals(0, "*", YEAR); + } + + TreeSet dow = getSet(DAY_OF_WEEK); + TreeSet dom = getSet(DAY_OF_MONTH); + + // Copying the logic from the UnsupportedOperationException below + boolean dayOfMSpec = !dom.contains(NO_SPEC); + boolean dayOfWSpec = !dow.contains(NO_SPEC); + + if (!dayOfMSpec || dayOfWSpec) { + if (!dayOfWSpec || dayOfMSpec) { + throw new ParseException( + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); + } + } + } catch (ParseException pe) { + throw pe; + } catch (Exception e) { + throw new ParseException("Illegal cron expression format (" + + e.toString() + ")", 0); + } + } + + protected int storeExpressionVals(int pos, String s, int type) + throws ParseException { + + int incr = 0; + int i = skipWhiteSpace(pos, s); + if (i >= s.length()) { + return i; + } + char c = s.charAt(i); + if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW")) && (!s.matches("^L-[0-9]*[W]?"))) { + String sub = s.substring(i, i + 3); + int sval = -1; + int eval = -1; + if (type == MONTH) { + sval = getMonthNumber(sub) + 1; + if (sval <= 0) { + throw new ParseException("Invalid Month value: '" + sub + "'", i); + } + if (s.length() > i + 3) { + c = s.charAt(i + 3); + if (c == '-') { + i += 4; + sub = s.substring(i, i + 3); + eval = getMonthNumber(sub) + 1; + if (eval <= 0) { + throw new ParseException("Invalid Month value: '" + sub + "'", i); + } + } + } + } else if (type == DAY_OF_WEEK) { + sval = getDayOfWeekNumber(sub); + if (sval < 0) { + throw new ParseException("Invalid Day-of-Week value: '" + + sub + "'", i); + } + if (s.length() > i + 3) { + c = s.charAt(i + 3); + if (c == '-') { + i += 4; + sub = s.substring(i, i + 3); + eval = getDayOfWeekNumber(sub); + if (eval < 0) { + throw new ParseException( + "Invalid Day-of-Week value: '" + sub + + "'", i); + } + } else if (c == '#') { + try { + i += 4; + nthdayOfWeek = Integer.parseInt(s.substring(i)); + if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + throw new Exception(); + } + } catch (Exception e) { + throw new ParseException( + "A numeric value between 1 and 5 must follow the '#' option", + i); + } + } else if (c == 'L') { + lastdayOfWeek = true; + i++; + } + } + + } else { + throw new ParseException( + "Illegal characters for this position: '" + sub + "'", + i); + } + if (eval != -1) { + incr = 1; + } + addToSet(sval, eval, incr, type); + return (i + 3); + } + + if (c == '?') { + i++; + if ((i + 1) < s.length() + && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) { + throw new ParseException("Illegal character after '?': " + + s.charAt(i), i); + } + if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) { + throw new ParseException( + "'?' can only be specified for Day-of-Month or Day-of-Week.", + i); + } + if (type == DAY_OF_WEEK && !lastdayOfMonth) { + int val = daysOfMonth.last(); + if (val == NO_SPEC_INT) { + throw new ParseException( + "'?' can only be specified for Day-of-Month -OR- Day-of-Week.", + i); + } + } + + addToSet(NO_SPEC_INT, -1, 0, type); + return i; + } + + if (c == '*' || c == '/') { + if (c == '*' && (i + 1) >= s.length()) { + addToSet(ALL_SPEC_INT, -1, incr, type); + return i + 1; + } else if (c == '/' + && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s + .charAt(i + 1) == '\t')) { + throw new ParseException("'/' must be followed by an integer.", i); + } else if (c == '*') { + i++; + } + c = s.charAt(i); + if (c == '/') { // is an increment specified? + i++; + if (i >= s.length()) { + throw new ParseException("Unexpected end of string.", i); + } + + incr = getNumericValue(s, i); + + i++; + if (incr > 10) { + i++; + } + checkIncrementRange(incr, type, i); + } else { + incr = 1; + } + + addToSet(ALL_SPEC_INT, -1, incr, type); + return i; + } else if (c == 'L') { + i++; + if (type == DAY_OF_MONTH) { + lastdayOfMonth = true; + } + if (type == DAY_OF_WEEK) { + addToSet(7, 7, 0, type); + } + if (type == DAY_OF_MONTH && s.length() > i) { + c = s.charAt(i); + if (c == '-') { + ValueSet vs = getValue(0, s, i + 1); + lastdayOffset = vs.value; + if (lastdayOffset > 30) + throw new ParseException("Offset from last day must be <= 30", i + 1); + i = vs.pos; + } + if (s.length() > i) { + c = s.charAt(i); + if (c == 'W') { + nearestWeekday = true; + i++; + } + } + } + return i; + } else if (c >= '0' && c <= '9') { + int val = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + addToSet(val, -1, -1, type); + } else { + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(val, s, i); + val = vs.value; + i = vs.pos; + } + i = checkNext(i, s, val, type); + return i; + } + } else { + throw new ParseException("Unexpected character: " + c, i); + } + + return i; + } + + private void checkIncrementRange(int incr, int type, int idxPos) throws ParseException { + if (incr > 59 && (type == SECOND || type == MINUTE)) { + throw new ParseException("Increment > 60 : " + incr, idxPos); + } else if (incr > 23 && (type == HOUR)) { + throw new ParseException("Increment > 24 : " + incr, idxPos); + } else if (incr > 31 && (type == DAY_OF_MONTH)) { + throw new ParseException("Increment > 31 : " + incr, idxPos); + } else if (incr > 7 && (type == DAY_OF_WEEK)) { + throw new ParseException("Increment > 7 : " + incr, idxPos); + } else if (incr > 12 && (type == MONTH)) { + throw new ParseException("Increment > 12 : " + incr, idxPos); + } + } + + protected int checkNext(int pos, String s, int val, int type) + throws ParseException { + + int end = -1; + int i = pos; + + if (i >= s.length()) { + addToSet(val, end, -1, type); + return i; + } + + char c = s.charAt(pos); + + if (c == 'L') { + if (type == DAY_OF_WEEK) { + if (val < 1 || val > 7) + throw new ParseException("Day-of-Week values must be between 1 and 7", -1); + lastdayOfWeek = true; + } else { + throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i); + } + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == 'W') { + if (type == DAY_OF_MONTH) { + nearestWeekday = true; + } else { + throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i); + } + if (val > 31) + throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == '#') { + if (type != DAY_OF_WEEK) { + throw new ParseException("'#' option is not valid here. (pos=" + i + ")", i); + } + i++; + try { + nthdayOfWeek = Integer.parseInt(s.substring(i)); + if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + throw new Exception(); + } + } catch (Exception e) { + throw new ParseException( + "A numeric value between 1 and 5 must follow the '#' option", + i); + } + + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == '-') { + i++; + c = s.charAt(i); + int v = Integer.parseInt(String.valueOf(c)); + end = v; + i++; + if (i >= s.length()) { + addToSet(val, end, 1, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v, s, i); + end = vs.value; + i = vs.pos; + } + if (i < s.length() && ((c = s.charAt(i)) == '/')) { + i++; + c = s.charAt(i); + int v2 = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + addToSet(val, end, v2, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v2, s, i); + int v3 = vs.value; + addToSet(val, end, v3, type); + i = vs.pos; + return i; + } else { + addToSet(val, end, v2, type); + return i; + } + } else { + addToSet(val, end, 1, type); + return i; + } + } + + if (c == '/') { + if ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\t') { + throw new ParseException("'/' must be followed by an integer.", i); + } + + i++; + c = s.charAt(i); + int v2 = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + checkIncrementRange(v2, type, i); + addToSet(val, end, v2, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v2, s, i); + int v3 = vs.value; + checkIncrementRange(v3, type, i); + addToSet(val, end, v3, type); + i = vs.pos; + return i; + } else { + throw new ParseException("Unexpected character '" + c + "' after '/'", i); + } + } + + addToSet(val, end, 0, type); + i++; + return i; + } + + public String getCronExpression() { + return cronExpression; + } + + public String getExpressionSummary() { + StringBuilder buf = new StringBuilder(); + + buf.append("seconds: "); + buf.append(getExpressionSetSummary(seconds)); + buf.append("\n"); + buf.append("minutes: "); + buf.append(getExpressionSetSummary(minutes)); + buf.append("\n"); + buf.append("hours: "); + buf.append(getExpressionSetSummary(hours)); + buf.append("\n"); + buf.append("daysOfMonth: "); + buf.append(getExpressionSetSummary(daysOfMonth)); + buf.append("\n"); + buf.append("months: "); + buf.append(getExpressionSetSummary(months)); + buf.append("\n"); + buf.append("daysOfWeek: "); + buf.append(getExpressionSetSummary(daysOfWeek)); + buf.append("\n"); + buf.append("lastdayOfWeek: "); + buf.append(lastdayOfWeek); + buf.append("\n"); + buf.append("nearestWeekday: "); + buf.append(nearestWeekday); + buf.append("\n"); + buf.append("NthDayOfWeek: "); + buf.append(nthdayOfWeek); + buf.append("\n"); + buf.append("lastdayOfMonth: "); + buf.append(lastdayOfMonth); + buf.append("\n"); + buf.append("years: "); + buf.append(getExpressionSetSummary(years)); + buf.append("\n"); + + return buf.toString(); + } + + protected String getExpressionSetSummary(java.util.Set set) { + + if (set.contains(NO_SPEC)) { + return "?"; + } + if (set.contains(ALL_SPEC)) { + return "*"; + } + + StringBuilder buf = new StringBuilder(); + + Iterator itr = set.iterator(); + boolean first = true; + while (itr.hasNext()) { + Integer iVal = itr.next(); + String val = iVal.toString(); + if (!first) { + buf.append(","); + } + buf.append(val); + first = false; + } + + return buf.toString(); + } + + protected String getExpressionSetSummary(java.util.ArrayList list) { + + if (list.contains(NO_SPEC)) { + return "?"; + } + if (list.contains(ALL_SPEC)) { + return "*"; + } + + StringBuilder buf = new StringBuilder(); + + Iterator itr = list.iterator(); + boolean first = true; + while (itr.hasNext()) { + Integer iVal = itr.next(); + String val = iVal.toString(); + if (!first) { + buf.append(","); + } + buf.append(val); + first = false; + } + + return buf.toString(); + } + + protected int skipWhiteSpace(int i, String s) { + for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) { + ; + } + + return i; + } + + protected int findNextWhiteSpace(int i, String s) { + for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) { + ; + } + + return i; + } + + protected void addToSet(int val, int end, int incr, int type) + throws ParseException { + + TreeSet set = getSet(type); + + if (type == SECOND || type == MINUTE) { + if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Minute and Second values must be between 0 and 59", + -1); + } + } else if (type == HOUR) { + if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Hour values must be between 0 and 23", -1); + } + } else if (type == DAY_OF_MONTH) { + if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT)) { + throw new ParseException( + "Day of month values must be between 1 and 31", -1); + } + } else if (type == MONTH) { + if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Month values must be between 1 and 12", -1); + } + } else if (type == DAY_OF_WEEK) { + if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT)) { + throw new ParseException( + "Day-of-Week values must be between 1 and 7", -1); + } + } + + if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) { + if (val != -1) { + set.add(val); + } else { + set.add(NO_SPEC); + } + + return; + } + + int startAt = val; + int stopAt = end; + + if (val == ALL_SPEC_INT && incr <= 0) { + incr = 1; + set.add(ALL_SPEC); // put in a marker, but also fill values + } + + if (type == SECOND || type == MINUTE) { + if (stopAt == -1) { + stopAt = 59; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 0; + } + } else if (type == HOUR) { + if (stopAt == -1) { + stopAt = 23; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 0; + } + } else if (type == DAY_OF_MONTH) { + if (stopAt == -1) { + stopAt = 31; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == MONTH) { + if (stopAt == -1) { + stopAt = 12; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == DAY_OF_WEEK) { + if (stopAt == -1) { + stopAt = 7; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == YEAR) { + if (stopAt == -1) { + stopAt = MAX_YEAR; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1970; + } + } + + // if the end of the range is before the start, then we need to overflow into + // the next day, month etc. This is done by adding the maximum amount for that + // type, and using modulus max to determine the value being added. + int max = -1; + if (stopAt < startAt) { + switch (type) { + case SECOND: + max = 60; + break; + case MINUTE: + max = 60; + break; + case HOUR: + max = 24; + break; + case MONTH: + max = 12; + break; + case DAY_OF_WEEK: + max = 7; + break; + case DAY_OF_MONTH: + max = 31; + break; + case YEAR: + throw new IllegalArgumentException("Start year must be less than stop year"); + default: + throw new IllegalArgumentException("Unexpected type encountered"); + } + stopAt += max; + } + + for (int i = startAt; i <= stopAt; i += incr) { + if (max == -1) { + // ie: there's no max to overflow over + set.add(i); + } else { + // take the modulus to get the real value + int i2 = i % max; + + // 1-indexed ranges should not include 0, and should include their max + if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH)) { + i2 = max; + } + + set.add(i2); + } + } + } + + TreeSet getSet(int type) { + switch (type) { + case SECOND: + return seconds; + case MINUTE: + return minutes; + case HOUR: + return hours; + case DAY_OF_MONTH: + return daysOfMonth; + case MONTH: + return months; + case DAY_OF_WEEK: + return daysOfWeek; + case YEAR: + return years; + default: + return null; + } + } + + protected ValueSet getValue(int v, String s, int i) { + char c = s.charAt(i); + StringBuilder s1 = new StringBuilder(String.valueOf(v)); + while (c >= '0' && c <= '9') { + s1.append(c); + i++; + if (i >= s.length()) { + break; + } + c = s.charAt(i); + } + ValueSet val = new ValueSet(); + + val.pos = (i < s.length()) ? i : i + 1; + val.value = Integer.parseInt(s1.toString()); + return val; + } + + protected int getNumericValue(String s, int i) { + int endOfVal = findNextWhiteSpace(i, s); + String val = s.substring(i, endOfVal); + return Integer.parseInt(val); + } + + protected int getMonthNumber(String s) { + Integer integer = monthMap.get(s); + + if (integer == null) { + return -1; + } + + return integer; + } + + protected int getDayOfWeekNumber(String s) { + Integer integer = dayMap.get(s); + + if (integer == null) { + return -1; + } + + return integer; + } + + //////////////////////////////////////////////////////////////////////////// + // + // Computation Functions + // + //////////////////////////////////////////////////////////////////////////// + + public Date getTimeAfter(Date afterTime) { + + // Computation is based on Gregorian year only. + Calendar cl = new java.util.GregorianCalendar(getTimeZone()); + + // move ahead one second, since we're computing the time *after* the + // given time + afterTime = new Date(afterTime.getTime() + 1000); + // CronTrigger does not deal with milliseconds + cl.setTime(afterTime); + cl.set(Calendar.MILLISECOND, 0); + + boolean gotOne = false; + // loop until we've computed the next time, or we've past the endTime + while (!gotOne) { + + //if (endTime != null && cl.getTime().after(endTime)) return null; + if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... + return null; + } + + SortedSet st = null; + int t = 0; + + int sec = cl.get(Calendar.SECOND); + int min = cl.get(Calendar.MINUTE); + + // get second................................................. + st = seconds.tailSet(sec); + if (st != null && st.size() != 0) { + sec = st.first(); + } else { + sec = seconds.first(); + min++; + cl.set(Calendar.MINUTE, min); + } + cl.set(Calendar.SECOND, sec); + + min = cl.get(Calendar.MINUTE); + int hr = cl.get(Calendar.HOUR_OF_DAY); + t = -1; + + // get minute................................................. + st = minutes.tailSet(min); + if (st != null && st.size() != 0) { + t = min; + min = st.first(); + } else { + min = minutes.first(); + hr++; + } + if (min != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, min); + setCalendarHour(cl, hr); + continue; + } + cl.set(Calendar.MINUTE, min); + + hr = cl.get(Calendar.HOUR_OF_DAY); + int day = cl.get(Calendar.DAY_OF_MONTH); + t = -1; + + // get hour................................................... + st = hours.tailSet(hr); + if (st != null && st.size() != 0) { + t = hr; + hr = st.first(); + } else { + hr = hours.first(); + day++; + } + if (hr != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + setCalendarHour(cl, hr); + continue; + } + cl.set(Calendar.HOUR_OF_DAY, hr); + + day = cl.get(Calendar.DAY_OF_MONTH); + int mon = cl.get(Calendar.MONTH) + 1; + // '+ 1' because calendar is 0-based for this field, and we are + // 1-based + t = -1; + int tmon = mon; + + // get day................................................... + boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC); + boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC); + if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule + st = daysOfMonth.tailSet(day); + if (lastdayOfMonth) { + if (!nearestWeekday) { + t = day; + day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + day -= lastdayOffset; + if (t > day) { + mon++; + if (mon > 12) { + mon = 1; + tmon = 3333; // ensure test of mon != tmon further below fails + cl.add(Calendar.YEAR, 1); + } + day = 1; + } + } else { + t = day; + day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + day -= lastdayOffset; + + java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + tcal.set(Calendar.SECOND, 0); + tcal.set(Calendar.MINUTE, 0); + tcal.set(Calendar.HOUR_OF_DAY, 0); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); + + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + int dow = tcal.get(Calendar.DAY_OF_WEEK); + + if (dow == Calendar.SATURDAY && day == 1) { + day += 2; + } else if (dow == Calendar.SATURDAY) { + day -= 1; + } else if (dow == Calendar.SUNDAY && day == ldom) { + day -= 2; + } else if (dow == Calendar.SUNDAY) { + day += 1; + } + + tcal.set(Calendar.SECOND, sec); + tcal.set(Calendar.MINUTE, min); + tcal.set(Calendar.HOUR_OF_DAY, hr); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + Date nTime = tcal.getTime(); + if (nTime.before(afterTime)) { + day = 1; + mon++; + } + } + } else if (nearestWeekday) { + t = day; + day = daysOfMonth.first(); + + java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + tcal.set(Calendar.SECOND, 0); + tcal.set(Calendar.MINUTE, 0); + tcal.set(Calendar.HOUR_OF_DAY, 0); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); + + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + int dow = tcal.get(Calendar.DAY_OF_WEEK); + + if (dow == Calendar.SATURDAY && day == 1) { + day += 2; + } else if (dow == Calendar.SATURDAY) { + day -= 1; + } else if (dow == Calendar.SUNDAY && day == ldom) { + day -= 2; + } else if (dow == Calendar.SUNDAY) { + day += 1; + } + + + tcal.set(Calendar.SECOND, sec); + tcal.set(Calendar.MINUTE, min); + tcal.set(Calendar.HOUR_OF_DAY, hr); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + Date nTime = tcal.getTime(); + if (nTime.before(afterTime)) { + day = daysOfMonth.first(); + mon++; + } + } else if (st != null && st.size() != 0) { + t = day; + day = st.first(); + // make sure we don't over-run a short month, such as february + int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + if (day > lastDay) { + day = daysOfMonth.first(); + mon++; + } + } else { + day = daysOfMonth.first(); + mon++; + } + + if (day != t || mon != tmon) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we + // are 1-based + continue; + } + } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule + if (lastdayOfWeek) { // are we looking for the last XXX day of + // the month? + int dow = daysOfWeek.first(); // desired + // d-o-w + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } + if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + + if (day + daysToAdd > lDay) { // did we already miss the + // last one? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } + + // find date of last occurrence of this day in this month... + while ((day + daysToAdd + 7) <= lDay) { + daysToAdd += 7; + } + + day += daysToAdd; + + if (daysToAdd > 0) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' here because we are not promoting the month + continue; + } + + } else if (nthdayOfWeek != 0) { + // are we looking for the Nth XXX day in the month? + int dow = daysOfWeek.first(); // desired + // d-o-w + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } else if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + boolean dayShifted = false; + if (daysToAdd > 0) { + dayShifted = true; + } + + day += daysToAdd; + int weekOfMonth = day / 7; + if (day % 7 > 0) { + weekOfMonth++; + } + + daysToAdd = (nthdayOfWeek - weekOfMonth) * 7; + day += daysToAdd; + if (daysToAdd < 0 + || day > getLastDayOfMonth(mon, cl + .get(Calendar.YEAR))) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } else if (daysToAdd > 0 || dayShifted) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' here because we are NOT promoting the month + continue; + } + } else { + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int dow = daysOfWeek.first(); // desired + // d-o-w + st = daysOfWeek.tailSet(cDow); + if (st != null && st.size() > 0) { + dow = st.first(); + } + + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } + if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + + if (day + daysToAdd > lDay) { // will we pass the end of + // the month? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } else if (daysToAdd > 0) { // are we swithing days? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, + // and we are 1-based + continue; + } + } + } else { // dayOfWSpec && !dayOfMSpec + throw new UnsupportedOperationException( + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."); + } + cl.set(Calendar.DAY_OF_MONTH, day); + + mon = cl.get(Calendar.MONTH) + 1; + // '+ 1' because calendar is 0-based for this field, and we are + // 1-based + int year = cl.get(Calendar.YEAR); + t = -1; + + // test for expressions that never generate a valid fire date, + // but keep looping... + if (year > MAX_YEAR) { + return null; + } + + // get month................................................... + st = months.tailSet(mon); + if (st != null && st.size() != 0) { + t = mon; + mon = st.first(); + } else { + mon = months.first(); + year++; + } + if (mon != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + cl.set(Calendar.YEAR, year); + continue; + } + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + + year = cl.get(Calendar.YEAR); + t = -1; + + // get year................................................... + st = years.tailSet(year); + if (st != null && st.size() != 0) { + t = year; + year = st.first(); + } else { + return null; // ran out of years... + } + + if (year != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, 0); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + cl.set(Calendar.YEAR, year); + continue; + } + cl.set(Calendar.YEAR, year); + + gotOne = true; + } // while( !done ) + + return cl.getTime(); + } + + /** + * Advance the calendar to the particular hour paying particular attention + * to daylight saving problems. + * + * @param cal the calendar to operate on + * @param hour the hour to set + */ + protected void setCalendarHour(Calendar cal, int hour) { + cal.set(java.util.Calendar.HOUR_OF_DAY, hour); + if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) { + cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1); + } + } + + /** + * NOT YET IMPLEMENTED: Returns the time before the given time + * that the CronExpression matches. + */ + public Date getTimeBefore(Date endTime) { + // FUTURE_TODO: implement QUARTZ-423 + return null; + } + + /** + * NOT YET IMPLEMENTED: Returns the final time that the + * CronExpression will match. + */ + public Date getFinalFireTime() { + // FUTURE_TODO: implement QUARTZ-423 + return null; + } + + protected boolean isLeapYear(int year) { + return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); + } + + protected int getLastDayOfMonth(int monthNum, int year) { + + switch (monthNum) { + case 1: + return 31; + case 2: + return (isLeapYear(year)) ? 29 : 28; + case 3: + return 31; + case 4: + return 30; + case 5: + return 31; + case 6: + return 30; + case 7: + return 31; + case 8: + return 31; + case 9: + return 30; + case 10: + return 31; + case 11: + return 30; + case 12: + return 31; + default: + throw new IllegalArgumentException("Illegal month number: " + + monthNum); + } + } + + + private void readObject(java.io.ObjectInputStream stream) + throws java.io.IOException, ClassNotFoundException { + + stream.defaultReadObject(); + try { + buildExpression(cronExpression); + } catch (Exception ignore) { + } // never happens + } + + @Override + @Deprecated + public Object clone() { + return new CronExpression(this); + } +} diff --git a/common/src/main/java/org/tron/common/cron/ValueSet.java b/common/src/main/java/org/tron/common/cron/ValueSet.java new file mode 100644 index 00000000000..74469a62b48 --- /dev/null +++ b/common/src/main/java/org/tron/common/cron/ValueSet.java @@ -0,0 +1,7 @@ +package org.tron.common.cron; + +class ValueSet { + public int value; + + public int pos; +} diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 16fb752d82a..23974183fdc 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -8,7 +8,7 @@ import java.util.Set; import lombok.Getter; import lombok.Setter; -import org.quartz.CronExpression; +import org.tron.common.cron.CronExpression; import org.tron.common.args.GenesisBlock; import org.tron.common.config.DbBackupConfig; import org.tron.common.logsfilter.EventPluginConfig; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index edf82c3068c..b09b3b8c847 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -42,7 +42,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.quartz.CronExpression; +import org.tron.common.cron.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.args.Account; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3635f38d9ad..d856ccb8a11 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -46,7 +46,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.bouncycastle.util.encoders.Hex; -import org.quartz.CronExpression; +import org.tron.common.cron.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.api.GrpcAPI.TransactionInfoList; diff --git a/framework/src/test/java/org/tron/common/utils/ByteArrayMapTest.java b/framework/src/test/java/org/tron/common/utils/ByteArrayMapTest.java index 8abdc3e3def..b367ade7e4f 100644 --- a/framework/src/test/java/org/tron/common/utils/ByteArrayMapTest.java +++ b/framework/src/test/java/org/tron/common/utils/ByteArrayMapTest.java @@ -8,14 +8,14 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; -import com.mchange.v2.collection.MapEntry; import java.util.Collection; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; +import lombok.Getter; import org.junit.Before; import org.junit.Test; -import org.tron.core.db.ByteArrayWrapper; public class ByteArrayMapTest { @@ -142,4 +142,32 @@ public void test() { assertTrue(testMap.hashCode() <= 0); assertNotNull(testMap.toString()); } + + + @Getter + static class MapEntry implements Map.Entry { + K key; + V value; + + public MapEntry(K key, V value) { + this.key = key; + this.value = value; + } + + public V setValue(V o) { + throw new UnsupportedOperationException(); + } + + public boolean equals(Object o) { + if (o instanceof Map.Entry) { + Map.Entry other = (Map.Entry) o; + return Objects.equals(key, other.getKey()) && Objects.equals(value, other.getValue()); + } + return false; + } + + public int hashCode() { + return Objects.hashCode(key) ^ Objects.hashCode(value); + } + } } diff --git a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java index 65726857809..364b86c82b4 100644 --- a/framework/src/test/java/org/tron/core/db/ManagerMockTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerMockTest.java @@ -31,7 +31,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.quartz.CronExpression; +import org.tron.common.cron.CronExpression; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.ProgramResult; import org.tron.common.utils.Sha256Hash; diff --git a/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java b/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java index 86c32e66507..c529cafbba9 100644 --- a/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java +++ b/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java @@ -5,7 +5,8 @@ import java.util.Date; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; -import org.quartz.CronExpression; +import org.junit.Test; +import org.tron.common.cron.CronExpression; import org.tron.common.parameter.CommonParameter; @Slf4j @@ -25,6 +26,21 @@ public class BlockTimeStopTest extends ConditionallyStopTest { } } + @Test + public void isValidExpression() { + Assert.assertTrue(CronExpression.isValidExpression(cronExpression.getCronExpression())); + ParseException err = Assert.assertThrows(ParseException.class, () -> + CronExpression.validateExpression("invalid expression")); + Assert.assertEquals("Illegal characters for this position: 'INV'", err.getMessage()); + } + + @Test + public void getNextTime() { + Date date = cronExpression.getNextValidTimeAfter(new Date()); + Date invalidDate = cronExpression.getNextInvalidTimeAfter(new Date()); + Assert.assertNotEquals(date, invalidDate); + } + protected void initParameter(CommonParameter parameter) { parameter.setShutdownBlockTime(cronExpression); diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 34ab41b748a..b3c879f6b40 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -2088,19 +2088,6 @@ - - - - - - - - - - - - - From ee58884a50fabe0654e41edef6b642d57c26d9f2 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 25 Mar 2025 22:31:27 +0800 Subject: [PATCH 102/107] feat(CI): fix Sonar Check & CheckStyle --- .../org/tron/common/cron/CronExpression.java | 762 ++++++------------ .../java/org/tron/common/cron/ValueSet.java | 4 +- .../java/org/tron/core/config/args/Args.java | 2 +- .../main/java/org/tron/core/db/Manager.java | 2 +- .../tron/common/cron/CronExpressionTest.java | 450 +++++++++++ .../core/services/stop/BlockTimeStopTest.java | 16 - 6 files changed, 706 insertions(+), 530 deletions(-) create mode 100644 framework/src/test/java/org/tron/common/cron/CronExpressionTest.java diff --git a/common/src/main/java/org/tron/common/cron/CronExpression.java b/common/src/main/java/org/tron/common/cron/CronExpression.java index b656bdafb33..0445ec2ce5b 100644 --- a/common/src/main/java/org/tron/common/cron/CronExpression.java +++ b/common/src/main/java/org/tron/common/cron/CronExpression.java @@ -1,5 +1,6 @@ /* * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. + * Copyright IBM Corp. 2024, 2025 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy @@ -22,9 +23,9 @@ import java.util.Calendar; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.SortedSet; import java.util.StringTokenizer; import java.util.TimeZone; @@ -35,83 +36,86 @@ * expressions provide the ability to specify complex time combinations such as * "At 8:00am every Monday through Friday" or "At 1:30am every * last Friday of the month". - *

    + *

    * Cron expressions are comprised of 6 required fields and one optional field * separated by white space. The fields respectively are described as follows: - * - * + *

    + *
    + * * - * - * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * * - * - * - * + * + * + * + * + * * *
    Examples of cron expressions and their meanings.
    Field Name Allowed Values Allowed Special CharactersField Name Allowed Values Allowed Special Characters
    Seconds  - * 0-59  - * , - * /Seconds 0-59 , - * /
    Minutes  - * 0-59  - * , - * /Minutes 0-59 , - * /
    Hours  - * 0-23  - * , - * /Hours 0-23 , - * /
    Day-of-month  - * 1-31  - * , - * ? / L WDay-of-month 1-31 , - * ? / L W
    Month  - * 0-11 or JAN-DEC  - * , - * /Month 0-11 or JAN-DEC , - * /
    Day-of-Week  - * 1-7 or SUN-SAT  - * , - * ? / L #Day-of-Week 1-7 or SUN-SAT , - * ? / L #
    Year (Optional)  - * empty, 1970-2199  - * , - * /Year (Optional) empty, 1970-2199 , - * /
    - *

    + *

    * The '*' character is used to specify all values. For example, "*" * in the minute field means "every minute". - *

    + *

    + *

    * The '?' character is allowed for the day-of-month and day-of-week fields. It * is used to specify 'no specific value'. This is useful when you need to * specify something in one of the two fields, but not the other. - *

    + *

    * The '-' character is used to specify ranges For example "10-12" in * the hour field means "the hours 10, 11 and 12". - *

    + *

    * The ',' character is used to specify additional values. For example * "MON,WED,FRI" in the day-of-week field means "the days Monday, * Wednesday, and Friday". - *

    + *

    + *

    * The '/' character is used to specify increments. For example "0/15" * in the seconds field means "the seconds 0, 15, 30, and 45". And * "5/15" in the seconds field means "the seconds 5, 20, 35, and @@ -123,7 +127,8 @@ * on every "nth" value in the given set. Thus "7/6" in the * month field only turns on month "7", it does NOT mean every 6th * month, please note that subtlety. - *

    + *

    + *

    * The 'L' character is allowed for the day-of-month and day-of-week fields. * This character is short-hand for "last", but it has different * meaning in each of the two fields. For example, the value "L" in @@ -136,7 +141,8 @@ * from the last day of the month, such as "L-3" which would mean the third-to-last * day of the calendar month. When using the 'L' option, it is important not to * specify lists, or ranges of values, as you'll get confusing/unexpected results. - *

    + *

    + *

    * The 'W' character is allowed for the day-of-month field. This character * is used to specify the weekday (Monday-Friday) nearest the given day. As an * example, if you were to specify "15W" as the value for the @@ -148,11 +154,13 @@ * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not * 'jump' over the boundary of a month's days. The 'W' character can only be * specified when the day-of-month is a single day, not a range or list of days. - *

    + *

    + *

    * The 'L' and 'W' characters can also be combined for the day-of-month * expression to yield 'LW', which translates to "last weekday of the * month". - *

    + *

    + *

    * The '#' character is allowed for the day-of-week field. This character is * used to specify "the nth" XXX day of the month. For example, the * value of "6#3" in the day-of-week field means the third Friday of @@ -163,7 +171,7 @@ * no firing will occur that month. If the '#' character is used, there can * only be one expression in the day-of-week field ("3#1,6#3" is * not valid, since there are two expressions). - *

    + *

    * - *

    + *

    * The legal characters and the names of months and days of the week are not * case sensitive. * *

    * NOTES: + *

    *
      *
    • Support for specifying both a day-of-week and a day-of-month value is * not complete (you'll need to use the '?' character in one of these fields). @@ -189,29 +198,30 @@ * interpretation CronExpression chooses. An example would be * "0 0 14-6 ? * FRI-MON".
    • *
    - *

    * * @author Sharada Jambula, James House * @author Contributions from Mads Henderson * @author Refactoring from CronTrigger to CronExpression by Aaron Craven */ -public final class CronExpression implements Serializable, Cloneable { +public final class CronExpression implements Serializable { public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100; - protected static final int SECOND = 0; - protected static final int MINUTE = 1; - protected static final int HOUR = 2; - protected static final int DAY_OF_MONTH = 3; - protected static final int MONTH = 4; - protected static final int DAY_OF_WEEK = 5; - protected static final int YEAR = 6; - protected static final int ALL_SPEC_INT = 99; // '*' - protected static final int NO_SPEC_INT = 98; // '?' - protected static final Integer ALL_SPEC = ALL_SPEC_INT; - protected static final Integer NO_SPEC = NO_SPEC_INT; - - protected static final Map monthMap = new HashMap(20); - protected static final Map dayMap = new HashMap(60); + private static final int SECOND = 0; + private static final int MINUTE = 1; + private static final int HOUR = 2; + private static final int DAY_OF_MONTH = 3; + private static final int MONTH = 4; + private static final int DAY_OF_WEEK = 5; + private static final int YEAR = 6; + private static final int ALL_SPEC_INT = 99; // '*' + private static final int NO_SPEC_INT = 98; // '?' + private static final int MAX_LAST_DAY_OFFSET = 30; + private static final int LAST_DAY_OFFSET_START = 32; // "L-30" + private static final int LAST_DAY_OFFSET_END = LAST_DAY_OFFSET_START + MAX_LAST_DAY_OFFSET; // 'L' + private static final Integer ALL_SPEC = ALL_SPEC_INT; + private static final Integer NO_SPEC = NO_SPEC_INT; + private static final Map monthMap = new HashMap<>(20); + private static final Map dayMap = new HashMap<>(60); private static final long serialVersionUID = 12423409423L; static { @@ -238,21 +248,17 @@ public final class CronExpression implements Serializable, Cloneable { } private final String cronExpression; - protected transient TreeSet seconds; - protected transient TreeSet minutes; - protected transient TreeSet hours; - protected transient TreeSet daysOfMonth; - protected transient TreeSet months; - protected transient TreeSet daysOfWeek; - protected transient TreeSet years; - - protected transient boolean lastdayOfWeek = false; - protected transient int nthdayOfWeek = 0; - protected transient boolean lastdayOfMonth = false; - protected transient boolean nearestWeekday = false; - protected transient int lastdayOffset = 0; - protected transient boolean expressionParsed = false; private TimeZone timeZone = null; + private transient TreeSet seconds; + private transient TreeSet minutes; + private transient TreeSet hours; + private transient TreeSet daysOfMonth; + private transient TreeSet nearestWeekdays; + private transient TreeSet months; + private transient TreeSet daysOfWeek; + private transient TreeSet years; + private transient boolean lastDayOfWeek = false; + private transient int nthDayOfWeek = 0; /** * Constructs a new CronExpression based on the specified @@ -261,7 +267,7 @@ public final class CronExpression implements Serializable, Cloneable { * @param cronExpression String representation of the cron expression the * new object should represent * @throws java.text.ParseException if the string expression cannot be parsed into a valid - * CronExpression + * CronExpression */ public CronExpression(String cronExpression) throws ParseException { if (cronExpression == null) { @@ -273,29 +279,6 @@ public CronExpression(String cronExpression) throws ParseException { buildExpression(this.cronExpression); } - /** - * Constructs a new {@code CronExpression} as a copy of an existing - * instance. - * - * @param expression The existing cron expression to be copied - */ - public CronExpression(CronExpression expression) { - /* - * We don't call the other constructor here since we need to swallow the - * ParseException. We also elide some of the sanity checking as it is - * not logically trippable. - */ - this.cronExpression = expression.getCronExpression(); - try { - buildExpression(cronExpression); - } catch (ParseException ex) { - throw new AssertionError(); - } - if (expression.getTimeZone() != null) { - setTimeZone((TimeZone) expression.getTimeZone().clone()); - } - } - /** * Indicates whether the specified cron expression can be parsed into a * valid cron expression @@ -305,18 +288,15 @@ public CronExpression(CronExpression expression) { * expression */ public static boolean isValidExpression(String cronExpression) { - try { - new CronExpression(cronExpression); + validateExpression(cronExpression); } catch (ParseException pe) { return false; } - return true; - } + } public static void validateExpression(String cronExpression) throws ParseException { - new CronExpression(cronExpression); } @@ -327,7 +307,7 @@ public static void validateExpression(String cronExpression) throws ParseExcepti * * @param date the date to evaluate * @return a boolean indicating whether the given date satisfies the cron - * expression + * expression */ public boolean isSatisfiedBy(Date date) { Calendar testDateCal = Calendar.getInstance(getTimeZone()); @@ -354,45 +334,6 @@ public Date getNextValidTimeAfter(Date date) { return getTimeAfter(date); } - /** - * Returns the next date/time after the given date/time which does - * not satisfy the expression - * - * @param date the date/time at which to begin the search for the next - * invalid date/time - * @return the next valid date/time - */ - public Date getNextInvalidTimeAfter(Date date) { - long difference = 1000; - - //move back to the nearest second so differences will be accurate - Calendar adjustCal = Calendar.getInstance(getTimeZone()); - adjustCal.setTime(date); - adjustCal.set(Calendar.MILLISECOND, 0); - Date lastDate = adjustCal.getTime(); - - Date newDate; - - //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution. - - //keep getting the next included time until it's farther than one second - // apart. At that point, lastDate is the last valid fire time. We return - // the second immediately following it. - while (difference == 1000) { - newDate = getTimeAfter(lastDate); - if (newDate == null) - break; - - difference = newDate.getTime() - lastDate.getTime(); - - if (difference == 1000) { - lastDate = newDate; - } - } - - return new Date(lastDate.getTime() + 1000); - } - /** * Returns the time zone for which this CronExpression * will be resolved. @@ -423,38 +364,32 @@ public String toString() { return cronExpression; } - - //////////////////////////////////////////////////////////////////////////// - // - // Expression Parsing Functions - // - //////////////////////////////////////////////////////////////////////////// - - protected void buildExpression(String expression) throws ParseException { - expressionParsed = true; - + private void buildExpression(String expression) throws ParseException { try { if (seconds == null) { - seconds = new TreeSet(); + seconds = new TreeSet<>(); } if (minutes == null) { - minutes = new TreeSet(); + minutes = new TreeSet<>(); } if (hours == null) { - hours = new TreeSet(); + hours = new TreeSet<>(); } if (daysOfMonth == null) { - daysOfMonth = new TreeSet(); + daysOfMonth = new TreeSet<>(); + } + if (nearestWeekdays == null) { + nearestWeekdays = new TreeSet<>(); } if (months == null) { - months = new TreeSet(); + months = new TreeSet<>(); } if (daysOfWeek == null) { - daysOfWeek = new TreeSet(); + daysOfWeek = new TreeSet<>(); } if (years == null) { - years = new TreeSet(); + years = new TreeSet<>(); } int exprOn = SECOND; @@ -462,19 +397,23 @@ protected void buildExpression(String expression) throws ParseException { StringTokenizer exprsTok = new StringTokenizer(expression, " \t", false); + if(exprsTok.countTokens() > 7) { + throw new ParseException("Invalid expression has too many terms: " + expression, -1); + } + while (exprsTok.hasMoreTokens() && exprOn <= YEAR) { String expr = exprsTok.nextToken().trim(); - // throw an exception if L is used with other days of the month - if (exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { - throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); - } // throw an exception if L is used with other days of the week - if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { - throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1); + if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 + && expr.contains(",")) { + throw new ParseException("Support for specifying 'L' " + + "with other days of the week is not implemented", -1); } - if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') + 1) != -1) { - throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1); + if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 + && expr.indexOf('#', expr.indexOf('#') +1) != -1) { + throw new ParseException( + "Support for specifying multiple \"nth\" days is not implemented.", -1); } StringTokenizer vTok = new StringTokenizer(expr, ","); @@ -487,8 +426,7 @@ protected void buildExpression(String expression) throws ParseException { } if (exprOn <= DAY_OF_WEEK) { - throw new ParseException("Unexpected end of expression.", - expression.length()); + throw new ParseException("Unexpected end of expression.", expression.length()); } if (exprOn <= YEAR) { @@ -502,21 +440,19 @@ protected void buildExpression(String expression) throws ParseException { boolean dayOfMSpec = !dom.contains(NO_SPEC); boolean dayOfWSpec = !dow.contains(NO_SPEC); - if (!dayOfMSpec || dayOfWSpec) { - if (!dayOfWSpec || dayOfMSpec) { - throw new ParseException( - "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); - } + if ((!dayOfMSpec || dayOfWSpec) && (!dayOfWSpec || dayOfMSpec)) { + throw new ParseException( + "Support for specifying both a day-of-week AND a day-of-month" + + " parameter is not implemented.", 0); } } catch (ParseException pe) { throw pe; } catch (Exception e) { - throw new ParseException("Illegal cron expression format (" - + e.toString() + ")", 0); + throw new ParseException("Illegal cron expression format (" + e + ")", 0); } } - protected int storeExpressionVals(int pos, String s, int type) + private int storeExpressionVals(int pos, String s, int type) throws ParseException { int incr = 0; @@ -525,9 +461,10 @@ protected int storeExpressionVals(int pos, String s, int type) return i; } char c = s.charAt(i); - if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW")) && (!s.matches("^L-[0-9]*[W]?"))) { + if ((c >= 'A') && (c <= 'Z') && (!"L".equals(s)) && (!"LW".equals(s)) + && (!s.matches("^L-[0-9]*[W]?"))) { String sub = s.substring(i, i + 3); - int sval = -1; + int sval; int eval = -1; if (type == MONTH) { sval = getMonthNumber(sub) + 1; @@ -548,8 +485,7 @@ protected int storeExpressionVals(int pos, String s, int type) } else if (type == DAY_OF_WEEK) { sval = getDayOfWeekNumber(sub); if (sval < 0) { - throw new ParseException("Invalid Day-of-Week value: '" - + sub + "'", i); + throw new ParseException("Invalid Day-of-Week value: '" + sub + "'", i); } if (s.length() > i + 3) { c = s.charAt(i + 3); @@ -558,32 +494,27 @@ protected int storeExpressionVals(int pos, String s, int type) sub = s.substring(i, i + 3); eval = getDayOfWeekNumber(sub); if (eval < 0) { - throw new ParseException( - "Invalid Day-of-Week value: '" + sub - + "'", i); + throw new ParseException("Invalid Day-of-Week value: '" + sub + "'", i); } } else if (c == '#') { try { i += 4; - nthdayOfWeek = Integer.parseInt(s.substring(i)); - if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + nthDayOfWeek = Integer.parseInt(s.substring(i)); + if (nthDayOfWeek < 1 || nthDayOfWeek > 5) { throw new Exception(); } } catch (Exception e) { throw new ParseException( - "A numeric value between 1 and 5 must follow the '#' option", - i); + "A numeric value between 1 and 5 must follow the '#' option", i); } } else if (c == 'L') { - lastdayOfWeek = true; + lastDayOfWeek = true; i++; } } } else { - throw new ParseException( - "Illegal characters for this position: '" + sub + "'", - i); + throw new ParseException("Illegal characters for this position: '" + sub + "'", i); } if (eval != -1) { incr = 1; @@ -596,21 +527,14 @@ protected int storeExpressionVals(int pos, String s, int type) i++; if ((i + 1) < s.length() && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) { - throw new ParseException("Illegal character after '?': " - + s.charAt(i), i); + throw new ParseException("Illegal character after '?': " + s.charAt(i), i); } if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) { throw new ParseException( - "'?' can only be specified for Day-of-Month or Day-of-Week.", - i); + "'?' can only be specified for Day-of-Month or Day-of-Week.", i); } - if (type == DAY_OF_WEEK && !lastdayOfMonth) { - int val = daysOfMonth.last(); - if (val == NO_SPEC_INT) { - throw new ParseException( - "'?' can only be specified for Day-of-Month -OR- Day-of-Week.", - i); - } + if ((type == DAY_OF_WEEK) && (!daysOfMonth.isEmpty() && daysOfMonth.last() == NO_SPEC_INT)) { + throw new ParseException("'?' can only be specified for Day-of-Month -OR- Day-of-Week.", i); } addToSet(NO_SPEC_INT, -1, 0, type); @@ -650,27 +574,36 @@ protected int storeExpressionVals(int pos, String s, int type) return i; } else if (c == 'L') { i++; - if (type == DAY_OF_MONTH) { - lastdayOfMonth = true; - } if (type == DAY_OF_WEEK) { addToSet(7, 7, 0, type); } - if (type == DAY_OF_MONTH && s.length() > i) { - c = s.charAt(i); - if (c == '-') { - ValueSet vs = getValue(0, s, i + 1); - lastdayOffset = vs.value; - if (lastdayOffset > 30) - throw new ParseException("Offset from last day must be <= 30", i + 1); - i = vs.pos; - } + if (type == DAY_OF_MONTH) { + int dom = LAST_DAY_OFFSET_END; + boolean nearestWeekday = false; if (s.length() > i) { c = s.charAt(i); - if (c == 'W') { - nearestWeekday = true; - i++; + if (c == '-') { + ValueSet vs = getValue(0, s, i + 1); + int offset = vs.value; + if (offset > MAX_LAST_DAY_OFFSET) { + throw new ParseException( + "Offset from last day must be <= " + MAX_LAST_DAY_OFFSET, i + 1); + } + dom -= offset; + i = vs.pos; } + if (s.length() > i) { + c = s.charAt(i); + if (c == 'W') { + nearestWeekday = true; + i++; + } + } + } + if (nearestWeekday) { + nearestWeekdays.add(dom); + } else { + daysOfMonth.add(dom); } } return i; @@ -710,7 +643,7 @@ private void checkIncrementRange(int incr, int type, int idxPos) throws ParseExc } } - protected int checkNext(int pos, String s, int val, int type) + private int checkNext(int pos, String s, int val, int type) throws ParseException { int end = -1; @@ -725,9 +658,9 @@ protected int checkNext(int pos, String s, int val, int type) if (c == 'L') { if (type == DAY_OF_WEEK) { - if (val < 1 || val > 7) + if(val < 1 || val > 7) throw new ParseException("Day-of-Week values must be between 1 and 7", -1); - lastdayOfWeek = true; + lastDayOfWeek = true; } else { throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i); } @@ -738,15 +671,15 @@ protected int checkNext(int pos, String s, int val, int type) } if (c == 'W') { - if (type == DAY_OF_MONTH) { - nearestWeekday = true; - } else { + if (type != DAY_OF_MONTH) { throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i); } - if (val > 31) - throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); - TreeSet set = getSet(type); - set.add(val); + if (val > 31) { + throw new ParseException("The 'W' option does not make sense with values larger than" + + " 31 (max number of days in a month)", i); + } + + nearestWeekdays.add(val); i++; return i; } @@ -757,8 +690,8 @@ protected int checkNext(int pos, String s, int val, int type) } i++; try { - nthdayOfWeek = Integer.parseInt(s.substring(i)); - if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + nthDayOfWeek = Integer.parseInt(s.substring(i)); + if (nthDayOfWeek < 1 || nthDayOfWeek > 5) { throw new Exception(); } } catch (Exception e) { @@ -789,7 +722,7 @@ protected int checkNext(int pos, String s, int val, int type) end = vs.value; i = vs.pos; } - if (i < s.length() && ((c = s.charAt(i)) == '/')) { + if (i < s.length() && (s.charAt(i) == '/')) { i++; c = s.charAt(i); int v2 = Integer.parseInt(String.valueOf(c)); @@ -851,147 +784,45 @@ public String getCronExpression() { return cronExpression; } - public String getExpressionSummary() { - StringBuilder buf = new StringBuilder(); - - buf.append("seconds: "); - buf.append(getExpressionSetSummary(seconds)); - buf.append("\n"); - buf.append("minutes: "); - buf.append(getExpressionSetSummary(minutes)); - buf.append("\n"); - buf.append("hours: "); - buf.append(getExpressionSetSummary(hours)); - buf.append("\n"); - buf.append("daysOfMonth: "); - buf.append(getExpressionSetSummary(daysOfMonth)); - buf.append("\n"); - buf.append("months: "); - buf.append(getExpressionSetSummary(months)); - buf.append("\n"); - buf.append("daysOfWeek: "); - buf.append(getExpressionSetSummary(daysOfWeek)); - buf.append("\n"); - buf.append("lastdayOfWeek: "); - buf.append(lastdayOfWeek); - buf.append("\n"); - buf.append("nearestWeekday: "); - buf.append(nearestWeekday); - buf.append("\n"); - buf.append("NthDayOfWeek: "); - buf.append(nthdayOfWeek); - buf.append("\n"); - buf.append("lastdayOfMonth: "); - buf.append(lastdayOfMonth); - buf.append("\n"); - buf.append("years: "); - buf.append(getExpressionSetSummary(years)); - buf.append("\n"); - - return buf.toString(); - } - - protected String getExpressionSetSummary(java.util.Set set) { - - if (set.contains(NO_SPEC)) { - return "?"; - } - if (set.contains(ALL_SPEC)) { - return "*"; - } - - StringBuilder buf = new StringBuilder(); - - Iterator itr = set.iterator(); - boolean first = true; - while (itr.hasNext()) { - Integer iVal = itr.next(); - String val = iVal.toString(); - if (!first) { - buf.append(","); - } - buf.append(val); - first = false; - } - - return buf.toString(); - } - - protected String getExpressionSetSummary(java.util.ArrayList list) { - - if (list.contains(NO_SPEC)) { - return "?"; - } - if (list.contains(ALL_SPEC)) { - return "*"; - } - - StringBuilder buf = new StringBuilder(); - - Iterator itr = list.iterator(); - boolean first = true; - while (itr.hasNext()) { - Integer iVal = itr.next(); - String val = iVal.toString(); - if (!first) { - buf.append(","); - } - buf.append(val); - first = false; - } - - return buf.toString(); - } - - protected int skipWhiteSpace(int i, String s) { + private int skipWhiteSpace(int i, String s) { for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) { - ; } return i; } - protected int findNextWhiteSpace(int i, String s) { + private int findNextWhiteSpace(int i, String s) { for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) { - ; } return i; } - protected void addToSet(int val, int end, int incr, int type) + private void addToSet(int val, int end, int incr, int type) throws ParseException { TreeSet set = getSet(type); if (type == SECOND || type == MINUTE) { if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) { - throw new ParseException( - "Minute and Second values must be between 0 and 59", - -1); + throw new ParseException("Minute and Second values must be between 0 and 59", -1); } } else if (type == HOUR) { if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) { - throw new ParseException( - "Hour values must be between 0 and 23", -1); + throw new ParseException("Hour values must be between 0 and 23", -1); } } else if (type == DAY_OF_MONTH) { if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) && (val != NO_SPEC_INT)) { - throw new ParseException( - "Day of month values must be between 1 and 31", -1); + throw new ParseException("Day of month values must be between 1 and 31", -1); } } else if (type == MONTH) { if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) { - throw new ParseException( - "Month values must be between 1 and 12", -1); - } - } else if (type == DAY_OF_WEEK) { - if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) - && (val != NO_SPEC_INT)) { - throw new ParseException( - "Day-of-Week values must be between 1 and 7", -1); + throw new ParseException("Month values must be between 1 and 12", -1); } + } else if (type == DAY_OF_WEEK && ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT))) { + throw new ParseException("Day-of-Week values must be between 1 and 7", -1); } if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) { @@ -1063,8 +894,6 @@ protected void addToSet(int val, int end, int incr, int type) if (stopAt < startAt) { switch (type) { case SECOND: - max = 60; - break; case MINUTE: max = 60; break; @@ -1123,11 +952,11 @@ TreeSet getSet(int type) { case YEAR: return years; default: - return null; + throw new IllegalArgumentException("Invalid type encountered: " + type); } } - protected ValueSet getValue(int v, String s, int i) { + private ValueSet getValue(int v, String s, int i) { char c = s.charAt(i); StringBuilder s1 = new StringBuilder(String.valueOf(v)); while (c >= '0' && c <= '9') { @@ -1145,13 +974,13 @@ protected ValueSet getValue(int v, String s, int i) { return val; } - protected int getNumericValue(String s, int i) { + private int getNumericValue(String s, int i) { int endOfVal = findNextWhiteSpace(i, s); String val = s.substring(i, endOfVal); return Integer.parseInt(val); } - protected int getMonthNumber(String s) { + private int getMonthNumber(String s) { Integer integer = monthMap.get(s); if (integer == null) { @@ -1161,7 +990,7 @@ protected int getMonthNumber(String s) { return integer; } - protected int getDayOfWeekNumber(String s) { + private int getDayOfWeekNumber(String s) { Integer integer = dayMap.get(s); if (integer == null) { @@ -1171,11 +1000,6 @@ protected int getDayOfWeekNumber(String s) { return integer; } - //////////////////////////////////////////////////////////////////////////// - // - // Computation Functions - // - //////////////////////////////////////////////////////////////////////////// public Date getTimeAfter(Date afterTime) { @@ -1193,20 +1017,18 @@ public Date getTimeAfter(Date afterTime) { // loop until we've computed the next time, or we've past the endTime while (!gotOne) { - //if (endTime != null && cl.getTime().after(endTime)) return null; - if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... + + if(cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... return null; } - SortedSet st = null; - int t = 0; int sec = cl.get(Calendar.SECOND); int min = cl.get(Calendar.MINUTE); // get second................................................. - st = seconds.tailSet(sec); - if (st != null && st.size() != 0) { + SortedSet st = seconds.tailSet(sec); + if (!st.isEmpty()) { sec = st.first(); } else { sec = seconds.first(); @@ -1217,11 +1039,11 @@ public Date getTimeAfter(Date afterTime) { min = cl.get(Calendar.MINUTE); int hr = cl.get(Calendar.HOUR_OF_DAY); - t = -1; + int t = -1; // get minute................................................. st = minutes.tailSet(min); - if (st != null && st.size() != 0) { + if (!st.isEmpty()) { t = min; min = st.first(); } else { @@ -1242,7 +1064,7 @@ public Date getTimeAfter(Date afterTime) { // get hour................................................... st = hours.tailSet(hr); - if (st != null && st.size() != 0) { + if (!st.isEmpty()) { t = hr; hr = st.first(); } else { @@ -1262,68 +1084,20 @@ public Date getTimeAfter(Date afterTime) { int mon = cl.get(Calendar.MONTH) + 1; // '+ 1' because calendar is 0-based for this field, and we are // 1-based - t = -1; int tmon = mon; // get day................................................... boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC); boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC); if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule - st = daysOfMonth.tailSet(day); - if (lastdayOfMonth) { - if (!nearestWeekday) { - t = day; - day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); - day -= lastdayOffset; - if (t > day) { - mon++; - if (mon > 12) { - mon = 1; - tmon = 3333; // ensure test of mon != tmon further below fails - cl.add(Calendar.YEAR, 1); - } - day = 1; - } - } else { - t = day; - day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); - day -= lastdayOffset; - - java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); - tcal.set(Calendar.SECOND, 0); - tcal.set(Calendar.MINUTE, 0); - tcal.set(Calendar.HOUR_OF_DAY, 0); - tcal.set(Calendar.DAY_OF_MONTH, day); - tcal.set(Calendar.MONTH, mon - 1); - tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); - - int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); - int dow = tcal.get(Calendar.DAY_OF_WEEK); - - if (dow == Calendar.SATURDAY && day == 1) { - day += 2; - } else if (dow == Calendar.SATURDAY) { - day -= 1; - } else if (dow == Calendar.SUNDAY && day == ldom) { - day -= 2; - } else if (dow == Calendar.SUNDAY) { - day += 1; - } - - tcal.set(Calendar.SECOND, sec); - tcal.set(Calendar.MINUTE, min); - tcal.set(Calendar.HOUR_OF_DAY, hr); - tcal.set(Calendar.DAY_OF_MONTH, day); - tcal.set(Calendar.MONTH, mon - 1); - Date nTime = tcal.getTime(); - if (nTime.before(afterTime)) { - day = 1; - mon++; - } - } - } else if (nearestWeekday) { - t = day; - day = daysOfMonth.first(); + final Optional smallestDay = findSmallestDay(day, mon, cl.get(Calendar.YEAR), + daysOfMonth); + Optional smallestDayForWeekday = findSmallestDay(day, mon, cl.get(Calendar.YEAR), + nearestWeekdays); + t = day; + day = -1; + if (smallestDayForWeekday.isPresent()) { + day = smallestDayForWeekday.get(); java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); tcal.set(Calendar.SECOND, 0); @@ -1354,23 +1128,17 @@ public Date getTimeAfter(Date afterTime) { tcal.set(Calendar.MONTH, mon - 1); Date nTime = tcal.getTime(); if (nTime.before(afterTime)) { - day = daysOfMonth.first(); - mon++; + day = -1; } - } else if (st != null && st.size() != 0) { - t = day; - day = st.first(); - // make sure we don't over-run a short month, such as february - int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); - if (day > lastDay) { - day = daysOfMonth.first(); - mon++; + } + if (smallestDay.isPresent()) { + if (day == -1 || smallestDay.get() < day) { + day = smallestDay.get(); } - } else { - day = daysOfMonth.first(); + } else if (day == -1) { + day = 1; mon++; } - if (day != t || mon != tmon) { cl.set(Calendar.SECOND, 0); cl.set(Calendar.MINUTE, 0); @@ -1382,7 +1150,7 @@ public Date getTimeAfter(Date afterTime) { continue; } } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule - if (lastdayOfWeek) { // are we looking for the last XXX day of + if (lastDayOfWeek) { // are we looking for the last XXX day of // the month? int dow = daysOfWeek.first(); // desired // d-o-w @@ -1425,7 +1193,7 @@ public Date getTimeAfter(Date afterTime) { continue; } - } else if (nthdayOfWeek != 0) { + } else if (nthDayOfWeek != 0) { // are we looking for the Nth XXX day in the month? int dow = daysOfWeek.first(); // desired // d-o-w @@ -1437,10 +1205,7 @@ public Date getTimeAfter(Date afterTime) { daysToAdd = dow + (7 - cDow); } - boolean dayShifted = false; - if (daysToAdd > 0) { - dayShifted = true; - } + final boolean dayShifted = daysToAdd > 0; day += daysToAdd; int weekOfMonth = day / 7; @@ -1448,7 +1213,7 @@ public Date getTimeAfter(Date afterTime) { weekOfMonth++; } - daysToAdd = (nthdayOfWeek - weekOfMonth) * 7; + daysToAdd = (nthDayOfWeek - weekOfMonth) * 7; day += daysToAdd; if (daysToAdd < 0 || day > getLastDayOfMonth(mon, cl @@ -1474,7 +1239,7 @@ public Date getTimeAfter(Date afterTime) { int dow = daysOfWeek.first(); // desired // d-o-w st = daysOfWeek.tailSet(cDow); - if (st != null && st.size() > 0) { + if (!st.isEmpty()) { dow = st.first(); } @@ -1497,7 +1262,7 @@ public Date getTimeAfter(Date afterTime) { cl.set(Calendar.MONTH, mon); // no '- 1' here because we are promoting the month continue; - } else if (daysToAdd > 0) { // are we swithing days? + } else if (daysToAdd > 0) { // are we switching days? cl.set(Calendar.SECOND, 0); cl.set(Calendar.MINUTE, 0); cl.set(Calendar.HOUR_OF_DAY, 0); @@ -1510,7 +1275,8 @@ public Date getTimeAfter(Date afterTime) { } } else { // dayOfWSpec && !dayOfMSpec throw new UnsupportedOperationException( - "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."); + "Support for specifying both a day-of-week" + + " AND a day-of-month parameter is not implemented."); } cl.set(Calendar.DAY_OF_MONTH, day); @@ -1528,7 +1294,7 @@ public Date getTimeAfter(Date afterTime) { // get month................................................... st = months.tailSet(mon); - if (st != null && st.size() != 0) { + if (!st.isEmpty()) { t = mon; mon = st.first(); } else { @@ -1551,11 +1317,10 @@ public Date getTimeAfter(Date afterTime) { // 1-based year = cl.get(Calendar.YEAR); - t = -1; // get year................................................... st = years.tailSet(year); - if (st != null && st.size() != 0) { + if (!st.isEmpty()) { t = year; year = st.first(); } else { @@ -1576,7 +1341,7 @@ public Date getTimeAfter(Date afterTime) { cl.set(Calendar.YEAR, year); gotOne = true; - } // while( !done ) + } return cl.getTime(); } @@ -1585,65 +1350,37 @@ public Date getTimeAfter(Date afterTime) { * Advance the calendar to the particular hour paying particular attention * to daylight saving problems. * - * @param cal the calendar to operate on + * @param cal the calendar to operate on * @param hour the hour to set */ - protected void setCalendarHour(Calendar cal, int hour) { + private void setCalendarHour(Calendar cal, int hour) { cal.set(java.util.Calendar.HOUR_OF_DAY, hour); if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) { cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1); } } - /** - * NOT YET IMPLEMENTED: Returns the time before the given time - * that the CronExpression matches. - */ - public Date getTimeBefore(Date endTime) { - // FUTURE_TODO: implement QUARTZ-423 - return null; - } - - /** - * NOT YET IMPLEMENTED: Returns the final time that the - * CronExpression will match. - */ - public Date getFinalFireTime() { - // FUTURE_TODO: implement QUARTZ-423 - return null; - } - - protected boolean isLeapYear(int year) { + private boolean isLeapYear(int year) { return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); } - protected int getLastDayOfMonth(int monthNum, int year) { - + private int getLastDayOfMonth(int monthNum, int year) { switch (monthNum) { case 1: - return 31; - case 2: - return (isLeapYear(year)) ? 29 : 28; case 3: - return 31; - case 4: - return 30; case 5: - return 31; - case 6: - return 30; case 7: - return 31; case 8: - return 31; - case 9: - return 30; case 10: + case 12: return 31; + case 2: + return (isLeapYear(year)) ? 29 : 28; + case 4: + case 6: + case 9: case 11: return 30; - case 12: - return 31; default: throw new IllegalArgumentException("Illegal month number: " + monthNum); @@ -1651,19 +1388,24 @@ protected int getLastDayOfMonth(int monthNum, int year) { } - private void readObject(java.io.ObjectInputStream stream) - throws java.io.IOException, ClassNotFoundException { + private Optional findSmallestDay(int day, int mon, int year, TreeSet set) { + if (set.isEmpty()) { + return Optional.empty(); + } + + final int lastDay = getLastDayOfMonth(mon, year); + // For "L", "L-1", etc. + int smallestDay = Optional.ofNullable(set.ceiling(LAST_DAY_OFFSET_END - (lastDay - day))) + .map(d -> d - LAST_DAY_OFFSET_START + 1) + .orElse(Integer.MAX_VALUE); + + // For "1", "2", etc. + SortedSet st = set.subSet(day, LAST_DAY_OFFSET_START); + // make sure we don't over-run a short month, such as february + if (!st.isEmpty() && st.first() < smallestDay && st.first() <= lastDay) { + smallestDay = st.first(); + } - stream.defaultReadObject(); - try { - buildExpression(cronExpression); - } catch (Exception ignore) { - } // never happens + return smallestDay == Integer.MAX_VALUE ? Optional.empty() : Optional.of(smallestDay); } - - @Override - @Deprecated - public Object clone() { - return new CronExpression(this); } -} diff --git a/common/src/main/java/org/tron/common/cron/ValueSet.java b/common/src/main/java/org/tron/common/cron/ValueSet.java index 74469a62b48..e8ffa73b1e2 100644 --- a/common/src/main/java/org/tron/common/cron/ValueSet.java +++ b/common/src/main/java/org/tron/common/cron/ValueSet.java @@ -1,7 +1,7 @@ package org.tron.common.cron; class ValueSet { - public int value; + protected int value; - public int pos; + protected int pos; } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index b09b3b8c847..50ba7eb83e8 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -42,13 +42,13 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.tron.common.cron.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.args.Account; import org.tron.common.args.GenesisBlock; import org.tron.common.args.Witness; import org.tron.common.config.DbBackupConfig; +import org.tron.common.cron.CronExpression; import org.tron.common.crypto.SignInterface; import org.tron.common.logsfilter.EventPluginConfig; import org.tron.common.logsfilter.FilterQuery; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index d856ccb8a11..4542b96a737 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -46,12 +46,12 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.bouncycastle.util.encoders.Hex; -import org.tron.common.cron.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.args.GenesisBlock; import org.tron.common.bloom.Bloom; +import org.tron.common.cron.CronExpression; import org.tron.common.es.ExecutorServiceManager; import org.tron.common.exit.ExitManager; import org.tron.common.logsfilter.EventPluginLoader; diff --git a/framework/src/test/java/org/tron/common/cron/CronExpressionTest.java b/framework/src/test/java/org/tron/common/cron/CronExpressionTest.java new file mode 100644 index 00000000000..5e41670763c --- /dev/null +++ b/framework/src/test/java/org/tron/common/cron/CronExpressionTest.java @@ -0,0 +1,450 @@ +/* + * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. + * Copyright IBM Corp. 2024, 2025 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.tron.common.cron; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.fail; + +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import org.junit.Test; + +public class CronExpressionTest { + + private static void assertTrue(boolean condition, String message) { + if (!condition) { + fail(message); + } + } + + private static void assertTrue(boolean condition) { + if (!condition) { + fail(); + } + } + + @Test + public void testTooManyTokens() { + try { + new CronExpression("0 15 10 * * ? 2005 *"); // too many tokens/terms in expression + fail("Expected ParseException did not occur for invalid expression"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().contains("too many"), + "Incorrect ParseException thrown"); + } + + } + + @Test + public void testIsSatisfiedBy() throws Exception { + CronExpression cronExpression = new CronExpression("0 15 10 * * ? 2005"); + + Calendar cal = Calendar.getInstance(); + + cal.set(2005, Calendar.JUNE, 1, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(Calendar.YEAR, 2006); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + + cal = Calendar.getInstance(); + cal.set(2005, Calendar.JUNE, 1, 10, 16, 0); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + + cal = Calendar.getInstance(); + cal.set(2005, Calendar.JUNE, 1, 10, 14, 0); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + } + + @Test + public void testIsValidExpression() { + assertTrue(CronExpression.isValidExpression("0 0 0 L-2 * ? *")); + assertTrue(CronExpression.isValidExpression("0 0 0 LW * ? *")); + assertFalse(CronExpression.isValidExpression("0 0 0 Foo * ? *")); + assertFalse(CronExpression.isValidExpression("61 15 10 L-2 * ? 2010")); + assertFalse(CronExpression.isValidExpression("0 61 10 L-2 * ? 2010")); + assertFalse(CronExpression.isValidExpression("0 15 25 L-2 * ? 2010")); + assertTrue(CronExpression.isValidExpression("0/5 * * * * ?")); + assertTrue(CronExpression.isValidExpression("0 0 2 * * ?")); + assertTrue(CronExpression.isValidExpression("0 15 8 ? * MON-FRI")); + assertTrue(CronExpression.isValidExpression("0 45 15 1,15 * ? 2005")); + assertTrue(CronExpression.isValidExpression("0 10 * * * ?")); + assertTrue(CronExpression.isValidExpression("0 0 12 L 3,6,9,12 ?")); + assertTrue(CronExpression.isValidExpression("0 0 6 ? DEC,JAN SUN,SAT")); + assertTrue(CronExpression.isValidExpression("0 0 12 1/5 * ?")); + assertTrue(CronExpression.isValidExpression("0 0 8-18 ? * MON,WED,FRI")); + assertTrue(CronExpression.isValidExpression("0 10,44 14 ? 3 WED 2022/2")); + assertTrue(CronExpression.isValidExpression("0 0/30 9-17 * * ? 2022-2025")); + assertTrue(CronExpression.isValidExpression("0 15 10 ? * 6#3 2022,2023")); + assertTrue(CronExpression.isValidExpression("0 10,44 14 ? 3 WED 2022/2")); + assertTrue(CronExpression.isValidExpression("0 0/5 14,18 * * ?")); + assertTrue(CronExpression.isValidExpression("0 15 10 ? * 6#3")); + assertFalse(CronExpression.isValidExpression(" 0 15 10 ? * 6#3 2014-2012")); + assertTrue(CronExpression.isValidExpression("0 0 20-18 ? * MON,WED,FRI")); + assertTrue(CronExpression.isValidExpression("0 0/30 17-9 * 10-9 ? 2022")); + + } + + @Test + public void testLastDayOffset() throws Exception { + CronExpression cronExpression = new CronExpression("0 15 10 L-2 * ? 2010"); + cronExpression.setTimeZone(Calendar.getInstance().getTimeZone()); + + Calendar cal = Calendar.getInstance(); + // last day - 2 + cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(2010, Calendar.OCTOBER, 28, 10, 15, 0); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + + cronExpression = new CronExpression("0 15 10 L-5W * ? 2010"); + // last day - 5 + cal.set(2010, Calendar.OCTOBER, 26, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cronExpression = new CronExpression("0 15 10 L-1 * ? 2010"); + // last day - 1 + cal.set(2010, Calendar.OCTOBER, 30, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cronExpression = new CronExpression("0 15 10 L-1W * ? 2010"); + // nearest weekday to last day - 1 (29th is a friday in 2010) + cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cronExpression = new CronExpression("0 15 10 1,L * ? 2010"); + + cal.set(2010, Calendar.OCTOBER, 1, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(2010, Calendar.OCTOBER, 31, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(2010, Calendar.OCTOBER, 30, 10, 15, 0); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + + cronExpression = new CronExpression("0 15 10 L-1W,L-1 * ? 2010"); + // nearest weekday to last day - 1 (29th is a friday in 2010) + cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + // last day - 1 + cal.set(2010, Calendar.OCTOBER, 30, 10, 15, 0); + + cronExpression = new CronExpression("0 15 10 2W,16 * ? 2010"); + // nearest weekday to the 2nd of the month (1st is a friday in 2010) + cal.set(2010, Calendar.OCTOBER, 1, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(2010, Calendar.OCTOBER, 2, 10, 15, 0); + assertFalse(cronExpression.isSatisfiedBy(cal.getTime())); + + cal.set(2010, Calendar.OCTOBER, 16, 10, 15, 0); + assertTrue(cronExpression.isSatisfiedBy(cal.getTime())); + + } + + @Test + public void testQuartz() throws Exception { + CronExpression cronExpression = new CronExpression("19 15 10 4 Apr ? "); + assertEquals("19 15 10 4 Apr ? ".toUpperCase(), cronExpression.getCronExpression()); + assertEquals("19 15 10 4 Apr ? ".toUpperCase(), cronExpression.toString()); + + // if broken, this will throw an exception + cronExpression.getNextValidTimeAfter(new Date()); + + try { + new CronExpression(null); + fail("Expected ParseException did not fire for null "); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().equals("cronExpression cannot be null"), + "Incorrect ParseException thrown"); + } + + try { + new CronExpression("* * * * Foo ? "); + fail("Expected ParseException did not fire for nonexistent month"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith("Invalid Month value:"), + "Incorrect ParseException thrown"); + } + + try { + new CronExpression("* * * * Jan-Foo ? "); + fail("Expected ParseException did not fire for nonexistent month"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith("Invalid Month value:"), + "Incorrect ParseException thrown"); + } + + try { + new CronExpression("0 0 * * * *"); + fail("Expected ParseException did not fire for wildcard day-of-month and day-of-week"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "Support for specifying both a day-of-week AND" + + " a day-of-month parameter is not implemented."), + "Incorrect ParseException thrown"); + } + try { + new CronExpression("0 0 * 4 * *"); + fail("Expected ParseException did not fire for specified day-of-month and" + + " wildcard day-of-week"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "Support for specifying both a day-of-week AND a day-of-month" + + " parameter is not implemented."), "Incorrect ParseException thrown"); + } + try { + new CronExpression("0 0 * * * 4"); + fail("Expected ParseException did not fire for wildcard day-of-month" + + " and specified day-of-week"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "Support for specifying both a day-of-week AND a day-of-month" + + " parameter is not implemented."), "Incorrect ParseException thrown"); + } + + try { + new CronExpression("0 43 9 ? * SAT,SUN,L"); + fail("Expected ParseException did not fire for L combined with other days of the week"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "Support for specifying 'L' with other days of the week is not implemented"), + "Incorrect ParseException thrown"); + } + try { + new CronExpression("0 43 9 ? * 6,7,L"); + fail("Expected ParseException did not fire for L combined with other days of the week"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "Support for specifying 'L' with other days of the week is not implemented"), + "Incorrect ParseException thrown"); + } + try { + new CronExpression("0 43 9 ? * 5L"); + } catch (ParseException pe) { + fail("Unexpected ParseException thrown for supported '5L' expression."); + } + } + + @Test + public void testQtz96() throws ParseException { + try { + new CronExpression("0/5 * * 32W 1 ?"); + fail("Expected ParseException did not fire for W with value larger than 31"); + } catch (ParseException pe) { + assertTrue(pe.getMessage().startsWith( + "The 'W' option does not make sense with values larger than"), + "Incorrect ParseException thrown"); + } + + // Test case 1 + try { + new CronExpression("/120 0 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 60 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0/120 0 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 60 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("/ 0 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0/ 0 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 1 + try { + new CronExpression("0 /120 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 60 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0 0/120 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 60 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("0 / 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0 0/ 8-18 ? * 2-6"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 1 + try { + new CronExpression("0 0 /120 ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 24 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0 0 0/120 ? * 2-6"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 24 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("0 0 / ? * 2-6"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0 0 0/ ? * 2-6"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 1 + try { + new CronExpression("0 0 0 /120 * 2-6"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 31 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0 0 0 0/120 * 2-6"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 31 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("0 0 0 / * 2-6"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0 0 0 0/ * 2-6"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + // Test case 1 + try { + new CronExpression("0 0 0 ? /120 2-6"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 12 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0 0 0 ? 0/120 2-6"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 12 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("0 0 0 ? / 2-6"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0 0 0 ? 0/ 2-6"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + // Test case 1 + try { + new CronExpression("0 0 0 ? * /120"); + fail("Cron did not validate bad range interval in '_blank/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 7 : 120", e.getMessage()); + } + + // Test case 2 + try { + new CronExpression("0 0 0 ? * 0/120"); + fail("Cron did not validate bad range interval in in '0/xxx' form"); + } catch (ParseException e) { + assertEquals("Increment > 7 : 120", e.getMessage()); + } + + // Test case 3 + try { + new CronExpression("0 0 0 ? * /"); + fail("Cron did not validate bad range interval in '_blank/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + + // Test case 4 + try { + new CronExpression("0 0 0 ? * 0/"); + fail("Cron did not validate bad range interval in '0/_blank'"); + } catch (ParseException e) { + assertEquals("'/' must be followed by an integer.", e.getMessage()); + } + } + +} diff --git a/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java b/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java index c529cafbba9..1e16ad6c3b0 100644 --- a/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java +++ b/framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java @@ -5,7 +5,6 @@ import java.util.Date; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; -import org.junit.Test; import org.tron.common.cron.CronExpression; import org.tron.common.parameter.CommonParameter; @@ -26,21 +25,6 @@ public class BlockTimeStopTest extends ConditionallyStopTest { } } - @Test - public void isValidExpression() { - Assert.assertTrue(CronExpression.isValidExpression(cronExpression.getCronExpression())); - ParseException err = Assert.assertThrows(ParseException.class, () -> - CronExpression.validateExpression("invalid expression")); - Assert.assertEquals("Illegal characters for this position: 'INV'", err.getMessage()); - } - - @Test - public void getNextTime() { - Date date = cronExpression.getNextValidTimeAfter(new Date()); - Date invalidDate = cronExpression.getNextInvalidTimeAfter(new Date()); - Assert.assertNotEquals(date, invalidDate); - } - protected void initParameter(CommonParameter parameter) { parameter.setShutdownBlockTime(cronExpression); From 25e10c77a57e673780ac54375f7562d890ba02bf Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Wed, 26 Mar 2025 16:22:02 +0800 Subject: [PATCH 103/107] fix(config): restore maxFastForwardNum to correct default value --- framework/src/main/java/org/tron/core/config/args/Args.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index b09b3b8c847..bb36942fe00 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -129,7 +129,7 @@ public static void clearParam() { PARAMETER.activeNodes = new ArrayList<>(); PARAMETER.passiveNodes = new ArrayList<>(); PARAMETER.fastForwardNodes = new ArrayList<>(); - PARAMETER.maxFastForwardNum = 3; + PARAMETER.maxFastForwardNum = 4; PARAMETER.nodeChannelReadTimeout = 0; PARAMETER.maxConnections = 30; PARAMETER.minConnections = 8; From be494299f828ae51cdde51840d0f36fe66ac3055 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 27 Mar 2025 16:01:24 +0800 Subject: [PATCH 104/107] test --- .../ChainInventoryMsgHandler.java | 50 +++++++++---------- .../core/net/service/sync/SyncService.java | 33 ++++++++---- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java index bd2e428418c..f19fe0bd14a 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java @@ -56,37 +56,37 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep return; } - while (!peer.getSyncBlockToFetch().isEmpty()) { - if (peer.getSyncBlockToFetch().peekLast().equals(blockIdWeGet.peekFirst())) { - break; - } - peer.getSyncBlockToFetch().pollLast(); - } +// while (!peer.getSyncBlockToFetch().isEmpty()) { +// if (peer.getSyncBlockToFetch().peekLast().equals(blockIdWeGet.peekFirst())) { +// break; +// } +// peer.getSyncBlockToFetch().pollLast(); +// } blockIdWeGet.poll(); peer.setRemainNum(chainInventoryMessage.getRemainNum()); peer.getSyncBlockToFetch().addAll(blockIdWeGet); - synchronized (tronNetDelegate.getBlockLock()) { - try { - BlockId blockId = null; - while (!peer.getSyncBlockToFetch().isEmpty() && tronNetDelegate - .containBlock(peer.getSyncBlockToFetch().peek())) { - blockId = peer.getSyncBlockToFetch().pop(); - peer.setBlockBothHave(blockId); - } - if (blockId != null) { - logger.info("Block {} from {} is processed", - blockId.getString(), peer.getInetAddress()); - } - } catch (NoSuchElementException e) { - logger.warn("Process ChainInventoryMessage failed, peer {}, isDisconnect:{}", - peer.getInetAddress(), peer.isDisconnect()); - peer.setFetchAble(true); - return; - } - } +// synchronized (tronNetDelegate.getBlockLock()) { +// try { +// BlockId blockId = null; +// while (!peer.getSyncBlockToFetch().isEmpty() && tronNetDelegate +// .containBlock(peer.getSyncBlockToFetch().peek())) { +// blockId = peer.getSyncBlockToFetch().pop(); +// peer.setBlockBothHave(blockId); +// } +// if (blockId != null) { +// logger.info("Block {} from {} is processed", +// blockId.getString(), peer.getInetAddress()); +// } +// } catch (NoSuchElementException e) { +// logger.warn("Process ChainInventoryMessage failed, peer {}, isDisconnect:{}", +// peer.getInetAddress(), peer.isDisconnect()); +// peer.setFetchAble(true); +// return; +// } +// } peer.setFetchAble(true); if ((chainInventoryMessage.getRemainNum() == 0 && !peer.getSyncBlockToFetch().isEmpty()) diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index e387329c467..0194de10671 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -69,17 +69,20 @@ public class SyncService { private final long syncFetchBatchNum = Args.getInstance().getSyncFetchBatchNum(); + private long startSyncNum = 10_000_000; + public void init() { ExecutorServiceManager.scheduleWithFixedDelay(fetchExecutor, () -> { try { - if (fetchFlag) { - fetchFlag = false; - startFetchSyncBlock(); - } +// if (fetchFlag) { +// fetchFlag = false; +// startFetchSyncBlock(); +// } + startFetchSyncBlock(); } catch (Exception e) { logger.error("Fetch sync block error", e); } - }, 10, 1, TimeUnit.SECONDS); + }, 10000, 10, TimeUnit.MILLISECONDS); ExecutorServiceManager.scheduleWithFixedDelay(blockHandleExecutor, () -> { try { @@ -119,10 +122,11 @@ public void syncNext(PeerConnection peer) { } LinkedList chainSummary; synchronized (tronNetDelegate.getForkLock()) { - chainSummary = getBlockChainSummary(peer); + chainSummary = getBlockChainSummaryTest(peer); } peer.setSyncChainRequested(new Pair<>(chainSummary, System.currentTimeMillis())); peer.sendMessage(new SyncBlockChainMessage(chainSummary)); + startSyncNum += 2000; } catch (Exception e) { logger.error("Peer {} sync failed, reason: {}", peer.getInetAddress(), e); peer.disconnect(ReasonCode.SYNC_FAIL); @@ -130,9 +134,10 @@ public void syncNext(PeerConnection peer) { } public void processBlock(PeerConnection peer, BlockMessage blockMessage) { - synchronized (blockJustReceived) { - blockJustReceived.put(blockMessage, peer); - } +// synchronized (blockJustReceived) { +// blockJustReceived.put(blockMessage, peer); +// } + peer.getSyncBlockToFetch().remove(blockMessage.getBlockId()); handleFlag = true; if (peer.isSyncIdle()) { if (peer.getRemainNum() > 0 @@ -158,6 +163,12 @@ private void invalid(BlockId blockId, PeerConnection peerConnection) { } } + private LinkedList getBlockChainSummaryTest(PeerConnection peer) throws P2pException { + LinkedList summary = new LinkedList<>(); + summary.offer(getBlockIdByNum(startSyncNum)); + return summary; + } + private LinkedList getBlockChainSummary(PeerConnection peer) throws P2pException { BlockId beginBlockId = peer.getBlockBothHave(); @@ -226,7 +237,7 @@ private BlockId getBlockIdByNum(long num) throws P2pException { private void startFetchSyncBlock() { HashMap> send = new HashMap<>(); tronNetDelegate.getActivePeer().stream() - .filter(peer -> peer.isNeedSyncFromPeer() && peer.isSyncIdle()) + //.filter(peer -> peer.isNeedSyncFromPeer() && peer.isSyncIdle()) .filter(peer -> peer.isFetchAble()) .forEach(peer -> { if (!send.containsKey(peer)) { @@ -238,7 +249,7 @@ private void startFetchSyncBlock() { requestBlockIds.put(blockId, peer); peer.getSyncBlockRequested().put(blockId, System.currentTimeMillis()); send.get(peer).add(blockId); - if (send.get(peer).size() >= MAX_BLOCK_FETCH_PER_PEER) { + if (send.get(peer).size() >= 1999) { break; } } From 65668a2fa1278b94f849fbe1d756195882514ecf Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 27 Mar 2025 18:12:23 +0800 Subject: [PATCH 105/107] test --- .../core/net/service/sync/SyncService.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 0194de10671..9e1ead2ff07 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -69,7 +69,13 @@ public class SyncService { private final long syncFetchBatchNum = Args.getInstance().getSyncFetchBatchNum(); - private long startSyncNum = 10_000_000; + private long startSyncNum = 1; + private long requestedCount = 0; + private long startRequestTime = 0; + private long lastRequestTime = System.currentTimeMillis(); + private long lastReportTime = System.currentTimeMillis(); + private long receiveBlockCount = 0; + public void init() { ExecutorServiceManager.scheduleWithFixedDelay(fetchExecutor, () -> { @@ -137,16 +143,17 @@ public void processBlock(PeerConnection peer, BlockMessage blockMessage) { // synchronized (blockJustReceived) { // blockJustReceived.put(blockMessage, peer); // } + receiveBlockCount += 1; peer.getSyncBlockToFetch().remove(blockMessage.getBlockId()); handleFlag = true; - if (peer.isSyncIdle()) { + //if (peer.isSyncIdle()) { if (peer.getRemainNum() > 0 && peer.getSyncBlockToFetch().size() <= syncFetchBatchNum) { syncNext(peer); } else { fetchFlag = true; } - } + //} } public void onDisconnect(PeerConnection peer) { @@ -249,7 +256,7 @@ private void startFetchSyncBlock() { requestBlockIds.put(blockId, peer); peer.getSyncBlockRequested().put(blockId, System.currentTimeMillis()); send.get(peer).add(blockId); - if (send.get(peer).size() >= 1999) { + if (send.get(peer).size() >= 2000) { break; } } @@ -259,6 +266,24 @@ private void startFetchSyncBlock() { send.forEach((peer, blockIds) -> { if (!blockIds.isEmpty()) { peer.sendMessage(new FetchInvDataMessage(new LinkedList<>(blockIds), InventoryType.BLOCK)); + requestedCount += blockIds.size(); + long currentTime = System.currentTimeMillis(); + if (startRequestTime > 0) { + if (currentTime - lastReportTime > 10 * 1000) { + long allQps = StrictMath.floorDiv(requestedCount * 1000, + currentTime - startRequestTime); + long currentQps = StrictMath.floorDiv(blockIds.size() * 1000, + currentTime - lastRequestTime); + long receiveQps = StrictMath.floorDiv(receiveBlockCount * 1000, + currentTime - startRequestTime); + logger.info("fast request block, allQps: {}, currentQps: {}, receiveQps: {}", + allQps, currentQps, receiveQps); + lastReportTime = currentTime; + } + } else { + startRequestTime = currentTime; + } + lastRequestTime = currentTime; } }); } From 6553bc40823adb0b08d541c692331a9b5f8e993b Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Fri, 28 Mar 2025 13:52:58 +0800 Subject: [PATCH 106/107] test --- .../main/java/org/tron/core/net/service/sync/SyncService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 9e1ead2ff07..e100f3881e1 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -69,7 +69,7 @@ public class SyncService { private final long syncFetchBatchNum = Args.getInstance().getSyncFetchBatchNum(); - private long startSyncNum = 1; + private long startSyncNum = 10_000_000; private long requestedCount = 0; private long startRequestTime = 0; private long lastRequestTime = System.currentTimeMillis(); From 50ffa8bd44fba956ad4191bcede148256f06d358 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Sat, 29 Mar 2025 22:57:39 +0800 Subject: [PATCH 107/107] test --- .../messagehandler/ChainInventoryMsgHandler.java | 1 + .../tron/core/net/service/sync/SyncService.java | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java index f19fe0bd14a..6d5203d22e8 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/ChainInventoryMsgHandler.java @@ -67,6 +67,7 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep peer.setRemainNum(chainInventoryMessage.getRemainNum()); peer.getSyncBlockToFetch().addAll(blockIdWeGet); + syncService.setLastSyncBlockId(blockIdWeGet.peekLast()); // synchronized (tronNetDelegate.getBlockLock()) { // try { diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index e100f3881e1..dd2af83b5ef 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -13,6 +13,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; + +import com.google.protobuf.ByteString; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -75,6 +77,8 @@ public class SyncService { private long lastRequestTime = System.currentTimeMillis(); private long lastReportTime = System.currentTimeMillis(); private long receiveBlockCount = 0; + @Setter + private BlockId lastSyncBlockId; public void init() { @@ -132,7 +136,7 @@ public void syncNext(PeerConnection peer) { } peer.setSyncChainRequested(new Pair<>(chainSummary, System.currentTimeMillis())); peer.sendMessage(new SyncBlockChainMessage(chainSummary)); - startSyncNum += 2000; + startSyncNum = 0; } catch (Exception e) { logger.error("Peer {} sync failed, reason: {}", peer.getInetAddress(), e); peer.disconnect(ReasonCode.SYNC_FAIL); @@ -172,7 +176,14 @@ private void invalid(BlockId blockId, PeerConnection peerConnection) { private LinkedList getBlockChainSummaryTest(PeerConnection peer) throws P2pException { LinkedList summary = new LinkedList<>(); - summary.offer(getBlockIdByNum(startSyncNum)); + if (startSyncNum == 0 && lastSyncBlockId != null) { + summary.offer(lastSyncBlockId); + } else { + summary.offer(new BlockCapsule.BlockId( + ByteString.fromHex("0000000000989680c8808334bae97e8b27d5e75e559a22d883caa5143e1a3894"), + startSyncNum)); + } + return summary; }

pC+!1javOq zj5B$ahVsruISKk?tIW>w`88>;zRGg&UWjxWxVJJoLFDZVcid{SY4E#?{3jE*^p#o| z^z>H};6&m;`99AIOU0Dt?{j1GFOId5{)=NFK4r(kEN3iRf$ufsQefmlJ3NKs`sl(u&y}`kBTH#t97+7m6gvYH~{AK17IN4SE<>;uT?(q{)g1h#~(D)@uJBuqSO}d zHPBDUrvTXAri#SiSAu`bAZ$HZIaNvfkicM{%3M|t_}g5v#saVQ_|lm@p+?C|3BL%_89@D`@1& zgVTh8znmdERTu`Wm4&DK7yeppp#|cPNx#uoao+FrO7s2F-{`HS?xC>RJ=89F4z0t& zr$dXc)>BruvQe`7w|BFwJOX?@t)K?sj6vliv+&fWP%9ote>0<|Frr?9c-X_DLMjjX zpFSd25BP7-vkE)qM@)sV-*D-Wk&cc;3SY+c9X^yuhxhG0bX4ErW2Mdx1Nx1S_UqYu z#L(eHI$+4Ce^d4D>*xsjJ_CC9b(RkA1(6LOI&_3|Xg}%5Ap=H?g?Cql#^){zaU=5n zclvaz>ComJWKuAZ2fq_`xMYW~kGp)M-%0*H zR-WM?Ajw~KGI!*Sjy|=fps{HaHOH~E7VNlj{@JCr>G~Un zo#_^97CSOA^Gdg7A3k2ZdbIx}>)DM0vn{7B*VtheqmlEbLF|_r;iruX=P$n6^V`;a zTEnyrxF?McP0Akfy1&%zr&rVA@vLQT8)poIJ0?}^_Y}k$2mRM`u6$c<#@frJlEHsQigh4G#LA2YVu}> zwFghsb)L|mdyMGKvKj3)&J5G*>oH>3(Ndq7K?hqO>S2=h4V#bNp+pmVs*Dw3}yy3Za=T6V4 z=#ECcRy6Dywj#j?zXV5#pl(wZo1a^VA_qWMQ%xU_06vgo;%m*MCAO{ zD;oE|(LeW&Zu-E1t>@Y#cD0svS(&qU{Hi5^i>|J{F>C$?yEz>vYHo8EXW#y@>gLo@ zMGIVXpDa8&PVfHrWqD21PHMcL@g(NW3mx6!V@GGG+srzZUVG;Ox1ujM?0yDE>Aslh z)nMT%3!jwoEovV-UVi7y`!ty4rB@u5lU%f>$G(fNqSM!3UbVgJNiM}Wpw^~$8B6Z# zZu?Y2`*T~dWL=9-f6rQb)1q&y&(9JJOKLeq&ADm&Xy`giWADqE2ZKJDHnVJ(aFbVtePvli&kLrbZDybx7ez?4Eck|#(-}k-hC1l?C zI&;r}?Tc5h+O+y+A9t;gi}z1jo{FwGInVb>mx})VBA(S6=u~=h;PlK#-;Oq|@nBN$ zmN|FJPhGC4Vfi+#wY6>iR+HE3oLulasz!$j3#(<81y0U2&(CvmskglE&FMe>@wxS> z!K2ch=I0$o9^Ky3dp;*U)^Yqt+0K5EMVeiA^&2#}WowtmQC*h#zZm^=(J0@BMVkF* z*aunr%&v1XXW*B|!4ijhE1$Kyx&P^rNoU`jnJpRNd%D4s;hehd+}*mz2j5<{y|{hH z_SWl{UClpye{thsNrQU!>qAP{sH;7l3veB8Fc1d_cmeI)*@8?Q!4-AD8nNMIjMKX7o{FWJ@gCrQ22dY+%TQ%V@H3- z=Y!=_C^esue%bdQC3MxeCf>P_$hOc}aoU3!UmPzAU0vJ#zeTe?vP(2{#n<*Jo8GL~ zdfm-&By+pUrag;2CT?2JVm%@H^Lp2%lVbO}ES$M^pIs)CyZXM#>@!@p&XsL_-`@Ob zYqW~s8!!J;d#r_)C5PGCZc0)9xO=&e(nTTf8?VAdt{ml`A9Ph#_@LlnpP9Gi?(X>M zo_c7Jg6@f5hrNGA%(&rNu#+`SCa7<3#;jwP^_#!2{5>{btj;=DCs$Es+FkpsNr}E2 tS#SGp+FQP6)&njto~t%;vWg0Q?!l3JC!7)cwOyNodhzDM42&mz3HF70f`F*Rqo|&E@QQX(x=d*vzqs7xzPe0Y& z)zwwi$1_=c-I(jmCX+BOi+DwNFd=OGpr$C$$O76R5rTg&5Zz?n0QZw~6Px~`XvSSI zcPc}1G)nWnZ=Y(GFB*6KJyo7js`tI-K~1Ja-ZIB+r^hnSSbDC}>y!!zE2842c zB*otW{ed6D{Z>GCz(WAKdI7e|ln^xRq5)q5asayk!vU>b`|;pPes~1;0i528`^|uB zxDIEL&IP;;7zwx(Kq~n(pdUcL9%kfP+)n}CV7!>`Ww>t##DMp^xPJ=h3%C<77w{P1 zN<0eyOhVeY0yvS6`{jU0#;?cyW56ANmjRdIy#=^G0=NobTsx3h&B!3+xeyQq{8HQx z7@2Ul0;lT&brZ92uLR@)dH~)6!~re>JO!ZZbwHs^3DKM1|B&${;5|7#1nDP`rg3-_ zu#xEre7~LV8MwzH?+=XAEeQBu8BfK17^i38ehHwC@%Q*nw+8_Zz%2mdsx}hf_b*QO z=R4Vw3ytTvchJ(`Al(`71Oj>^JpnKq&=D{g&>i$`xLa^f1T-W4J)k4fbiD+a0tf~~ zFb&B+be-Yci*O$TSPYoPH2tOLt+CXwR~TQ`)7c682<wTg zx9NZg4L6d@km#WCH|Q_s?*FN}9z#sRaQ4B=wjRR0ULpqMFF(rltB}T-Bhl&7mTHrLZIew&Q{Io1C z0Fv&VaZ&q3OL$4gE^!M}+Rgqn+!FOmL43yuVYQk%b`as=0YMIPcHlBc*!$LHSN9p; zM~pW^c1yQ!*nUw=j|fYRNKUEgd2QUP?QO!x=Pn5xaY1-TM_7Qk<5EYQxOC~jfbi6? zWU)5RECPBAdf@t~5!vBwEW#9i>7{0CfeltE@Z$U9L#HK$-xoKy!F9g_*+FCM z{uSxP00)3om=!(1^!N26!9s`gqSq>{}h0(rvc9Z zo&}ICaRI6U{eawlS1_Ad^0J{O70?0pn4)_AF2k<3;uCD+zPQM`p*SCQ00JQ+)+G`|m zrxwKYyRFv@eJA29su&M zMm%M_M==&%6#LOdb1b?j{-t>x#o6SaXpTh}&1cAGP^?cE#pDzh8UB~%9uzN=f3^Wm zZ@K@U+Xo%I>Drv>FZE4(e8z3#FU+tl>3s9jUOg)o%zI_(gOMrMM3p}NSw`R;9`@%JkI-+0h^=<6ht5^M!ky{@A>-+UbHF{r_TKN3K zZC8H#aJSwQLzcLfZv1xYdokb5OPl-HxBo17dE$|qP`9lab(Py5c)Y&vhd&RPdU)%- z|IDyGPcX6Dw)fwg_0YFJ-w@P4=fM7McZFD1Y?=GRt2Kb4hJEi^V&3@Hx@^U!0n^qm z9q@jiAzkNf*^`%-kUgNf&CaNA0y-7#*mYCUt>eiHJ`_ofP!g0UlZv)=$HFDYLzHQ#`x1#d!j&yP6)tR>~ zKRe{x9d~qp_~q-m-?41Zz2mPjwfXVZr1!ol{&D4dwH5a-y>DG-=R>h0f4pqsPqQvv z`_{Unx0j*5A6~kud#}{eXMeo#<5SbC)?XU`^Qdd$0K?wS{^{<7Un9p&%)j}{Pt7a- z^4HNfUOMIGJKKLbW&h@%I-H%i{QX~^vu@n+_WNJ%?LGWo4XKNcR(77->zX-xzuElj z%(q`U_DF!W@V3$~tAlY;3ltJxyI z6ML?>;^z5}4~uy=G4H3sk7v7XC>^wU!@6ADv(TmyFLZkJ$-t)<_w5&SamD^<>*^1# z+SL!~%sZRz?YI7+A=^Igd*c2~*V4qR7azYlp?b+=zytGK+qYeM$H+IDraXDqgs6|V z=U?%x^~~*;E-0EY`BLP&uC(6^v)ctdnsg}hiW_g)I5exrjRm$Vv$x!IQRN%ki!YmV zZ1Ku>F1hyYzpr}h#cwZor|{P=Zh7XTMOXLvaOHsB6K4f}d@6M6=m85ped(3Ge=B}4 zwB*qz_RaiZ>gW67YdYU%`M#jvwgd0qdVKNH1j~viuXuG;^t_A8UrBuOSY2YwokONN zV>(xTbJzRH_bzruzC8X>z~ZZVt{6V?iCNp$Uv}+-cYoODvR|yX{P@JY%WwW_Yr&}W zhzlN@{m#{UzYhueu+QA^i$X?RHUr~f|6N0~_g9PUO)oxw>uoQ(wRN z{YR%PTLyKX*YoawHn$CX=C!LnI~d&WSoh_-o~jrUad^`|pWksy*1l^p=B@7i#thsC zi9I2s7GHJi;J}_ME?#rTl3DNmaBwEz;A>C38hmY^IpbZAEy(%!uZy?u9)lb}z|6F|jEoD0{e)jb1k(rA^$`g)UF!jQ};y!WeB_}R>&9*D1nAmp^RR~7YAz2Q*n47Na`l`6&aajqy&?C>;%hd11?Ir)KdYllYL7ui!M z-1hdrN-vtV|4|AFTD>fy4W7ZU`CJyP;OsC5c~SRT)jZpa2qYX3=Su{BJs_b4`b`L| zTB2`9-i|HhNA+5wlg)04?hI_1eoJV}^obBbOMISeg%3$9u7!Hu30g~hE^Q@0#S$&$ zuWv=peS=%hUx}cBDQoJi$vx|1X#L_Oz^Wc~p!sf-0oUmL0FBfeL3idE?9g5rqJ zojh5}X8tdBQ1sjn6d_S%7o%bnJ>XYGPhajS)H@~eax8_xq zkzzr*YPnr;jf%cQk;T_hD*v#b6g`gV!+?_9YG{!g*J-AYvMBl+DT;2ySod-LckEYu z2628X^Dp>O(NPU~g>e1He5B~h6+4l_`5gxoy&LBrB*#~nc)He`&l5nYp5fOi2E&-o z6z=!%n-w7j^`;9mNtwUmGjIM^asLMFRrG9?UG(7mHJl%)ysl%q<8zf?^$ylwxZF2* zpbX;&9p(566Q6Q$XvpW+XjLE4;9Z|9VaKRljwVG%_2l(1^NHc0($N2Sm{ZDct5^9~ zasFa%*VEjt_3E)Wf;;6OGg8TC70c}(tZ!3T-{P3hT4~3^#L`WQfzjR&*5~nd#eg4+ zncR=H2UY$(%>MzSK0J=Xng2&HR#cy1tPci%8`B*hdYAhVkFSdDif-u13a;m;3six| zI_%3>TqORYM&);Kx%aRu4zo)#`O>5abfU}WIhkPq4+H0{5CX%_=ml%=(jSx zGq-mNFJ3NZ`Y0YRx!f;?K4dVT?aar}x9eFS%2*!^`8>|!U2uJj@pY8-vzEt;k^dcJ zpn6swQ}x`={qi!))4}pI_#Aol>cI%gZpI<>v=ZQ`*HtnxAAH|)B030 zqsc0+N_7*N%%_(9Y=7pH!E&g5OYt}8)hxGLdECwC{Kt6wj_?`R&*OE{!%eh7h>OjZ zXykgB?k}pIhCh9U+co}WML*4aT&M=sr{XSE zpGKBLIFH{r9>0S){~qpNhfkc-o9#xLkN+CMa+aH{;E~IGK4N(~eC$#`!;iB;MRD>P zXT%j-RQ(P5BG!ioeEiXiY@dhm!uc5HlfiOMV}EUouZ3Lyn#105d!6} zXE2`%rrVf)gyn2yJ^@UBnC(vm$0x?PyPV5S^vQ4L_U4{Y?J~xf6a1uIr9~`U>*c@L zt7knCYzLrD^4iP&Tflm2&<}F{r9OJqiTkCD>uL1+lPrg69LE}b?q)vYefYe`{T}y& zcmGB*pIXjujF+WG+}>MBY#G=8Nv7K_Q}j3SlL z)6h2xSBQV&QpMOf7c-Unv6jc_9IIoJA(_nt;Q-&Fi>Rcyor z)~jrvI46PSP|0#I+O?3!S1lX(NzCVAu75q(e<{-+<$m1G@jwrz&w-ke{P)x1EUrB) zhu4{Z0hg<^5o^k*0Ofc1#O+UUdk_1xcMP}J!G6u)vz^C91&=SIUFDqL<`X|`XZhs% zjH8P=e#_ul zIV|VR#U9)+6AT5>8`%yga{gO+T$Hgq4SRAs%V8x!Q-oj<5feR= z8p!rg>{azQ+Et5krT*~xhLOLV%YA_7#r?Vd8LYR{IPSfa=^wMcCHl-Gnz?^-efsx1 z9=~O*hf|mj?b*nFq|FgrBUE)o81uQ4*AoWGr`X$KJxpUgG}^U+>m#^6hTNKs@$O?E zo?-or<8=l@KVN6Mjp-;(Uf&x2o$bFtZ{T`5*q#`Cx^ll)vYc(q$B7Ko-enxm%xC&$ zmd|+hgK!n{X#NByyZHi0K=7T!gdU8u@o{ zJtuKJrzm#fL*~#fZvt`1{)+E|`xT%XQd|HP@PK*JC2V)>-` z$Y(IuKaA&biOi>g^OtdcG)G>YnO@PK{kydv062JpPb zki)$kw`}LQWfR`~dZ zbk-}!m#RUAoR@OH=N7B_tYUI*9|prk?fQl5Y4rO6&cBrX zW-;flXZ@VUcC`o7PqKd2H>!FX@#hm<{|&qj*2mz({%Abg&s?S_asIN8Al^wEbS ztUnH)_`e;~znQEA+@I@1hmlGCPjmg#nEngfZHLeN&I!9gamaj*XN-QolKpQ5`^N(2 zGmiD`gBO+D5}BUK<7m8(e;Ll@?(`WiZ=%{%&rN(NZ9elE%j0f?&wj)UhWvf{J&)y3 zFi**$hWYH^dRjUDH2B}eaaWqp{IL_)^J$-Y?qK>fpLx?S%-`lS{|)E3x(CPABe*_4 zasSTeb_Fm!m+KREsiGM3)+wx44xjk;2DU$f;{k)uMjm&=_+W{#?pMI$qL$}JMn7J| z@_c~pyrJj!u>ODGGap&S?G-$q1zUNYW_mr3YYcOFbz-}*pY_(DU&VGffc=^=UW%Ds z=F{E}xPOI@UiD=8EcKZm?PK{Y^XW%nx6hcJpJy*BPA@FB+l77Pq#NwhvI?_i{;_OvkHoH^79zaw9i^N;~Z*E-dq#_jwnQXSd>>#n3GpLU8Lvc=4YlC zXHk*GIe9aR#HjSS>Gu4>87LWz%*>xnZOtrPP*9w2&qNXZ2lel7PaQpVI3-4n9cjG=g&d4e)~w+S+Upr&W$<`-rC8HL;X zrKtZ$wNTg}FMv8hZ`~i~kdd38F)4ra!WpTMWlr(zth{1DG&=-JT}C2i@*kEx-Yu9@ zoCW6N3-j}*3&thi0!jH#S*DW=1gDUW~|P0LBoQ$&@4IlvVB#{2x94`X{~c2?#rMMQ&St$mr&SVd(G`(o68 zPM)U)+$8yW`gAy?EX5Md%qgZK=%~Q$#8Se%*&eLM$)HEgAcM#%b!DD6gg+l$#p+Ox|n&PK4^N@9dpw8 zvFbLr*zpjJfIFsaNafAR&86hDoVkh}y*(#07wv@p!2wALfk@@yR**l>O)9#ByAgC< zMO3TM$Eap*4oNn{o|m38SJvAgOiwQ&t1s23h`2+Kath!PXJi%Hi!uwzen=+`Bks-y zk$U%t@0$WmLKVRxf4aSRUOqhDjJ`zai-1Bl$exi?T;zqIj!=gzsA*2IUFAy8wHIU+ z&Yn}8F5`*WS+g?>79h+?FDlAHh%-GsC)aJAWN}5JAU%g1dy!oYTcggT1zuI|>r0uP zlbehB=H}-Yuw)Ca=dPziilGJY3#wTZThp>%9x2zj(&r#u#eZ$6Xt8k@GCTA!UPQ&-d95k^)#|c zDa^`R0CmyR_PPDM(f;-U-ULPw?_-49XJc4Ho3nBX`u6L`ukxeJ?3~;le4w`E12JQgKEWuLo9JD%B z4T|9z4P2{)M+mS{Ep7@E%M%%*6 zhVes{&(RG{*e*R^GYq%Gm6EZX9v{k{I)}=kq`feGo=2YE%+oQoax0KW z7MdgRCURf7iPLmn;zQ-UnfZlT9LyShz^!iKiCdLvkQpIW0ojluOhpRaV@Zxq_j74v zyfdI)`n;o{rOAji1YWuNwv?^Vn^ys%HFvC9(ANin(^BSy<&5X(^bUyv~i&9^bbm$Ff570XO_dkKXb%PC~Xz2@jX z`Mj1od_0JE$+>DVMG+bCEgPQLh*+j$7qZNP@=$OB73P#R5J!ea?LBRcQ0Hf<78D_PXJAuNj>rTp@CEGBSG?<@X*a zhL0JUl4|eU`-&@h<4Bl=3E=x5(G0o?DgS?d3HEP$)Rhi>4GW^5GWGJ(Ibw@Y}LMprqA zirNFFliXCC8`tRk$)bF^Nuw{<^4Dl|Y%#m99U9$` zEj`?+(R;Xa<2%VXHTtz0UHy6>dJ010qbTyJRsO1=qL*s<@f#=-qx|~sImBr6 zzi9d6H2PGHo~Y5wGlx=o|ss?kSibmMoE=<#@suIs}Tjb5bjNz>@} zYxHc5uIo>MM#oVW_cdRmW9#32IW)S%O{L#G@yL0-Mqj4U!_|NR>VH&uvVG&-9e`Lt1^9==`D@LQ^=!^S` z)98HUOFm1~=>6Qe>9-g?&}?fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB z3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&`;Fo}3 z0)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<% zfL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&` z;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv! z_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aa zehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BU zUjlv!_$A<%fL{WB3HT+TBrvqQ<+C%3Hdmdo2Tt%1zxA&CBV%Ap7QSjo}l6P15eTLhk$2j_#?ne zG<*f{bsGLS@U0sDB=9;7UkBVA=qdkM;0YS;0-mDb&jZiU@E3uXX!y&(*J=1`z_)7n zTfplyd@FEskf;22fG249d%#mP{3GBQ8vY6J5)J$3iwtH{}=E&4X*=k4)&D) z1Mmb5KL|WU!~YFDL&JXsUZUa0fv?l>lfbuX_*vj}8g5QT`BqQ)LBJC0 z3iwtHzZQ6%hNl2GxAByJJ@5n#9|b%`!^Z;8(C`VsOEi2k@O2tK75G*Sza4m;hGzgb zhsyH*s9#HmZI9nEyeZuzHjp0>X2&Pw3*I{0ywV&KG;s;+JNX1591{}um|rEoU`Cqg zIxP)+#LnSOHX$}dH#bL9KJpO`hLY?t|p+X$05n_@ow+7`R|1TDkOTe$tJHGkj zg?K;V^y1ygVN1&6PbWXR1^F{jR?7b2O&RiCv-@4;%ifZ{>`16+dK6`+C5#?yGl>DR ze%psPIq;55I|e!zppAQ)n^(r6J!uJ{gO7yTn$9fR>h^zBe|rzhXJ4Z|XBNFxMLbD1 zMJT`M^WjZtW?NGQ_`L!?lnw;1#b(iD@S*n5dq>BaWSy+S)^r4IU1Ac;&@Sgui*Q*x z+nR)F=;vj4e=qP_ON7fZ*w$2M>Et>(F1d>8lO|%p=gq3)H=DrA?B;dUVoH*{a)tAV z#q2t!@v8*CIj}u~gA?bX-W)nQbQL zev8HRJ?gm+GH}=736rz7pKvY-b4=(3Ic9^e(WY7|kL5#jlGk43m2_?o(W%`nx2F@@ z6Cv9}`BZxptvmXBKiX@whn_3>qfE4kWN>ucNVI1-+F)x!dz`-gNo^2q91}XB-c+|5 zlh{anjQ;hlKk=9KOf;)Dpr5H6>T{#7RT*zoHQG&(ry2cik^Ma%I!EQjd@;PqYOytq zFpCZ6Rn}p%lk|z|a&%lOc&30i_0x8#S5*IF=$E7Dm%V42SCY>Br|pQc2w9GjWrVBF z66>-)qx4S7q|xFe{@YN_3ETzRu`*a}*lUSK-bmL^pwqkP&m^iZ^<5qG(ORW=)FR({ zcwPtI!%#*l%1VK5 zC0C(rXBygTtxl0Tu^0Mv!V(BQ3xJ)nxQ+ui_=enRdsMX_;}Q7}1PeJXs7%kZ2=xqo zOz(BUJEXh)A;VMXyZ=;YulCZ}D5bM|mA+B=#M`Kw)MxG4Y4o@M|A(>hpV-%ZmS~KPbM3407c@3n*Bcx3=C_{v+Tmj8@pAa%GW1s> z;+R^C)%6Kv>;N8zwy%Lt*6l0lx}o1>Q*|HX9#@AWHM{BY!_C{2Uu(2mq4yyeOKqfY zo5N#iBkDo?t59}T2*#48|72rHcViv4JJQ>TNu*z@kG=JW=wu)1nJEZ5vBjg0WT(_S z-nzOD?~olOy?dDT%iE4dd+CX%Y~m9GpB$TH=-z-((Vw2Dn-CkeVn^k(X+bU8(G0vt zu|+2Cp4dX!b7RcwzSyv%{e+01zL31x<{9~^UnF1j3$@?MzVkA?69`)%pCOizWyYXh z98(Mv6%#tKJbtS^t;H38v@PcoR~(05tcBk=I&KtnXe4as2pMNUw`7dboNAG=)9HLG zY-$Lew?V#8=vtW6HN*lt-LU|4Ed*n{S9@<=BO7}{)3+_{b$wHIR_UU+!xZj$=Bsby zGo>B|w5EsW>TXjjI!Zcq(*2BlKH>w-p0;Ld$<79#jkT7}u&G_7tt6Xz7xyc4K1q!U zs!L}tUG~=VF0DMHy8JQwOM2QECi?3-W#}r&Owz{(pEEwlmi|$l+GmMLy81lF28|1n z1=VHXd5n#amhyz7-aLK+(C?|Il)uv3s@qIz@1Hq-D4rtUVaSulz8v!$m)AmXj*c6H zF)jHhEgqZ49U74R`NIa)LO&_l0VILy!s#_ME28Ot;`zaB^yO`QMwfg z-HC8fyhr@R>1G-0%W_(Y&tw@Ngg93tKKos}w%qD;o=?91A}$RGr= zXaoBYD(%Buwhy1PFM1c_E+@>}J{*O8IHuVLQ(KP>ptzg-7PT|BM%wRP670XPfk6F>)M}t*B((gWuyZPUU;YJf1PG#(&Fk6peB3@jnpb z_q_bv_BMagIF35+aV+(necXRMj?++YV;m!nxbftF*El{Q{a`f4@@VMqDCqG>jAb6j z7B!Cl6JPkQk1srmdB-u#JC5r<5qcf3`8`_qaO=E7+>!3}%-dfkdp+|WE2b!Y9G&aq zJpS*G`OV+*je+DF(a*YX+z&sP!~N~?k7^9GJU;#}bCAwnvE`^2 z(?9Ct>YA2(pU;?S-%=j<$Do$z1)-kt2ERF{>A!2d!EYx0p5HttmR=v~d;|Wbwx4Zq z!|(W=dF*#iu-`cVTYlgizvDgsmvbQ>|Kc8p7^7>wo_UY8C0@_G=R;)IJ$~t2pJn(Z zwZ`P}KQun~<6SkLlpop$ztN8S(tFO{njfO_yvKyMkLuzzUcP91p5tZJpEX{h|Ge?y zGuLWyykJbVI9{Mzx__!_{BImDt@|b#6OA+`c)oTjRW!9UUt7fEViB*i<-lIQ+txcC zYiVt4|7-cXX*{kGfrs{b>AJ@s)dxkF#~@F@Pj~KKBVrDDj|pwOSi~&vvGnJSmn^sc z@r;-KSc~Y){rUf6%$)FynVr9}MzJ$~OuN>6%uZgT*m-_y6kcOyC+**mFEQp8ygsor z#bQ}9y6`V;Wy@He@F(j zws9VFvvYh5?V+4X#U2XJ&1l@5pmEd6S{mjr>uG&MpTE5O8*6Dxw6(M)Sntu-%V@r* z<|gO*0M8u6I~F6qLGuvWZ`g|%mF64&VmW)yL!w(*PauBYz9Gu9rq*gdVJ^8d-rD|8 z($}b@zR)k8cb>PtYU^npo%6BrL;uTk?wFiML}DJ%%6i&w%#{(dNL|xomXSU&i?LTh zv5HBv!@j!aUMmx&t>~b)o}GV;;%%!bM%gFzGY0zESCy zSr1tH*Ex?Gaac01qu=*ewP$JAfCIcQNj!eb=NR)2laGxsY=`fBg!p;Z40t`E!LuLa zSr_oO5wvD5*9Bl7yw?RVj(H4t)&+jc9*`aJUN=)ZMf*8aA6_@_;Ja^0^*MLnlJsWN z@7a+lo&F>r7?afJd~^^oo32}z_{L>c)Q8v69LN4!?Z@w~hwqI4(``s3Y>2WGE!z;! z8osh2n2)dx*?m4^{twuYW#_{$Cc>+qUpx;Rf-@4*hUjM`dSP$Cdtdk5^~L%lrWeU( zWZ(4Iua$T1SRHfby4_aV%Ux+*y#r?~yygU2+#i5Ecb})ul1xc&$tFL6cRb_LW4ovh zv6jF?YeV&QNzeQ-VD}vN9CL|R9?#s-8XQwjeAFBhb5Skc_FcbMbr8H~!Zt~>R~}n- zZanU>W!`bp#h71`J!|55rm{y}p?m6F1;s!aJT5&pjcikEYcN`jbB^7jdbPF}NcHlz zX^l9GB>S?D+Lzvoy}JK7+Prd*uMOD|;kF?(ZwvE%4jU8bOVj3h8Q@8>)#ER+rFsnZ zXU_9lI=dnD&9eu0&OFa|56+n9>1QWng=k8~84a4>)#4oBFtjTN^GeVg>OqS$t?80& z7ENZzg3e|7o~1O-VAA{aoX%SkzXW;i!vvpXcFkyoXKTEuPLQj+PNt5I36opl@q6_; zhgT2mpZ;0Au%_JSPvR91*6c=A8E@(40(ONUr8X#VcyP(}zkr>}j2=OMJ-?{$??P1dSG;`IF zt~gg)N@rL}CvZQ~yb|jvG6oorI-XgSf;?D1u$a{Oh*sWPfcNPASMW}a5CaV!vm`w> z$>_Ut`O%r4psFKRQ$0-XdOV2t(ge;^K~`;{j|M-|FB%I6)boL~u1;f@Xoo?ox5On0 zljwM6(e>a-_2zROmX^yYYNebTxSWq$DCd*kET?6;UV(RvHe8IfuN?HV%Ejp8<>qK9 z3zM)7rZcKHqCV+CDm|9cZB%+RrQ50W2ugQU>FX#RrP3*s?xNB|DSe?zUqk5xl^#s# zi&c6crIS>;AEkS%H0ghOUzNU$(gRgGiPBf8bWciOtI|Cvoubn5l)hf2FQoJ+mF`OE zu__%y=?N+wN$JTd-I3B$Rk}T;Z&&FsN@u8a2&Jd1bP%OyssOqK#(K<|MI&(*)X;yW zm-0+=DUEkeIb^qw;T@gFzF5bE9gy1r*h)xpbcRfn%kt@`)SBuA+GyP?cV!`sr`E+O`$HrV@;x= zHhN8$GmD0Sw^rUZA#EYqL8C3N5^sumU|(VbMT5yCCe;Vqnsx}Wu^xR`M)&r%CJ#@@ zXq(_OWF(^ioErLO6yzh55h{oK2wfp~s+SG?%I<6}xCHpbzt3 zCvluX!kDmtrrI9`os4o3UKAu6mg5`BjVWel{MqJ7N5|cOvd2KqqpO-r`7A|gAnFv3 zvr-*!&Y~mETXaI62-GhUdJ=%M`4-nH)ZsMhKsIG@H_=emPE4YDrPeXO*tlj`GnSLwrIpLYpA3HwLqYZ?JZ0Y_j%Qe=!0<)ZlZN#v3HA3=0p8Z>-= z^Ec3F@1w$?A>LdL8u|=fYIp)VPy_kaVs1s{*_wl|w4#nB-D`$8 zf>W!r?bg-zMRhG-6fB(Pc*hVCXsLFzPp&QrPN^1cP1WW=bM+F7t-5=ttr|A6x_gMI zK7cV#GNATT+(&7WLlOBitYzL$=P2vQjZ79p)KNiYamJ#GpRCt(Z5EuPX}@lgJLz9Fc6|YrizF zB%4$Led~;R)^Wg4+zGqrnLh^)hUN~cY?S%>#_ zOFRO&*;$8oKbCkX@C$%PIB#*|q0Smk_r)D^&5o$MlfF$n&EF=HoLiEkG4~|7{rEHW zr*K{bnOB&_K(cS-TS-;9psn@X)_su8+Kv>vlHPT4Sx}F=@D6k`DGuM`Dp^Lj%0MGu zFb6WR;GTgoH-N{>72u6;QoYuhi6&CX@dUq_-DL$LXX(#g7P9smL%5xp)6{RNRk8~9xop!2u0P$K2+F03k;oJ$j zEF1LCkhYx+9!TS0oyENCDe&13x}57t8H?pKS9lM$hivfa7Hn{{rQ@#S{2ks2#Cwe# zbCO;h0DrkZg*b!kniDu|zq3x__^tx}=^D^>M4?|LEyQWY`c~AE0O#3%BQI!VAO4r# zLu{tri*m)HEw6zl?YVp}+O?4KpdCgY;(Y_r?j2rj@Tm>Hu)1z|&5(Vi*Hzb@atx`v z_j=4VyH)Qi9fo=51xRkJQF%^KZqGUJF#Gj}Opi)Y)BXJ|8Q1ICNV(xsg8|C8Sf#Cubb7yeC-twi`avLjDn9Fkw7 zG1C?I?!Z-<(XLJW?s3!y-?(Yo@ALd zL7r-_RIS_Afxb_k(++TL!f(;kVC@Zi0!b7%kS!!TJO*_!kB@aVV;zOo_P#i{XgBQ_RG6d7O_u2LtEBv*VgI^9 zR$W{JfqxDg_g#>!0d{f{&0T0;b#-)9`N!Z}(VfO|SJwwfSC-z^SXFvUW2`CUQ1Y4P zNtKq{8>=k0N_@*{;HAJz6`oAE#g6BTHd?Du1-e3+=Tv_gnpWc z{+fV(yb=AVVqB6>g*mFc1VG~{9q*A}_zr$38Gh(E)+T5j0ycj`bfDNp@jcBIkHaoj zMn#vy&Q{l>&Sc*gLGK{HU5iU?4QbHz70t~XN-SN=E1n{`b#eU*ywl8G%hv)Yd0!9w z2<({A#z|;n8ua06wCR1&X)ICsr%*oer*Q%ww98KX&0^9@@R#FB^6Tt+2mDHCd;zC2 zdJ~Q@Xy8e}*MVM(KBRsmdvOTmY#|?(Nj@x6`mhgvlHVIA*^V_2p!gl}Rnr%sJ!{xp zwAVN8Z7#L#YPJNz?kasZ^pw8Ap>OoAMp>l8wfJVYb{qMgXxG2N6E>lLf3%mzUorP( zF7iSqN#N-OPj5R0Ss1Y-jr+ae^#?*#57t6=QgA*`m}-Vt z&9$G@UhWvu+&!!+AAIUdY|g#lEtUvpDR48s?XIvuH}EdrDO>>>*{8LjEv9lU%B~e7 zO?j{e3A;vncVyQhT;HkRWJscOBIm@j)E}wlT}J(26A&k;b*2i`(WoEQwbnv)G*w-X zaw@5g;7@g&3fx^syiawU4VqEM$w(VEbTrbkzfuuD_{5^E`e|9m;9X>|NN*^f@#u}m z?>qyP;ytN5NN+$| z>W(Zc%GFKs40KLq-68)*`jckv44VbA}XR7gT3wk$^`ZTg? z*J0K>w2S)md*Gfv4U~P_2%6ESdy%HNhWhn$N`rqLaMB6-HZT;v6n-VC;wWqbc+#_d z$g>}HBi;NSc^=32=zmAsNdIVk_T-E}*xw-7;b8bjt6Z-=;bSKj1ki7}m|a((ebU!q z4s7VcrJzY)2O8N##5fTYTTr{{3@XWoY$Mr40l!s?G(8&xTNsaLBsbET3z4qxgzq(A zQ^{}Pw?HPnUJKlQP|<@z(86OMAx_emy`t$M9lRF6Pi$QR9r z{#}Q(VaxZng};I=r@i{2pwsgqxRdW7-GMKwUV?c>fQ}JVtYkznCe|#Gx7k>022M8X1lF4K!1D`UYsPtiWhoVEjh*V-lgh*0DDPqL zAUV-olJtw@a$MeH;FCu{7luP8u7_^Wz67l)^ZrSx(wWowfp`{#Ji*9oh2G%zb+9H% zas4Uyl+)0alh7er-&+%a{RWJuCd5_4%wl6AWQ{l~sUC6g9kNg8j5B>xjWt{NJ^H?t ze)s11%_G2nILf&maRJw()a)E{n0#_)xrX>4>MZA&ZD>BJXl0<0jykYLC~25`o~-Y+ALqPA=-jcueDw=Lw3b;|)1Z>cs$xFSuRFn^77ErNd_eOKdz zzU_^HosGeH{!Znc@jFgw!D0aItxzl=Owr|^pq!)7{hB~AU}LGhanUyPJJ#B1u0IvN z_zB>&mKl%u?a01l>?dIVP1gPP#vf1@iWBJflj>m0sH|QbcVC1)pf(w6wG?wvTu*Jg z17(tqP_)G*#_E2gilF&1u|(w`+tBfqUS`T zdJ~=GSS$VJYv_9ubO7s-b_;YO0J?_#Ht2G*B@}CtVsKWR`lg!p3}6pszcyKd5U&S9 zo&nH9H9s<=u2L^zNiQO#{+v0)zXN2@pc9Rt(K#T;glNgw!8;@H`w~mqS;vxIHGP5g<({N3h(U2ifu6NNi~;?^Z@9$B_31c1v(Sk0 zk3=Ju#(9O)hb&ceexZ$3G_`hyfp}R%5}b5~!GzeQtWC{S6ZUQBJcG5HcvZxRH;-WL zn{*QUB+iMbpPJ)$b=4r9mSTd>Fz>nmGEnp`uGff;-;^YJH0Wv2B|67640QOzhQS!~ zWVb19ruFfSC3sFT|2E|h>!6!A8s&g?71Fh(7Rm2&q-C99&rZUI(|WtW{GkzJqayg~ z>Wbh+)l?5EyAJP&;3dz^#5=TRPiulSE@DlQhfI;Qz7_5I7|+NypMV}WfyXiMt1S)1 zJUxu&>VS6DwTm4?sC;TeDe@D4;!VDr=Ju08lXXX3*WnrAG+rnspm9WdR*gqes@8x; zerz@N368)QJ%@bt-PP}*5Koh-OZhC~1>VHR;D0UAf=9`A(Hg``>_gPuQZu9?_*$$J zjHq5`dGeaN;E~l&S+1#G7d)hzeAiyf@aoQ{$nv$8tE)f9`@~Ou^U>MWo67BJYoa+s z2K<^px$&T352AtkMeegQOwjOUeD0sCW(FUjyXh*@QfX5b6ZF8WrJ$}?k38gyze@%w7)! z*I42j_ClVt7q!R|=Zpc^E#?NYdpA)X!yOZ7Uv?1kOML>(v!{gE=76jR)`w%H?=&O- zTI3a&=TY7MhI&!`F#k%z+DbI_<8s_PBOk>zD)z*BKlqTHC)=`dt8mgf&i%+I$I_-4 zHI~MAR%5BAv$Ld~W5O3G2WQyixHxeM*3E7XLL3k*W6pJ`r!iltMcheo9gP9n-wVWh zGzMz1Csl&=HKmWyt|HWd(v+9hX7jln=$oWO$d&8}?GsXLM0;o5aVLCD8(RbRLR;J~ z9D%V>cCF|bfU9;ZKp zdXk-_eQc5w`aOy29V*|UeZ1kYSJ%rJ{lq2MKeMPfy$&+@9_^=C+itZrBw{R92+tm8 z2=+LKV!tsPb7JGSw=1tvb(o-`@N6|`(k>Y^=-~>`XzjtF(VU>s__2Yu z5D*97XT$e26G11Pbs#OUw@T&R1DXI%vE0e_qNyYLko1${Ga5f+iwk^cxs22E98S-` zo!%!OLhs8u<2+m*_}7HeoEPgOm|sxbY?M6%&up^>HahT)_2&s#uQZ3txTXwK;aZW4N3t|JY7L4^+(v9wjRmd(H`W65=1VZ*pRUf(z;Mu5I*^SnC{BC*Rmgizk z;SHlAqsxu=Y5fdqtGk-briOIH71W++^g|>3YZzp(L#p;;?T{^Omx+%^RjHn%hXWDGfHs1h@cgF>Fyf>YP}fTJ`$kp;g3_ z%6U3f>@qEw+erMsM{M!~W^yza@S&)=xl|G_NNcw+}Xy?D6y9L3Wtx(1r7yhP{YJ znqs5+#Y-PKfWEONn_q~Fe`HA91%S?gNI(ZbTR;dP5MX*_$XeK4>NE1eG&iF$XY|=> z^cm!avEJ1cj&e`JUr>M8X3cF318#?I8G1!>r1K;}puY(@so!M^!nh1Z4CC|LOr<7g zS%7(0Y@q3d1lRyN?Sp2XOu zbwV1SbRJ~nqU^?@XG{(Cm^09skf9dqA*!q43!g+8(hktvn`{Jh?Qfuw9f+ej`j5f+ z#OL@vQI$h-C4Dy~H^gC0e+l@|vqtn$J;vq;lqF-l-q!MOu!dhzDiDiybKOVnfUQM* zwv)~r-VL1gLJr9J1@=Z7)n3Q}%u#4fY0C+<7jgi4PIxlmm}?(^f0xgXH)D@X@jv?` z#nNKeHITbF9z1X@(sX|47tm?Wv>5(&EyfXz1@g5dgIH7NLrbuxI23*tbwa<<+DD|T z1To1+c<%mlTWLLWgMWa|>b` zs#hcK$;hMX72_g#tGGnP0f_OPpPS>HCjgrBl<Xs>ME#p2WRMWP{(YpjBX9$EMMK0<9J{9rn+i?<9P|kD!xZ zh|}n(d(&Rf<=TQg-$wg9-DKa7BR-HT`7M(BXw(yR?Eflsk8Dg5bb|Vs#wytX@*T!H zw~7H{U4|_Tpm)i3$veKmmG@{D=_|#9)L!y8C*{41t5M#u{wMEUT}S1eY^91V8tvDi zKZc=Sj5D(;#-O^<8V!v*N>lk{!@mQK#wPu?BH3!C_hxwp@k_*EA+UKvP1Zv;jNv4_ zLua0bTG||{z#3ubqMSy2$lzRz=gD|J6ywDLy`(c!ZQv6Q;mp{jO^bJrl4qsDTsbD& zOLTsU?8^OT7VI7wAe=K7CN$Pzzp@VX7(uqqWO^Y3F}$I_`=F11hkd0wQ+-KiNyaZw zy``?wnr?(wOl~pRnqIVsRqG7f9kB>>ttEyXjrK8-mE$yL>%3*PVS=D!YkNETH7Lnz-OeG~Kp zcYS_B<>o^cbT{;M4c;XgI`AIkuu}}`s%&mRH;UtTX3p>CTo(tQj(lep{nnaZyIngX z@Oz@-z6o?Lgw~L04AcIn$rMsfXFZN%ZI6Dd=CmaMW5D8aK-QbFmi!8Q2I*Z0`<+Uw zkbbAxto)9gQ{mf2fjUTAfw3uRuqCI!gX}^Y){*J=Y{&+h@q0G3W}A&?wBG&{;u?yl zL%@UffGH+wb3@4L)e93FXN?P4O=m-sm)NRPus)Z*L{w*(97B}uM<0S6ne;m1p-|+f zGmMA9fA(No)x*iQsyjv|S2+TctEzEE|07fQdl_w0kZ$K%8ktgcxmmn7-fVjB-==UE z(QXt0?-h!`_bxYg1m52DA@*xA7Mu@kA%D|G?vc>n3b-G2+KW5Y7xp2k67uPZ`d$T` z<}_qSVsNK+NEyKHyoPp?EwjmaALgI1>l=v%dlpCQ1<*T+Ey@0?-=U0=>&rjDhS6_I zBVJw}XA%8j_mX;pH;omF{T9kH@I40cg1&wu@10#=$$K}~9(nJA^_O36e$$xN+@m3C!z60@}b`|qkObZDBDjw0qa0JO!C-AdwSi#gZzCA z%1}H;nZftPhi~9z7EBFbat2GK3ZEp zg)w@dyQumVWziU_376~QJ4a&NJK9^vrel446w;#_dN?gu7pMJ<9{6r=^*XFcbQG_e zhwaN-)7P|V|HC*pjdTju#Ko}vd5=CR24^BYg1+a&J%_&U13e6L*HENw7-#goANd6{ zzW3`6aNwJOUU+{0?P72u^2|ItVs{C?0qhRAFSKUr{f~>m8CXNV??Uma1^4W;<9Fwr zowD18b@Z|oVsJX{_dOy8JGzKBmn4Wc-=OmlsBazmaXQ+!8f)zR;Jc5Z|Mx$P`B^Hh z8O6YcE}1amURz@?fM{zSYYnNH8jpJ~+^K!kuIym(Dzz=Ay?B+{H462c1)#Q4yX1F_ zpr@c6)W%HQlen#yAs@9P6+rcW3P5$H`leaLo9UtA&1+G=TI?NCd`0nQT5!pbx;C&y zp(R5o*2-vKGGvhjYn6yUX&qOdZGaBbxe`0xrI?Ye1MtM#CrnPU>130FHNOoXl*zj@Z$Z*L5f`_abv zt^i&a3WWZuvkMeA-i5l5FGwT%hJGZQHy<<^BO(^2Gh3%1qtoc`V|Y%!pL{vVcq-bx z2xG=!S@N8X_O+!hbaBPu{R%o?3Y>K3v}|uz*I#kRxlP!duC7v~Yt95;X#qcD4o3T9 zgp+Mn`){3GPWf(x>tT8KK8M=UZw?Pc-y}i@X^$^0$|`;T4!n!Gxm?eWhwrDkCdCbO zPK9jCrv2(nEPW$@?{pA@ThSLG=#w_+8}0ici&?JeP+Uy&HL_jbW9~(EfcAXJU-v>; zB+nWx=I#L+$n0V&QO9rh)o=V6-u2n%-yTl7; zH^hjyU>q-cs+Y3{XB%qFCV&}W0R#X70YQLZfE5q|XafiZgaO(D+5y@F!T}us9RZyH z5r9ZQ6d)Q91LzFs0_Y0p2DkulAt1IIwqi()8PE>U1`q}42)Gc?1#mGS0ni(e1Q-bD z3%C|=72tY63ScZ?6ksx70^oMQRKRpV1|SbG6EGK02>2^tA>bZB3E&~X{eTsKM*vR( z9tS)NSO<6>-~zl1coFax;5EQIfUSU!0Pg`l2Ydqf7vL+v4}dzrzX1mU#{s_r&H_#@ z8A5X+I&TzfF*np=uONHo{6Y9uroX_rh$lV$saeLcf9oAn?wLQC8Y&RioXpI_M>x*P-%E;M)uHsxs(tVx(H{B>xi5yr4_v>*P5L;aW*Fjn{hAy|#OD75!}< zS}QcQwKd&C2HP8}`2n`#E&(DIWW^w1#iA3Gs9FOW;NG1KKBB zWA1v$guWqvqt1S)vs;sq2X+$EU*!{g&t0~Y@{ai3c{%*%deQ$Pnt!clzqvm1@I}sy zQTSaK@GxX^3g;MFT4y1-P`fwd+o%%E$+wto)#iXP`}Hc%zwkU3_VpF)%S7F~=J7em zQwzD#dKksl(;*MfUPvd|9|~9Ba&|;p$gk1)7dnqaGWA`vpzn%KVJ#1BR^KF-s&A6j z84{B-1AS|pyNrV!rM(i&+b5;9@I6=}=-Ir#lW8R#j*$C1G&lYpzSM>G$oiv?X>aEU z_I9e#2Gu6v9Ekd=`qLVHgsV568Q;v(_@M75)OX-GZ&j+kgZi`faS*pGhYxFcAEz`3 zK0g9}DH8rE3O+v?aaj!J1f8+J7KptHO&@5@(p)nn4RQ9~lH}@r_d_@EO>XA>qIz#h zD)1EG7U1UU+o3NTHGQG8I20o&eNn%SqjUkkn+Sa&edvn#tFm2Wc{j{INMB6$uB+3` z-OAN`lk_Iih2MT#xf%UV{_RWX&TE(l()uUGYBa~i*#ziNgzF2uXCnEh(z!XJsdFHo z*3sHbq^tJcRGeMFxexST^bK8C*9Kdw>w40+9{7!c(e$lH3eIf=;ad;-je%gK1FL6~ zPU0P7J@akwssn#I>qTRE3vjaSa%~lBoY-q^SdKNIH0X{|ul-d1M64&nU#~?hUVpQ# zDf?ve#`;@uj)CrWoM&%p-nawx7lEkbz4*p09^bgNMZJ1DhL{8K+XoMus<9?jU3ag! zn%1oFO+~fUVlAh0=|{)?1^qV#{dhC_b29q%Cd3<)pi@CDj)A%s#sJx~mc~Hk?~DPg z`<^of4x_!s7??x-f$@PD%=tLU4r#S6hq*NNduD?s#{^`zMcT-7$AtQuV&Tc{8WA5GJesMjH}XiuK{z_7JDu%_11x3^Z%4cRDL z+ex#v5w3BNi>xF1+}KB-AmyRz{Wa1wN2mP<)kn0Z8|m7Gz9yex?57*D@bo*z75eKj z^gH>LNs!g@gkDamvnY%FQVn=0y;Xkb4d5gX%J0!x)hF`otkDgupuW z8Pf~v;BWQ$;4QM>jXA73+t3JGNoTP?Lb+0(v1W<+mXl(bcR{1M7M*>SYoS=TI0!i$ zT8LN$>xAE7E%cJhLd(;j#h&nds-*)z_9+`hvY*oN^>_La`ugrE+(-*TV~I_pF0 z$wMtshtgmZu7sbb{z!)(CVx1Q`U2nmI)Gn^Gxap*DxvRj5P$Z-vy&J<^UgGHSc!N^ zA456dT~|W;XteHz-|t3V#7qq&SK3#=I?{UjE=lgUqJH<`+oa?WTXj6Xx36kpj}ZFh zqZs~V$ z1kTDoh4<4irWXfcZ-~-34?@2a_IFCRL%NMJ~MIVDZhB zjT@1FGv`nHf5g3cd|g$!|G&>UX_5|UrI+H0@%tY%~c^A1+_w)BM zeix2uIsdhQa~=Mcjp@(T?As`*uu|}VuWD$w8h=&vT%tDcMh?qwtgo4r#KKEyjsDc)fZ?VZwA;oIjmy%xQr{W!t-P@1baoXdNwi4R@L ze%pH`tyl2gs^&b^ry*B~VKCS1{JOT<+GKiCQ(pR9-XW%Rf^e-^n%4opqTO`B=g|3| zg+4#cKFQwAbGlx(78jl^mS5ELkN!`J-rRXDc>9FbNBipiI!h`FzZvzb<$u+kVS~E! z*qprU7GzbVKb&k_J~dq)*!O$`WXkUTmh(&K(>xYm6CIl5jwYwOBAE;SU-%2;q-3$x zfEI_>xHZ^5{D{A|AhTo}%>oCqZ9e=DY$9U+TlVuC-|=C7>kMESIxCTy?sU};vfk@L zhU&eCqdSVOjP58Zgg2yjvU5BgKS#FqtYmGQ&f&Me#(4m=_bqBWPi0)_!pYLu7suZl zzAru}_Qh`}9{0V{p?&eY+!~N+z;Knb2PPbSHFDz|&b^MBA9P%uupEeK zgyiBM*{hkXOEuS4(=&8VmSS$@)yM|%1AL?PiHB5$cjMQxmq9Y@-ugxHSs<4)&AQ~ zo!)iZsloTBKU%lxwo_}j-gaspX8?tX@vZf5+;-~ef4l8e)eO0_)@UuY*u}Li34W6N zq#mtJkuwjxiZgb)ni1LUob>_AH`sT@99#|-|G&!rE8IRvKN8Oa$38#jalZQ}`aO!V zq-UjLLU2(tfBK{6kQb#KtBK#QeN;JCqmHS%x9I#>VGa8zzk!_ljtQy64&|MQhM$o<(^}Yr^}w_A2xJ%Z=Vvf6D*^8v!8_%X6t^0;W4iE6`)Ax-6OLYbWY8!6kggJac=^=Dc+#h@ zx!BXfCOc?C9^awkO!;ACkn--j zxHrc4-2h(H_l&H*UCM)F56QLKF`vH`L;5mfPwoCdT6Mn`|EUP4@Qxds@syi8qn+An z_(%Q6qci({%PMu4bMQTAd<1IodYZr$I%c8#G2MBmz0$nWFP-R=PV7pZFU{u1bTRsxc;>6XD!cwE zYQwwWC+}w#0+;f+w@43==jHSQK9bW5Lib3?E~PE}J>zE2 zwc6(Cc&a&gO!C*_HkO0C^O(#!rEB)EPU3M3gX1SC9=9;65m?x8%@OHl>Wh~#Ur-es zo(Byk?n|7vAPCMCzm2F$oY%nL3xdR`4I_B=mBe|IZ(1;_As8_#u_ZWf#9xE+>Udtq z^A$I>j7qEy&a1hpc~tF96N(ywyrXM^)X@|3g7a#F>QMo0K~P2dYvO3xbISMK%DVQm zzHWGA3plO~YNzTui%rneDDrFagQoS0L(U6E^#K2comVzY*^J-8*|>uj{~$f#l;E2q zp}B3G3qOtDnB4K5MP20G)CD73Cse0i_CM1W1idqYM9&)fCKz{1kl#8Aocre+Qu*sX zwEd{a8gMvmX5yPQ#8YYuYp0%77^MFM?lng}?@ioS|6)UsXdMwGTkFTvugha^3WBCZ z0q`tm?GNs&Z>?LVQ_dbd5ybY%EPYT zBe8$lkjWpa;hW>BksX}Jtml5J^mg!DsQaN3$)5al^OC1IPfYPlKF4c8s;3se>4V^P zBR`twsUXkgL_Hkjt z7xRKtYeQ|29?9wIV9*4{`0cNxRo&$Fvf@= zuXO=qxQd%Z(?uuT3 zn+~6NJiZ1vl3qAI#*gAj$<{jP?}Vk;D@%i^i^)}=(FqT+Ka0n%epU9Hbe3@Ntxp7f z6M$QGpU$B&>uZ1btH7r|>Z^B3=%+KLnc!)LlVgFCWAcwYjDG(F*YVLe*cWd&%kAB& z{`=R<*S)jgWUiZv}@9fE5C>zI$9%6**aOIeFxR4PzGDvPQ)c6_zM1@}Pb#aA)?i~r{aEize$-Fv)Vf7myDkfg``gEMY?E$l3>?k4 zb+#wdT4M?87SHruo!7Q^&WJX@f3rDnm^AmgUd8O|%aK>yc{vMRrM+CiTDDz8Oop|$ zu=bvoRJw(=cX4l@XruucdQQZ@X&IT`MSOiveO|gRRp{b`d+SG~KXpa0xaUOb8XQiF z9Ztk|!k_3*YuMc~hP;Z=yfZrNxd8sYELg006>HR-vfXV?o9}qW%pOntt?`u0Cf?JS zk28k)Y~c(=xD#EdkK)!_fY%?Xf4~J!`yL8 z!|jYKd(y3mTFowU#J1E2eG7*iTeYgz|5o~JAAl!MXUcokm|dwc;r7o3eK$qpZ6aS# zFsSBRYZL67P7eC?o??f3=bKUAt>n@TgmE$6HV(i|F0t+)g1%bxK&^A#s>IJ{eBkr(_9%^^!=Kneh<-aOMNb{C^t>> z`o0=(ljsV(FNw#^-CN(+&%ZG4C%JXt{L7>HZ;AVfpAPI-7xlX-?l+JJbjDz77o67) zv)`3*zwtTqYVFzMeJ$=cIDE4s_%4k5<-+I3@_0GtJ^D3Aihjm+%I?S1NXC;e%%A;IUDyG7z@I0(|4c_7`*Su@S6A0cUBDR;QQ(K z|04QrK6hw*`n7MuSKrJ&og0sv%hR4u{Ju_)`wc$7$H9qlzrpu?cC<%c{|u!w{CXx0 zbG(YU-@*6%(74~h*E@oKn}@~2`Qe^R&Bju0e>M*fq@%Zn=;v|makzPy{r(#F8+=ci zBV4bK`yG5wo}u5sHD}YV-xJZ!Z{sm@*X-A_A)5Q~_vq)>+&0X9_s9JP-#@?RJLz{Y zx#IiDhPXW*^WbY~qTg`kz;*92reF8f!|XR}nEfsqX1~u2vtRu%`%R7e9h??FMn6wu z;*V^8@w8*MU4A$@9&>Pc@At5hemw*1MUA!XBH663y*)dkMcEMCgAHt+8% z_Rx3r>G*rhUU!N2-AbJACU|7udtdQK(b{7F7{A%uw_3mYoj%+9cZMg~@40E%2i zJ&kW{$luMz%l^jaT&%~(j*jNMYq00?q2G_so#SgyNo4!lFAVgxx8oO^Z#2f?R=&1; z%wGJ}UHF%K@WuP^dE`Uw#sB_B!+}2J0lqdq-ah>D4e}-NwYSdl`!%?){bk0?wNY#@ zvVHBpFvhTbZDIp|jQVG6WXT`-I2m8Noj%^z?!hv?(uzYRe9k}9u~e^uOXaGkn5g7cBM z-{7`MUDR(`+;1QcU53}F*<9@mJ;y|0NCGIyke6u6?ZixHk!Z#2v|NI{PnxpY9 zi~Hr;IRoLlgnq;IwLeea?Zfi5$Ao9Z^AElrZwpHQNanqlpZ&k+*K-iR#M6Ux^pWwH zxpNO(dlmhL>t`PpkD0sQet$gP3kDfeeI$#dll{8ApS?HYTh;w$%jSXO?uh#xoNv16 zw{;L(#?L=-fS>)}@wkK2XI(^39rQbxJ)FURVfb`B=HRkpLp0`Z;(mkU)c5;&+%I?S z1NZY``VH5<{t`45XvdA^Le-dmN4#X1`?IZ}2^7j&R+Jjcu~<;Cu2W{RXZ%n|A%4 zh<09&$IM-`U(1GQ?*Dp^etyl*53}DN;(mkgpI`Hn^gEbb@%`jy|12K!;A?q^e#4am z_rAxNe%s!lj=G>XwF8Qk555>9jiG1VU&Y?Mv#^=5oe{(l} zxA@BJ`={^$>Ov%UAIdT=}`g=Jm)VVVEk}y|QDBo1;JdSm(WDSe) zZ5D$st?^sH#d&*LF@^H^3HNP^Eyo3YPXpU#-q*PDTQ_sYwT8Ai;Gr9TcN0F6&i*7X zm8&Q}zx(cdYG8}PpGJ8eR@1NifwC~9O?QRqjvsxG!g2>H!(+kOmgAHwpnJsBF8t^& zs>1MtJd;nRm_tpw&h)L1&RF~S`GDS?a3*sK4tthZquj>=?no#IOL(p^^-S|=Zk^vA zn$xbcM%|rW6^^7`_kqZtPL63>f2VN3xqv&@CqA<(ng86XWbJzLt#4NzfRESgZ+z9o zC$xV)W-}bRdU@}`=&B^9tJl9ekggQZku7L+b-@6-x+06N-VZ$){6B3wom@TTxJ-=s zAQd){ht@DA)hfE;ZkqL<9LL}6`!eXMcGB;cOb?d6T}SMvX3d-AK_uE%5=-hNEI0>?#RXcHLe3s{lF^eToiuAJ(+!myCN4bb1f# z6kX4SPJgpD=m@IUEYTep$<^c$6Eor4u^s);W+(B6&WUT5Y`{%vav7i@kW!S`o!-NYA7w7Yk+-cinACv?qv7kYlwH(|t+z3{4d zQn{W1^zk~rl4L~}I0>N1e%7aT)di__8(8xO;H(Lf>$)x?kK%&5slt!&0xanhTKLv1 zxX>PGZ}qe6#+kh}jnN)NIW?W&pIp}C_W~35ZLQzQn0vqvxZrzg;z`}jCBD#IOW=#V z;M2gDc;E7?ES~dN4qu6fl^;|d9!KA0c{N548BNb=OF}n7wyqEc2+sr?C3d?&%N~t zCztmC`>&wyA41W2H$@FiryMr59~+Z}DvS%0EkZF;7dWf!;>&YyAZ%D?mR>iv!DV%aD9BA0cM&yibDy>`iE!Q|T)1e3y@MFIE1C&T6Ntlr?mc+g4=XZ~yw2GkImwZC@-t$Fy?LWGg)Z9p4Qd3wFu7 zyPaMt3coG80^3QnCEF;3Z*^~&$&5_A>{#e+B73d&I`-T96v(&qqZf%rh5O=AvOqS* zJx*p={-osMPqJxpyy(E&M#g`FS#p+I-?ZeW;QR$J?}Qic0`9wj_j+J8J`I4+>@&$V zov%23w>n7oG5-y2Zp&-4e#POpXfyjlbvY&v<^i|QN&P`z|K0kAOs0?ahwque*J>A! zX??Ow)MpFr`t5C%iR|;^UmBY4_BTEr=N2AE?s!q&loR}3Jf8RQ6D}*QUGyMy{2+8l zuI2ej#;ZdHPQG&Xlos;xXZ*(Kf0pu(=~qL)YWk6fysetrW36MUWNoBBlt1tDbI~j3 zd)nUL_@7P==v}q>{|7$jJ{GO>XyLmCyw?6ENRI%fccB&82=%N%yqAY8xU70a*z(qQ z775;)ubR|5El9e$672JZl203v`Q)=gGsR&qdn@{o4YJ^^+C}c3I`m^5bBt#{^i1@k zz7wFCT54-#&ubj{C3Sx}3ma5EvtrI>(@Rb+h|bVKw5YZ=GrygZ_FV1>rj_nj|_UPO1L;j8!>Iu~0$5qp9$bebw8+ZNgs2+EJrO$=dy_?!k|Nrg$Uz_#+E&NZ-%enq}Gyi*f+{iwgj1S0j zuAMrgaQwBM(9?!-Q%=;F6O$i5p{}@Ad)rY5%_V4qKG!32(>GItu#EbUc{fq3gbuDb zfHsrc64WPU)0t>V-^vv22aIzIbS0V+or$hy1A}t<|A5_8TOEYUp)1YRbk)S(dDsKe z^*5ty1jB-x66u}ncXNQuObzE9D2I(;`ldnZ6UqDAC{qrq1k4VH(y zw_%?-8sr`t*=X$1jqI`Xho`~sg7bjyPYD;EN2F6d-zd(@T_!pC@T@C`w=}NF8QB7* z;jElFO2W%D2X*a&QS`a{Rm+)H-+^>4|L9rx!syta^~%53`Inu0iC$LINAz>!KkR%AN^&Xrf#L(%O3sq zKJRAaxtHzUhL-&-887=;`ozn0o#Q!~*v>cTz^jw#=$tvAdOv)P*hI z53ee2aYjpCY=2H~7q9B>#r$y7z4>k51rOf8HQTr(+!4uc-AU?o!M-oR_uyYLU2t!dGMgH%I@CwGx*u8qkZ0}jL+c*{B^m=_q&uqU-+@5eh4ZQpp`1*D9 zu4_%Sl_B>?vk){0Q_FQj-%cGU4pEYU1;kz`RifIk6^58DS*dR`(SYd#U6Aw*FT`+ z&G;R@-S4;PV>i#b@hJq8o@bts7s=ZG&U5J+qZ8Zvwa(U2oA6+;{FXMIElGcvT~rV% z{v|sr(?#&a>L>_qfL=WZ@@ck<0&$J6?Hs7P~vw^SINAItAhi z7c*vG%ZT(g;!j(Vn;(Q`#m~wk=|&#w8zS;qwh=Et(}asB~<_)spdtvD|Yn=#1^3S;_znm!9LTP zlE6Z38-2X}r*W&ojriB^Kr1~hsF=`LLc)g1?ZD5^WjK|Kzy*?F>En1Kaz&~_j z+jn9;9X!Q)l<(p3Cx6EJ7lyTrt7m>rzm^Te>!$Lo2f8;H^^WX)?!9R*0H33&haTl=_Gb?8Yai6t@0s@C4aTtd#befYOVnmK(mq)GHt1_Ju?Oz> zqD^|n*1HebHgRUneP7{L#W=JVj{Zl6J9#!_oI5qj<&gEa6b{L+`X-KOdvC+=aTC+q-Qx?|7ScbnC#F|h*b~#`Ue{JQ`ELC@uat))BR({KHJy|f^Cq%@^_u@( z8eY#lTim`$2Uxr5adM;30pHMb$47c*vO)Ht;@(%pFiMWtS}%@iDI*s)T_D_uHZ+E( zJ=0HriulxM()?2K)YAl+IXkDKA0BHG@8C)76q4GT8QLo5!rNBvE1+j@7? zX8c+Z@syX>Bg5*0@f0%NYSy1{KDTt<$*WD*sRp!|xy4U65qB{j(z(d^$PP`0f5CPV z@BA8m>T5})m%vX;;HRsZQ}L7=;V0>K-9tE=+Cwj&oUH?GdpY(x&n4@>;AENjMe@bu z`3uma=*a9N?Qv1Kjy8>HZK83b-T!1vwfX;N1K(;#&%%fFlI`Uq4u|-P4!6cL!tb5J z`+#_$@>lmaKI>uu)ERf=@y=1`Q*SGnPnZZ7D{klHOpIP34MFQf)BmELt| zK04g&c;Rg-_Q9*z?7LbD(p&kS(BArFdNQ;#*jb?Tiv062;3%6`iH$Gb>SVQON_uZ3 zYqff~!+56slRU|1Pc*LVL)FHKe$4MD)_{#+XN`QH1lpI+)QNu}-(NO>`Am$De6oDO zitt)+ZDUu2e+O@F?3O$iQ_wvjcAg_%sc>)$=D#tvV%@5Fp~iY;?mEk(cdA_f^${E! z=r5cJ7TF+zMRtndI4|07qZixTm(B+t8lQdAI*QpBdv~OJcWX-amFUgJP+iTQ`Vsir z#o?)pr+55(vS-b&wDUC0c|3h&dkUxeR_Y%3RPSgGd+)Wk)o(g-{ip%s2^R*x)m%!p zR_Cli<5q-4&}=RomMi7`CXG+PH14wp`!aj4ME~j|zA2=ia(V=t+2`Vwk>Ty&DYvaW z+$nlN@94c7*;BrS0FTKwm;Wb!Z+tk$@s4ap?XBbw_qNm4h1|}C*FOR%>+qaJX#yc843YZOtk}oDl9sq|Kyc*ryPn+Nt-Q=ztX4=xjCHv!mG?|BkKGbo#OM^|rJ5 zsA?|=|J|)wIw+&(D;%wuUdq5!8IE_fz&EtnhkM*!vuCV#EBkEk8xQXS#$LhU_&blW zb*?F!6aLI;mrgWWw91X=aWB})!f%6{%vyY3bOAc67v2`n`saRc-lpBRIU7D2U-n71 z59f8h{D)0E%j~=GSQ>tbxrJNHXD}K5qLWRA7jG~AiMGsq8UN!2H>UbZM%f;;)7RTi zl7(LHKN{iN^nPVzQ&om{)9!thE$9wgk7RLS_yW(~i?96IsJ8{&nf*oFVZyzQ->bB{ zM0EZyos^vea0+)8DG%U2Vs_%U5_DA)ydpl7u2p>S9efL&)6XmmPSo#y=pezp&z;!f zClYJ!g71p3BdRz@)3?udKR>eVgT#krQyET#=kej!+}hPy5a?}P~FKCYw*g%TY zUO>BeM`K8?>)B`3hAaxGby566@1%fNIR~a2_~sIO!8u(=BeG-;_buMXZ|)L&Y$^A8 znO?!)XPk|^Z~s??--0(c!eci;YuCeHf91L99phiWhR-^h5Z!8@jR*hh^Na=UORs8O zqAkI{5xKFRXGUw1rKVR;WelxL@?x#vfS=w0pG$(uuxVHSO0#E*!Y5-Gr29l`(tTCo zA+%eZ%gg(U@L_n>=GWX6;Z5+l`fKm>Q?0vks`)19=|SH#&i57n*SCB-e{go&Zv5Zm zn4qmWRj_iBYVcwi~_ z-~_y@9GNY&?Qaa@GegyjNxzAobhnS_%-z3&->+{EoX#FDg@%*F_q9JuZ=BuR#5e6Y zw@H%+=+0-deSrOquQ=P^`8n9?%3Uzptqku;CR#tvc$^unBu`-d>KiX*tjWC#80-Eh z7o|je!p|zsP-H7f&MjtbI_H;d^S_~&rO1X_@{Ov=HPYG6(i`V6&T+juo9F)617Nbe z41){Z{eo-@`EIf;9%AeV@q6}hRwP|4dsBX<*-v#Vrh z%FZ^MNi=A-P-S?%(;Hq+8$V5tb(;9Wc=A$5|MpyCFK3P!w26PjUmM{;;oo?Te*7;P z-Hd<89kZ)+9;!LUAt(ei6W)3%2`&#)+bmOh%R zlRdXR^k>~RmvWS*IC&^KGQGG2yp9G>2BZ3mK75_2?fo&lqjhEP{Ryl~@T$%4`!dEc zJQ}XG*6ekN?w10ijgz5+JL323{5_iv{QfTDJulO3&XVwE-m|eXF_ACP=J)0~&LQ_V zu88xvF2Zh*&0;dM>;ReB2R$}Lvhuy<HlB-%8# zWZc87|5k8Pi;ggvH{RVPvYd9=$&!0I$C-Kf;Ii-EkbSGO^}+05NA0`)7Y=Mwj;EKC zIv?%ErZQPsl_e`J7SkBX5Y_o=t-_n}j?e2cxxcd|Ki!Lb77ZH@iWhv}44?g-KDn~e z~Vc=tH{n73P+l)i~03(r;}M%xW7<4okk9KP+Cfb-wf&lZ%4U)6_Kf($_+J{0oNc zeR5~@?9(a0>iq?cA>Zd?5v{4+@M3X1opX46d^CE`-Z5QL6VoX27#m&h4%D~RytgUB zq25&=(U9oM@B0SM%Czq#^!2iwJWZEJvcK_xwn^BY%5T@%)?9K_Wdjv(2j}Lzf>w)3 z2jP+B`K_y~gAU1i*}eW}<5=z@B`?$EDRJlNyh|+~OJia`r}gXs`V4%o9F%tQy(YN) zxs;$8kG%J^X7WQX0kL_>#tJ81$8y|~(4Z-s+F(Sbu+{?$u$4Gl0U%tJ= zKQT0&gUELj%%XE2Yx^}YO4psjnZlF6Qw&W@9y{O1^)C(&jd(-v8%>vmqi8c)%gD(R zXy5$P4DAPTzl@A+jOA{|M!i06(;k^DPB>oDSVqr($QfU4CE*rm(%{I*=7yZHjGw%ZRc-xM=k#Fd9GfI`FB(MVeuql zErKUHTUtZC!z>R^QrV%u!$}&r2jdA zA{>Zs#4mfHp$Ag=Z7UBQd(<-Y-2Fj$&og`*rR4CY^;L|wYGV76GJY?gQ~Rr3d~{lOM;-RwI(QEcYSebt8#z8r~8S6vUSHzUc2Nt@@Q2%QOUc)!R0B%DvZZ; zxBGq2@a4#)#!2|t$UxEU)Kp3955UE|WM$87;6OZ{;fd1lHR3i)Uz|R*JXN%A=ET)Y zc2je+6q!E(m`CpIzfjM117k30^^&EmWhro$7MHay1?I{;>T{6oL3!mm@>$6(3et0t zv3jS1weEyJihy-0@6L9x%DyUgdHsTQb_}b|C9A?!d@t=%2WxrHd|)+s;pK8^xDr^O zVvfQ2n%l$rXXLW*{R?2`+j008KaKqheJf0{lDJL;TX(2B5#l62i|a(N`(G8$ zLYv0J2seR>C+_NPX3ZezIg=g#7RDq!22vUqV^8;N}Kk(!24ER2w-D z_*`uyu*$bqZRCx#Nw0Nt_s=G5J?SK!O-WvezI|=v!{AN!is>uqjk0h>giF~=%F8ny zUm1Rt_MvJczsR$=HWIoO|L9#`8~ItiJFqsA`cBzJs*OC8=b0Qp$$sz@L4ewZ`~r z^q%sp-FwZW+~Cy~>nBCyriTWppDccl z`bl6qX#HfQ%i{V;Xi+pQJ+OPy5cQMIiA?=uQ^M*eu{Yndev;UBPW@yH?_zs+dxCR| zj-P`kS3e0Y%C~;s^^?H1G@2);ev)=q%LlCm#EDgNDLJgzdN$9-^^?RVeEnoUvf0&7 zf}1XIB0GE7^^@rK6R=Hnt|a@w@9(ng`pKC_pPfV1Pl6}o=L72}F9%^|9Z<>4i?FH3UnLx0ngveU+gU!dLmzf69zWXI=dmyFJ>xukxQHJ!~f<&?a_ zc>n*^PyX4-Zi9Vb{p6n?PQNX^_%o*`eBGI3z_9DiT67j-b!VSuy_U0P_ON7v?6Z8@ zlgJS5L2ljInDklaXm50OPTiUK5cz!){mrgN=Rr?nv9V*F?`*dhBK`KTgIjvs>m09N z-fgI9b^PgcLKXF8DR++P>d{*A;(9dMY^q7ygRj(APp%DeO1eeom8MtBmk{j~yY+ed zNj`!34}Xe$5!G&3TX8s&zM>!VSL91phNqu9(EqOppZ}EaXJget|Fa!V^sea%wSCpK znSW-qS{%N`yqS8pjK37pZnSImmSRM2xOt-Y9iH*`=qLTC=fd+!)*b}oo$MWWR<^(K zFAnFPH}%`=ml)^ZOt_OA*7=sswgktYqBX9K_@s&7&-ylaL;TjnkKg0{jqMMw`IPEQ z?al@5W4YulW6D3%o>jc==b=^zeWVzSV&;n7h!*y>q|%l*CV#cU)kpEYLC(mM>E#YT zI+qoGq;reI681*FMN6~6Lm~4$#JGi9&+0pq^DmwIPG%pD#CI9NolJ!_L5KX8{2MOq zy&^fHRp)9qzxACLHxsA0pE?}XEtLaf_8hWjTUocA(G`bhGmqu&2H|-4Lp0XNdAoRK zR?8vjhk@xKbg}M#&^ej;*aolaHe?I^6uNNr9mK`-T;DXeIY)#Wxg+94=JV@1mid&g zQxRzG%#k|O&GoO$WBH%5MQwb|_hH`Mc(-!-X z^X=nsF5{Z5V0lw|X10Q4t(^z;^S;LNd!KE~_`4pw-7Y#qHZ6RoKB|d@E__X_a;23c zZLtf>hc@4^I6R5?h1mw=KC=HCoP1Hffyph!3jXH!HCJwJIa~Z;>v{f7^c(%P29r%C z;pZJsX15iE|IIs^SMl^0Sij{*Sx$@EceW?f6KS`2lZ~x=2tEU@ZLX5=oWIMDweu|X zJ5&3BjI{Yhv)bqKaEjx9-!8aJhJ3=&w|HHB)m9OHME3fC{88^G^tT*ldF$Bh-iFVq zGl3`e5x0x@oci8z5k7~gGa;XScZ=PNaxr7}wG_s6CatVpGD3M8L)Mv)PcJ-Y*O{z> zPTs4|apeEXE;*U^vvZW3f6tnfqjY>c zcE*S3j>lFUK>DIIyw;6vH0R@Em+`K0;5DbsCtaofh2as=Gru0c7Ui&uzXz=|NgV<{ zt*`IQ@x3{Gdx-HZ{Bb8VE4}LK zP2ksq)tmenn8dSN;Nv0dP2hL&PZCV1V~In+5mGW@IFMEXN9)dar8 zcYxu&>P@bR=^zuYoxt80Z;RgS%zt^@&+|-q_~2Q7Uqvq_UzbL0(usmm^d;IppZ5<| zZ*q>F!)x|VZoNr;Ja@)6+ZD+IqiI|JeC8gi-sIY7e3Kt0^Tk^m<8izlS`xlCNZYG% zn_w^=e3>@C4+e*|m&Nc3FV^;4{C=kG542@?OL#Wk`kcd|a3@)3YpY|-!Rk#`#^Yvq z=%=*#e8~j5U$FUllbI3Unfx|9Tuqzt?Sb_s;{Ty}%kBZswr~6E$98lR=aqeVc9w3G zttmTG_GLyV$~G-@_OFWp<4^2s&v*Q0ajEgt<`LI|=ai=`eC)0t?eZ!2kXQLDY~t=o z`E7flbAQe%TFW^jf_@bz*@`Z6^_ApTDtGzcd1vb+I}hGepL;$k8qqtO=%?BX(aF{o z1#QcCXW-eM&oxqiojEGLbvOOA@1lK;r97f@*c0JIYq0ZLJI5EV3MaeTN2Z_UJ(H92 z$0ch^!#|$s+eDv6OaDQe*@$+&XlLPyCt1FPbmH|9tfP<*(ub-q)!3>(6`Ur&CI3A? zSA>s6j;c z`dQ<6`j+jS7@~bI{IHF9O7@zivt$=*t%6PKo6209%dD=}_%Yw@hxU{WWlDcu`%1&Ni(+Li?}%{%njF#ZgRl zu3;=2U;A%uzoD(097(NRwnsMHq7PepLAVD#RX(};iSBay8IDBDZ$FJNY65>(ACf7YEj#DTZx!i){Q~vo70n+4ka{ig2e}t9%XVHna1t zWUaPOY8OwjAG8ftfA(PXzTb=4!1pEk%I4L3-ZmKzd}=dUYiFL4wVWz)(ao+)-|yjKyP zLq8k4BK({m8(kpY8LIy5JG?X8`m<{zI1W~Sb`*WgUlhHVti6UcNA+h5wT=Vo&yd?% zlVrTsV)bW*E*@VJ&8acPk6u?;yukX8p^xN|^uR&u&yeGZ0ppoGkPP&Bz2#xAqs45R zuLvKBW(vx(rzaF>y1-)COgp?Xj9 z)9L_n>(3TAev&UKyGZs(c{q=@_o_epT|^_IUDKzz^=GmVb7i6BXW1MkHy_Pfv#s~Q z`m+ZP=wrFXHjeG#z4RGQ{aKoRW&?PbeGanKpFPWS!=dDh?ae9RFoRd=n5yu^Xg@Q0 z%&*O!Ypz{i%e~xzFW_nq=y*T_m?b)#%uk#gG_$|*e`!3oq4SQXi zaFDTYuFk@Xw>K}(!FMJu@o@aUd#V#zyJC(?1-wSyo1)C{mJ1pxBl$es7-Kbj}uY- zSv&38%k28I->D6{4#=ZWTvP81tUo)0y>Rtssgdb9oSEOp@3{WV>6P)}>EP4VpSl03 zKcjxt>d*4i*TY|upQd-DTcj7YuT|mZSZ3J&l9k`AH`&E5fr`v(2x$E5c&tkge%`?705y zUk*}#w(&;l&+;?%XH7Z}H$N}C{%l51|J}lSTz{54bm;ms&b}8XM;=gr_E**>+BaS~ zNc|b_cF^~r^=HMytUtqlc;EGByd&T1^(^{VBWT8DM|U+KQG``ZxF|Ptw=d zR$K?ZHIDZFV6_!jNBy|7{Jm={TJqB~qW){5IDvGN`Qn+{iZ9Z~be3qt_+=!tJg~MR z&+!no74XV=tp8SU;%X}#@0iX$mv-rZ=A?YSg0N|b+KPwBt;(sRSj&Bp18Xa2Q~t-j z^p!2PFI9NZ+KNk~weD(B&W>`qeZ7P~(~fE@QlrxqQD4Pwvh7Lv)3V8gk8$)d8_>sr z2Gmx7)3ajS$*wRta88}ar{s_6rBzNQ<=Oy0i`%4k^=?V{2yJEyTiue{ZND;gXxqTC z`pEv1>=XR*Nz7NXc$jitJL#9%SB+m8-og0qRa>!Mdl<(j4qjXF9}z6_+YRSt-hC<=Wy#QzQUNEzl|=)Z;$9r?M6oj)>nKsde7c5Upo=gDYhFnwBBuk z=CWx}_WQsXtZcHu>MK4;U%%J)NA(r`sY5zkeMMv7VpNjvR%20cV2wr9fi)Hf)K~oe zJ?bl>=T={lKX`q`$Fu7z@;j`)BEQ4pG8W^yWI%nzMZ>7CK##m2o|X?~`w-Pvw2VNG zW@J(iGFbhTlcj#1k2Y`)*44rt@9@(G`n-Z{R<4<=uUME>UqP;)>MI8F8Mw|ld$ar( z%Rh2)F5r6?e^BsgA6&gfOWymdw*Y3@zNZjFdlLA1fm1Tt>3ZlwwEqrm{(qx!?zg7R zXwUmp#o>-xwOQ_~=Y@@Nzl_|yD3-&xGz5ko~iwnLm|Nm|M#pL%v8g?iV-(9xVq}t=imSQ& zOn6P-3y=+>Zw5%7>daJmntAxa%Cp=}+{(w~Btyhwd)h}j`MHm?*S*B-l>hc`=wZcx z3RthnP06YqIUqD^wg;wKi{xpSJ@ ze14|M%-iTE+r#==o9ZQ%yVvLBvv?;Hn|U{G%gEh%jH~><&BPQ1hvb^OJ6q$B|2K_y zloyeKQF1On{CWhV#oyFc5?;et>T9|}@Kl6Tz>Drx*i1a}rJVWA&v~AuKWtS`^u@S>b`OGlN5=frbM?poV#$iTcXPZ?zCAx&=*AFyX16F0 zw~_UNFKAGEk>I-mP3y0BIPh^gdw)LfX5iJDE8Vvp+MTZQ{+8ilDYE#tv=6j7yuAnC zINM`?64loIGRZeu& zZ=#L)D?fBYgK+p>*DBp>aQ?{Y_{g+B4@MJ6_>OsCtS9& zKf99M_APM4L2g=o?>xMuRrcL1aA!8P;@`r()spO>ullJ?`rd3oKc>;P#*A~UCaJ#W z4-daym#H!F-;MF{5^{&*dnhEQ{5MTh7g{f;ydj6{z_R`S6k`&UO>D^^kRHm5>5sF`NRl}=k*;A)rFOY$Em$p-#(`fi*@;S zt=p|-ywx@y#X7R{vlW{;p1ft*FUrk6&)uz55{i~&he(hA!0B)M`%^sk?Pm_scR^O) z)3W-Wob~sV=siD<=DMEuJbn50kJ4{3cR9_+?p7bmTQxX}^P1LwJ!`H>S$)+n8~);C z)B3LsGJa{+JI?ki5{}xV8iGuH?LZv;>Y9X7&AHR^Pj_ z{=Or6&yS<^e4qD(Bj0vAeGZ17`C0SK%j!E2cH!sxXzc9qug!YrK>TFxuTo8jXkBO6 zq8HJx%YCS)wgNg=O`ySC8iwxgy!1rYvjVyoeg5?{57eJsIyTu_r`&n+ z=4V9TuMnR|Mu>kUBgDIl*B;^cyb~X;3t1(9Qv56W7d$)h3yk0Gd|K@$KP+EF{J7ou z4$}Wc;lI3|l@INB#_p^VT>fW&hhde({f;SvbddZphS2% z3BRN1cib^KqG^3S-!nO*@BQ(|E$U)@E@a%bj}*eXO+&7f<>I z&l<*B%Kqy+JpLOz`JB-WT&rN*-)Qx(_&-C|zwQQ4ozx*4-4=&WK(`ueu$tGm;1l1^ z)xT!-)3+!G(n@6C{!DZs+|CAe$3N}LW6RuWB%D7AE*3;I$Kq?kv*vX6E3~r!JZrq^jMvV1+(Q@9;+iEbS5_Y|-ZFH% zji>Lc+I}qnM(x#t(~|BRRerqJ-(x)0bqU67_!j?zd**=epBYoMT@7rLfNiZC%hPuI zlIE+bW7?j@7&;eiMvnOXwpxDw9kTb{Z`p6z`z_r()P8>}Yrk(B(9h`0WaA|6E|E+# zn~eK3u*cXBSC6dyo~1h5NX{iB=c0Q|B(GkFHc!VlZ%{opV@#&LNItrJ^GkVe7WMd& zkKp>n$uqgP6CYi*MP@fkN0x*un@iJe+;f=mKZ>w5^U|N+X|V^<>{9&qCz6xX_tVe6 zyR`X`^t}V$OCFxC<2|iU@e1Ep@$!YbOEFpIzR9F#g|{`6W8-b?BH;Kia}>6IVu<&f zcwaFD!7uvH|4H-uf@5#Z9V40F`b4szwT3YU&i}s$%%Au9Ti1_R_`Lz|=e4e)9_z3{ z-k<5-FLCqd(vQi0e^$LUFF0&L72jt>zV=*F+gF%4@^<-}`W9>9{&_E6Jn7jbTd@T{ z%^fiEO;wjRe_uV{9!#{^-lyChVcW^;=)$j3E_+XERNKy5YJ0EZ&du?OTF$XXh5r?d zU)Pu_;0{ck(T)#a`U`hxRzI_3UuyKxTjmA73W71WCnm33(uJ(ghX!8FukAZB@66|( z=37}ejtf@4Qm1>2<@3m%tqgz9`#ST`7#l9&caY%yweJ1n`F2zhV=SJywz7Ie&~aSe z1cpR#kQeMYiaRT&u;$nCjr=^TleK*pr&6sm zk(sYd3^>b^El?RgsJY+a?ghSy>R@nl|JBW%$Gqj-Pcb>~^ygL~3%Fxr-7P`!?f(IO zj~o%K>SD~MWYM-+jJcaJrHhvF{W8Jv4nDf>qUho-iVgJB`!j-I$MR(Jk|PU(Rr=Pb z-^(Q9W!H}>?@DK@`fldm-smsW{{ej(j{NHqez!L8-5%LU8}BV_t0@m!yLI0ua~E-z zyz$<%+q$_6^fk`bHfS8~E7I9!_Z@|8o9S0e|BoYwy6-rf|7-i6r(ahK--Km+jj8e5 zCxZ*#)jS$sWADTM^7#GmPFvIE$>Q6!u8r`ia1yVtuYYAHV|Ful%jDHdI-{`?ZkxuE&f-E;H-?_eHr1JvY)!>J%qA@g z&x^;6rbqo4yNKtkj>qw5tai2}*!?)u;&Ch|T`_a5$B*;VcnmwAlCN$4aC9F7 zd+^bC49nm4IN`2+r-N1Z{G)grU#n@pvf>HmAg;GuG~1POPU*vquM0Hv(HzQ4PW8Df9l8lQtCtL@z7%* zHK@B%pXZ7l_E zZGu(zekoQVIu*R4MZdN^Eu}7Q@eyFih1X(U+?~vt{h6w@O{DLPR7KCl%q4h*KfxOS zt8l0}H^JwkLmwm2e2RNYHVU6UruJ*z(H%V}!@t5^3-fvTwLDqXIz3g@I+Gs{+kMP= zBYp0#AMMsBS*rO}Tcf!*rN+Dc^Xt=Gn~3pp?_{{AzA~MxJsI1(H2k_-m*Q`tC5y-D zj_RJNnfW!Y#xdISd8x*mdgn{g7&e!U^WVIGKe!Q`36C54Y786ewYQts>K+{%=Pbq$ z?(|*ODsT}T-@LwwZ)b}JwEx}zYO^z1%e$>{YxDbVZ4c0Q z;J&-}h^cCQlAR_8ZI8z>hH$7o&tAXIGzE+Hrhq_0Mrqj|jwW)OT$-!dT z7xS@s1e3QfE<~=($L~~|;PQ4xeE-i$nb@r0^YKmDA(0J1ZF+PEMHJ`M-kip``n?Rk zYvM=!r}{Qv(0vqYJKnbegYL&u+sAwxac137p|+!a8!>Ic*2HhM3ueU?k&o`4A|F4N zPcW?Sqeo}RClX6uIo$7~<30R-+{F#~Mm6JiA=C6Ni8*77TFa4% z3C0TwgTwV*i9~<>i=FsLE_V|Ds(do}me}Rl^jn>(?YnOh=NtGHQ~AA*F=a!~zk22r z-PPa3??iPX?8I-Wk$sKqtO&Mz>A&!CaN^I$E+ub(a|9PB7hbx+;V<`#sFYLoFdJJEn zoVmLATX;~uZ4ho%!)4H`@`IVm=V$BPN zSaZA95UqJ!)|#iL%JEq;YwlyOwB{#r)?CrEj5RkUYu8_j-r{b-bzS&;+LNwZg5LXs zGWU&&q2+1j?laNBn8Ott;2x@mW7l~a_OTh~KM;rWb!Y*26fKL6Jq=w-OzI52kKKU0 zTgrE=YpRU-k|j&ueg|1RvFRoBE49hN>h;TS+xhmK=F`$&0Oxb- z^0|XDKm8G6l*$b^o3A9)8Fejf8b|MF9N}H#l(ADQ(gLF87@O>!Ln_M}5@yka#T92k#;$rnvV+t5xBidHHRnO$*lFkt%EbVXCxs zI<%%b#aT)18{bdajt)we5v#D6)7SZbX0nw3OTx?fdloWO^*P=z?3!}m9dLi8E%=uO z>`8H`xRzw5`oBVZVv%o8#O=zNd7fv}Qrx+V|G&xE4dcVSLShogxMtqh+Fn7=^&?Ys zw^~24K=+Pm?}wz5hGSdpe#A%Id8%kaxh~$WmyIl15RPP%zJqP){7>c--TWFo(8vCX zc7B8G--~^H8GIr>*M6K2O$&EAm(aPdVr23SrLXI;2P~&cc7)o|PqbNWlk~Is373@yq-xrVloOb>1<%aP59q?$eI<+faR20sP-uLgC zeNhrt=CmuPOnc7#SF|gZn+r!G9P8%e{1to&PTfx_Jm`MPZ=+*;d?q_Kv%m4>=uE=y zmv#0CIKOaA?IP{R7sj3bqHr!8R&&pDr$5JzbmVd9$h**yUt(?T$?|g=_};wuv;jNB zc)@%X#hpY)KLU;k9}0HJE|!k$VjUSBX}QD4gQG6=zVxN(&XVwBv^8;d8!&G6I`%jI z-ofABGAcL5!r1TP3u|nrFQFNIzt!Z9VlH;~(oTGDw?5=tFFvoyAoV48u?N3`Niv#p*z8@|INQD3IEKxtu2!qsG4Na>giqm+@!*`Z_@q{V}mGaCZ=)%ZOWteagA=-M%b;~_r^E{;YZ_lL}w-!j*8nf zjco*`;Ac+$LMl+KOo#n*MTalL^=-x;xj~C89OanD<|t z>`0A3c3_`^N0T3g={un@;av2mZ={F@MRUp--rGXH2s*G1pW1Yc#d!qpskEH|&s!~_ z?tw6wr`-M%Tz{?A-|A8o1ynJ;&(H=UF+Vp zGeYg%yS%p<`ZT{rysbM6i^9#v1%2*`x(hp6C=C#h6d#U?opYjHDujnj%Pray}ooQlwc4A-lwN#)-j&L%o2Y!0vj*)F|-ao4C%H!>BziphM8Sj*G zXKO{c4IiqnWdd-G4sYd*QTP8z4of!dOVz-yqr;vVLEq=WRre*HK1>ISzM5I{#*@!+ zcPlB!+U_JB8*&$2*vPZZCw?lrcj*xL#&}#j@CNaSIXvHvEnv7c8MPrbCfrWE;2NH7 z!|t$WmcuE#WgBsi%XqexvqHnYzB6ty=B@aGU*nm*gYOjS_bS^1;`IC)N7{jpzyr06eo*8`W!NtUVK9uF_=E^ih zfai95yWKfZ1WiDDZqF=7y(@J{xSZ$PBRg0+O#9abjoe53Hg~V0_)qdqGI&&Y7wx+D z#`Z+Eo^-*;a3Sq>1~Bjp(rOGp9^payG5ai8F=XNT!#tP0n6nqivh2N>5RYN!z>@EJ zuK2RXD2t!l`EL9iJ*wx2M$fHXXDrcPpda+SfagQX$d-xG`9f|Er_UMJeaYO13qFLe zgtIC29n!nrQSOcDp|d)4ZcrMoCVyxK-%}zt!F~ToGHT7lpkwCPyw;#;MsM}p=-Z-E zZWCt*>m}RV^O?1M@pJN*B*VD-V8{2!@laloavzjuV&_lNM@6Ch_HO})>Dr?3gANYC zWb~u=<|BXfZhx}8r$&A~@pqrk?Z5Td-#)hEXl$&F?IY61Vl#O?aV~$$=6(@bYWgBC zzPnm+={p(M*<|(9@Ua)79cPobk4`U%Z0^17h1~CQNP64H^4qp!i*$`HY}B z(ogEsjoci^GwUxtvi_rK^Y)KDs|xdJGk(jQnI~x5Lag7~{W)TBsBe1wTy}rN_a;AN zLz>-04)!o$|c z7Zz^x#K_4pCQ3@zu<>R_f2&$);n7n`X+BHhAM!(ZmQI&W*vbE9yGq9J9l`dB^jTZ_@BV?asT4cVIt~s04h`(CAD`}R zKO{Yk=YNM!C7-nyk|#Us<0Yi4JpcO@wS9L+{??t&-zp8SLtomN@}c2W=SPVj#ouLoGi^j#@n1c+ zw(+6tD#d>@ZG4Lz8|vtswu(@8(+6|f${DXPT}_*hiD<9Imlo$kCf%Fg_DiktUauz< z$5otVM0geL8ymd6;_aop@KV~}oZ;JzE@Ur#jrKP#@$IsE#dC**U!r|`WDm(s>Otn3 zyc`{#$1{Iluk_GXCoi=}Bg1oerh7oO-||hmkuTzX*=+SZ%iu$>6$|fKZQv67h%?Eo zHgJhP{cBDexWoqfb50w$MAw>s>h}R$V(a`T{f3qi-p(1imgnX@;%(8j)>IU3cf4URl4O#uZmDTT?S$}_Hz&kJVj{G-2=H)#1^*h-xsJ4mk9>;TkWr%+7Qn$4_ ztKa!q{bnJXWcMfzGZD+p_r`|&x+2p02M<^~F*+MU@gnt&p zH;dsJ*+2TePcJd(-P}FyV%sV5En7yrZ*z4a8_prG#PqdfKl%~gKZ7l(=l2HEskbw&wBpRY$FbMQq3nK! zzfs{1o(X^1&t!jTEsFhcr{dzRPHssaYCR*v{p2-g&N?+`Y4`+os>L^o+*y|G1v-;; z$UoKo=q?d!A0IyA+mKy;-yWh(IB|WQuVArD&h^6kdFJO_jT{pWme8jA<1MBl*b2i} z4uGw~`KLW@zm4uzqoWjixjk!4@xW^I)Xh0N{-IUW-&N>RxjX7 zz}?7&ccEQxKeRHx(MfUm0y58hLbI)UQ;GCCzp(pXti$Tp!su zrC~vz*?5xqbF*YTBpFmwwvEb!@B8kA3pNbddCjbdY#Rbfi0)RXejAU%;J_U{j0lq}wWq;YvsC z4T6P@EvLC}&PYccDLDckZ32H@Ud&pdxNC`%x7SV58H>dc{~H-D8SCY;$&L|WiR6vr zMY9*xt}}?Tj|Gd@Qa>q~T<7kH6y24DhtY02&F(~$zR=w5(fA$?!@0?EL=KNc=DaYj3$Y6a}NV0s^q|vOSGTeoKQRUjbj*>p%o(sn7#!t~Wl8dH0 zBy%d=x8LvQc?Om;<{ZO#WnmwF$~`=jjP&wLviHRZK8u4IzrFI&>@ke*^q#&MbgSkE zZ+;G=J!&7Z3#8}g4Km(Z#?w2SBb(pP-{<_Qf^hSM{Ih`*jV=06U;n>k+_9`TGlqD`#`qKKRNUD=vv$otD*O+g^+d61J@bY?thAL?_L0x$Y(dzs>)h$aBfM6#3(tzhS9l6ui*w&gx!J{9R{Z8|c@G zZ&F7;#p|iJN6w5*D=%2zEK}TF-?&uVTsa1!Kk4J0$lV`S7pHY++r6wwAaBDPUx&M-*s@vIz?=+WpcVchX^RBlqnyK5Vp*Cr$ ztKYHMOk+!;<0SgbYsqu+zp_mgVAKID$@l3Y=eK8AM(?(H`| zV(^NVHHLUgW2m3%CB!Em;62OdFnZ9lnZtPR(0INK@0=gKCwZs&5-ZB%njF!o=1lOO z)|Hr4=IT?_Pkv@LT#Cu{;@9nRvO@C3$CpdPsWEI;ucl|&?`ln3c+b z#_O=!9`R{59<}dR#p_28y7iZYj}GI#ujH&h(to_yi~QE!Nd{=|Br|g7EDz=1s*mW~ zXv*Lcd>&7y$9>pOWUBgUe>IlqSN%@T>SN>N@~Y(CC!#*~u5wEJo@8p%j-t=I=p;Me z%&q&B9Mc+RW{tBUg2&bBOM4bryB`k3XY32%cUN1ckTfO@3v`##G+A zRqzn??C>JzPON@uNf&XTmC0o5a&+zl&Woo-=fz8* zuhk=il^+Dg)%n3;ORHBe*@LWO+>WK_Vm+VAneR?;S*5m%YWpSxl|3KM3obmGyD&5- z-#ky37w5OGaIq8FL{;I;6!k$#yN{redJEO(Xg%{;$1-T=|FHKa@KsgU{`fxk-XxbK zki?8Yp1B#6!GTF3yxMY;Fla;^po7{c3DFk8iilM-U_uhHCAQ@P6}|D5Fsb)aU$v47 z(MlkS42lK{j;&z^qs1^L5xoEJcki>4lS=|Y?eD!$KYu=-!^u5opS{;!(_VY+wby12 zgry6!hdZzrpM6;gS+=7u|Q7rRdk4$OEBqPI{DL4_F4qf)(iFUifl!pSb^t_*{m5 z5U0NYK0D7psrE0f0d3L&C%+?~b8Mf8??~r2fy*Kh-Po(RczfP_ua|NpA_exaU~g2M z*qS1Qr}B2u+#ltL!?WeH?0;Q8x4w0O^0{5_OEKjWe#?KUd`5RoKA%QEzOj6wPnt)% zBA+8Z>{vdB<9V=r4*2{3A^D8{KPaDw!_l}8me2k0>wgpZd>`Mn$)~HamzZ<5d`6!w zpMlc2y8c+>=R8}_G39zc=1M$s+Vm$P|5mse|H-id`{GQ#JS|Y^f2FH=p655+HU83 zpY!MhfA{|I5kQaAX5s!^+SAhKh;cF$@A%wi5A_)EVX{60&!{7nZPDAmt;-aWf_CXb%uS|ck&3{(RbGR9eh(A zJXbN}W_kFD2{Y|$;#%PrJ{8z2&-T;L*cRqJSWj8n`i%9#cZ#)>XIh_Wx+MC;Kx?%| z!#d&L13ehW$+%Zx@_~v)Rr~+Gl60kCN%_^I+VP6AF^{55Tb*nx0yvBCe{S-Lnx`xO z%t1Ws)ZT=@LG5#F%TrIjr@e`}w#=I-*MuPtEr|P*{0|&C>|*tC_)cg8ATHXUfbsMM zeT*ibt99*of94+A&-5$C`@au;&bgYlb#}qlc^dhm7l8-3|Lz%lpJGpF*nK82p%8hq zPU5#N+XH)@*4V`AW56HnKiWkXADlm*c+8ra*EHu5R}<$(DK10eakptZl7Hp22i5H{uwU4eG9DFb+y2037#4DcaxTSIn4TnT7dU^B{5pT~e- zViNk7g8pSeHa4T46TtDDN$ex?N#oluJ`OAb_@35zDfHl7JKr$fsfnPzpe9k;%!pU z`uLn4qC6Eoo2;3p44ARs#Q!9Wq4GUqzgyp%vERo{zaDv({(=wCzFxl|94C>_GF--f z)4vnzpDWj%*(a0-j7_!-&(@%CzQ&wg^V}oW^2l*n6IAvX%Cau0dywyPP0;%WyeA%X zeLq8e^b@f>zuN_vR|S3Z4}9|};?VOk@3odaS<=^2iLznHm1*r`6LMVESzx}QgEkff zwee;rZG<3?=1KT1=AwKk@@ckj2l+HD?F{LlotZ)Htm>p4JMwLwgpc4Jly@NSrnQ|@ zHb?n?<2x(=X#6q%wiPGD-|azd{ubW`YzY#7jA^4TcmDHiUm9ej)rWS*%!f}|pzfl~ zB-S8DL%L}0St&eOF=BO6jm;BVqvC@($KaUT3M2eeDFV4AAmbB-(fB;_U9!xR%M8yi zGT_tRI2S%&#LaAc_Grz1%h?Oc|DW3g_&spE5j?=WAo^xJAtcxHcT?e_(^nQ;RZ>fF_4)m5!qfUMc%b z-(;+R9r{V0Ar1L^)&|3K8)!%Tuxth1(-F`(o4%`e->eRwjsY+N{I_ z$3oTxKo)J7@=&Il3t+vuM0m21Lw5sUS&nyx#A}j2pE%XD;T`xbvYWgO{IISf$=k91 zwSeE+w<`Qr`UK||%fD5B%FX_;FYHqvOJ63lFR*KA$1<-F`^7eF#q>EtcH#45AMQuF z^Vy2zcePId`7TiYX^z)9-Rd?W_m6YV4_afGBuz2S+LmT`oI5i-xtF_rTz?jZyZN&L z5x#@d#M%RiVZPn)6V&gBXbOyvYzpj%oEaElA3m{2G;WT84w~j(TO>rI(rb3)yBYb& z=h1kMz9_#1=5F9Q*tm_Hk8oX0L@)7jovk)btmgOJ6Oj@PyC_af_$tTgsb3DC2>c85 zYcyf}Jq6!IJ^ULdTIU@&TMT{!;xVw?HvB8huW@D*XrS=S^{NTPJLcw^cW%OO$_wf8 zdr1?{1#uo1@WV37UXS%}NFmR0EKl;=@s9fH0DkX_8so!y0C+e_#*17Iz9&6ec|^)z zZ>9Srzak&t*N#>j1-|O7_BeNDD)KZ#QjhQ1Yxm?scIuTblEW}*9!TCOLPatR3>C){tL$>qCqtrtvPx;p49clebeBS~(-3mLQ2|WA|`1LEFql zXmaFPa}%)`ouP1Li=O(VT}^Y!~oaV{;F$x4Zh+B#2DL za?sYwNB>D9w!a&4CGCF;Z7#xh4`QtSC2&t)6k+?Jg+>Peqw0eimrGB3dX=1}#C;ji)t~b5pg%XiA zkLP4%!wzCTOXjXzw>7YsaVdpPFWd^u9kAH=CDuiYTE&g}8? zeh=Bq#QQ~v#rq2S;T`D6ROE_GZ7SOF3H~O2tnKB!hxkf7r+r^(b8nv^^_AGV-pt>) z9&>{t% zra$T0ArF{xZ{-1fh7Vi%6r4 z$&)e>U(kQzEJONd^N}YI@eg&W_=aQD2ods`8*vw$7jW;P*1f!su+0Ai%F@o#=K}Ft z>+iH0fpx)HIlsf%On$^kY@)V~6@E9H74&e@wN z>6#GC@B8av=a(d94r4oMwt+*lF_u6!>armN z2A)xulLw2D>(&rP|Dx0CtjE-|WX1Mbez=f%HZ*)ZyJ|0d9~_5a&upIyo~NB}<@rf~ zBO7(qfagcK5c6g7{9{vGO+~P4$nz!OdEjRIT$AT1f3=85yTs)CO61?I1m90YdGh@n zw@sD5#^yPh&9`*>B3-@K!n3F{W*DPXA1zDWCkC^2xT(iVy9yOxxLfA+2(*&s0%y zrmT-~v9wuE%dsooKLK_gQR>%%VQ#SoAFFTM7O=U8{0^b6jGM6*ZnD`}gudHb+vmwMmhRGKSp0! z2mfXrYR?q+L#X{Ov}?DcjEafj9zg1&p8iYF2gH2II+VSa=y&0nDo2@A`!5S+IrROE#3PvwMS50bTyDi1IBNf1XT5tFyrEKAz4EccQUj~tI#hJE-g z%CJqg!98=t3EQM!kv9AZlzp=mXT$|YkaJ(Bne+9of*USq49j&k_9_70j)X%-UstvVot{D8J z<{oO_9ODdcG}|DbvwrqR**{!2QMSuylV^dJ(s3Jw@g6WuCbr;7IM^ z(dWOZT#m%G#4TueZz~MS2BVM23Mb*Xq_vEii;?dY9ozONC8La-i-GQnjw&~$ZVT&^ z{_!ZIc!{=Vg5L|=UW_$21!Ko~6xo0FOVL`<|2p)GwBs{P=hdjkif`Je)_!mvcMS5N z>S^PJXIsBhwxg97G>`7bcWNz*b}!pR?q__b>Y^O0c*-Go#;Uif|0-t(TwQPT0b zp^FJaSI!N^xb&^g4aN5pv0ln^Lq}i0xuJdjex7qfliSV>O~9H;hv$Y4w457?@@dd5 zT|PGy<;jBqtP5y7A3AP1Hx&J1JY?{>p`<~FXNM-MvqQPgunuDdee?S4(1-C`(~kE* zPH5ej(^)&t6dJxWIgE|9N!#PZ?XWWn95RNud1{E912rRV_^TPAzOMi)V}|>{rzBu6 z9K`pWt8otWTp&=Df*7#PIAiu|r>L_7FR78@=CFvJ-U94VD}W#TV10bWZj?>1hi%=9 zy-3s%tcTxEl>Rt-!*V%?iu0F1KXUF2y2>#S`f2qkjP<$?dojjP=FxsL{pB3X4?t(_ zN1fcS8;g3Qu;xtvhw^2s@#Y51Iar6*OSC^i;NL8=#mlv!UAR+!RN|Z^=FB?)ydj5{ zpKbFu>t~y4Pq2c4{y+`GQMs;8cvO3Ae<0dCQ<&vDHa;7^f*jy?B-Rv1VQphH#)wd9 z6JkBTu^W6jSHpKBap&wDcYg*<^mXAZOsw}Bemm@3oLQcj7YM8lv%44AVQXkS{}AP# z#k(_w%YDof#yEM}g3X|#n%j18*4K!(v%YwqRrcwTIP1&NcGegCIVbEPGS6aJ)Y)f! z%|x5`AqH$WVlZjX@(imkpY`QZXMMTsIM)h%nFl@@p8oC6_Zka$X#2{zKsgqx^S%0Q z!5pH4^S!>r7)F|ME#-$8BUdc}0o*MDyAxUW@~zVUtXSkNCEF=0XPxH-xl?l= z&Wnnr{ZBo_xf1!<0sr2p$$6R3A$7}Lc7H8=?HI3Kq8~9E=WqQjTb<+eGWM`{bdJ}~ zG~xL^e7-ZXalQuei$2lLya~_vJ^$wUUGf|+oZr=gKJxr7_|RS)fHH00B>2}LUML&S z=9U7umV z_5L~bj5^xX+J2sslU`R`%YGGa|N1|~qS8{sQ(T%>2Y+wt9L|P#?n&DBouqj08Nj~I zmfVnveH!}#mm^x8wM9P9#<%?bB=i@3Qu-%Jf5w`Og^j6nzKRvr zKC^A;L)&xeeKm*Kgy;FdA?Lz;ui}dh{{}qgUYlirm2)W-UyeI;>O!o;x04YWOSx6b z2jkIrF1^)PKz+u3GdHf1kuX!Yhnl+G;SZd)Hy%n76HYvjc#vNS&$0uLEQlN!GQR5T z(K|*9qb?%)KgNHNEH3&i8f#qXSl>=}co=Vf8hC8Uad<}CLt&$Y`qzuLu~+h`oS&+( z`Tb;N4_NuPFZ_gKaIT}a4-S=y;Q_>7P%aO>>Y|mZxSQ76P#*U)aR(KF8*5e z|2%qYuco7?LighRm6@S3h7o7c-<_H{wmv2E`Y%&5zeox9HBXH29VkFt18oyCmhm&} zh2vhfJs3YZ2M#@6p=OOOH8dvN>+=n%;SRmem_Q1ZVaO??;kUnaif1w04 zaN}ytzYwSLFYK)yIb4l}oXg_868PD%P872jFuoH{9mcUP*59M2SoFrDh>84yfhq#;3h`Z5o-3JkGa{%!+ZE@WWKV|1&Z_pqNG_ddt<>@fa7GZwl zr5GcK?|q0@Om+RICk?T4hr`gzC^r>fek@9<35;E*kk!meETl07jb!T<>9&o*QLCq zeYo0p$Sypz5uH7at(;F4Anx>2+z;YTJxg74^}a`7^T$hlvj*c1$KVtLvI<>Z50m`M?ULd>XKFGpZM=vt=UMB! z(k}5ZHz56-j?>tmBihG<+NP!=9yC$v6XkzU`*bS||2VvENT)jq3SG=dhke%0*5? z3?`0RFjwGsqW!lgp$n*+o9M%Z9@XnfP9fIrh2K^A0ufV=b=FrguDU}+RWbG=^+mr= z*E&3t(sA}H?B}eRlbed8oaN3C>|x@1)75IdKz-la|3`eg7wxKXrMJpgh`Ghr$zsuv zcu|Gex5nLJOL`S!-x>69;~xB-Ds16-39g~}J;haAUso}e%9r^R_jW<2>AWhm1Ma}S zOs(U8*+ZTpB(QmS|u897Zu)L0~U@=dGKkn519_JTK8ue^bG4bt3P*{ z{ei!mWA02#f4F~``4`D|AE7^#3HPUnaWq5~>Gd$^px60mQ-b!`hiAseB0nO1?(FyD z;qZq<3>>x(v_Ak{z5ms$X6~7yZlZnP1UcQaE~|NOZC3L&m^-Td*~$K^WsJST%Sg0K zpBsI?lRse@ZJ>`#ThES{O(1Rdxpx=P{i zW$43o$znRAO;DPuh zp0kJ-;FP!}UJr17j5u|T!!=lQTn*VHO@9h})_fMID#z~=(0P?}v)06l-WL_y`wr!M zJ9Js3%m+)IsO&7v^Kbd`U|=!xf7nFw;L_}Fm@^>`1bZp7?BePjIB)p3fYv|YGr-2W=)<85ZALwe zI}Vh_w9^^X1B(IgwUJ_2q9LF&Ql!pcF5zIELH)w@=Vs^=tIk+XogrmJ>5Tt@JP51K zD0OzOGup{mZ~qc}dzQ|?9xQ`8BcZ*{fc?{^GZI}x*Grv2yOw@+B^wbP=!{0J3H}iN z$yQwf-vs4b>xxIw7IlR?8oC0o_kyk<{rLA%=!$f#v6p~`0z95Wy=U^d(tC&xvh)GD zV_Wq^O>dKCwS7&^MG{_AC1w{mQiT zi@YxL&*osS8)WL&=$q0_D$av6xEwsEpS@h8bdBBAHJrySziD~Joi*KC{b#NyWp5Sh zJ>_ORg=4^+?bJUd*z;F8zp|nLdWSkHPwOaitxoHiJlKOu&m{KOc(v*oD{eKuJJcU0 z{@-uaGl?DR8M7Q|FbDnG4qqqf0Gk>*MbY6l(BThKj+6a=fp4$oaG6JxF|BjOFD*dq=^;-4EU+~VVKW;-V)Zu)F zw&h&Y)E~n^%OQBaA9IWYunQgsPPjhHG3KMA%8#qx{oL|yhxv~1@tb$?`#Id-!JWV9 zr(_(LuInv4KU4U+^a~z~5Y3dss$=9M6%TSO!rjd8&J=EVKKNV4lw?37r zByy%NfiKn#pXhjVy_@~g*U~AIGUrT5%gmBRBFFGNi8%w$aX-=veml$~c#b>gAJl*Jw{ZT%b<9s;L-GuD zwcf|I0_Bs>m%5dHoVNAJze#(u?RPft_7LWgstkQWtT*1jrCptE{+_Y2PVW6^Tf2NW zk$5!QfiH+QPc^<*HX-&?pzqtz2bW#pN!zg0qh|`YNu0IEGyI+w9RCU5Vr*M&0M?=@ zshO#eg%QO@<5KXua2DSJ{14YOBmVWAUOyZ05qVVQDO7Yc>jzxS5y2Q)_WAc{r^akY z)9_sFF+YQzH!TG{Sx2hL?+Z|uKwTP^ixJCCc&y*lV}8c>CZ*eG$!b#3Y__zmZCP5cDfRk026{te(OuE7(I@53** zCj@h5?03@j=g{x${EzX=rxY|ncWs3psw>EN(`%ockvS3mX9I0A&UiiQ;h8y%HP&&) zsqiJ{V{ej(Odb#0@*>h5xeWV@yq<#vd~v~Wo+*6k?7ovmfL+t*@*o_v(x-#|v%NEg z?@Am5)2Bb_0~?dL(Rd*)thmv5IR#$Uc=Nt3Zel+2f85m) zNW2r5wf-}OtK@eqCuIk`L;cF~lpV&&Q4jqH=lRS4Z{7*pFU`WAr8s+{0P~VkZGV|| z?FqyOktWA-Y#z!CeQ?whZ@>@7K7%(_Q=V@6FtB(zc!=u{)S=nnC6>(wKVk1u|7DQ< z=kU!^lyN1A{*|UKP;$0Y_VYM=Gla1ZaLBqpvy36Sf7ZS+#|ZtN*8W}m9rf>tp#CLw zp?}l5*uNux?WliNeWG$fk!D4&*%~Kf&&WRf9fCOYQp6K1fgQ04vChXlK=dcZgHBf2VmZnk`Ihem#{Sb7YprFV&*uxs66=;_&AN_S%2~^Z zi;#QPVq;(qBY#(ZLK#>3lj|pkz`qA!i_%9g`51D`eHD8#2j36BKKcCs{G}XwQb8li z+FJ1VF{yLtbBOi7gfU6m$Tb+h)Zg&wB6i(sQ_!yTV2`B4sT>oP&Q<+adC9CW5eBw@ ztW?277zqpEB0O0V9_+^lJd|6uy9f5r&*3*=8)pht?kkO7;xcT7W;Q?;@S4^rHDnAwwd(J#QCp9 z9njV1uz%IKGaBDn`M!-l=Df^m@0fKDV%?^_(>l%zdzbCLu^&(-I;bBq!@l zv-(Z=jgIQqc56F3P0brPHj$^^0#BXKPSA6WbMUMR&L9ch0cm)H%6QyYs*^9JwCJI6BC_2A>R zrVWB`tYh@|;RE3u+G>NGWq+9dAKD*tQ17u?dz<|MzE}aAkq*VC{qZVr(Q1F-eMk1k zI7y5VO1@!MH zLH%n#pRw2<*I4WiF`Th$9nBYxez;Ij%i1fTI${dA4_Cw-P-q{#;ChG zup#uG)Gpf(rhZXlEc6KQNc*7#c&6M-`=Jzji?NPRU4JdwRQ>#$oU6<_+@8Kp=)?PW zBPYQ>0*MBAgSNm7_%k$p*X#)-hV4|k)po7ogBcduk+1a_K|7UmEo~p%jdF4<`=Qb&qVY*D)W1T9;xhJ=d9%{QrSD`9Am`bl-R{hW}v>{0|{h^O}(V zc`N1&bt{qEV$@Vu<`UEYpzF!UxWIZMEcJBu{Uw&~an225ERZi2_YwA3nJ;z`@G%7Q z#wE<>hd4*##Ok;D>N3tZHcOfb;GOsxAw=V2z)Kmfm5`})@ZVA~$IBRlGT8VfqQsl< zSsU%xzsOI@+QkCyE_Wi|l4veP?D6BMhqyjbn(jFX8mRSk_==t>*`BEFJgj3KD{z%d z-y)thWBrlqXvz4yH?BhTfjN0xmiS8UG24y2S-X+jggK3^?_}&Ha%hq6qr!TX%XM-1 zf9bpTBS&ztExi1*#bLg^rJ=sMi@@8ZqkWVO#y`c!A$KFpy5VQ9M?M?@K4M%&4d%f7eG2i>{5|Jn2eihT zGU>!|9dVoGq;=p2qVYPcJ@17twk?NbPydgwZqD`KQGi9wU&-HGXXxp_5&J{=?ye5r zU2DE$Ug6;HvdnkPD;)gpKlMAr*95;Cf_JIlYo5S(>BCj%1J|y#j+hVq z_b&9`B*;~u_M$q2I$z&3Or6vEKlp8(^L7XBl)VoBHrh-;8{qTRN)}XX?NV6>|BmyA@7Cqx{0p&GYyCD1 z-?q0IHEizY9q6n0-5jl7rZcuB_0C@7L+S^4MnYFkgl{4{y3A|L68&sX2p@S<d2SMNd?Ih`bVSV`9sc+wh+79aIY9CeyefuKLI=>X-z8ZxezU9R;O~6gOAy16ja<_7i{{`y39%eS$SVz9KB0(t zrLi8l+$OHFj_>(GgtMLztQYap&EU6E)RQIb;k!dz!wQg}IvepO;(F#o7Hj8B$!p3- z&I^I~)s)Hz8SAghyWo?}viBWkKQmxx4q{1ch+{9nH>Fc1H5DK)MK->fnAc5yV}(I~ zKgaGGw)ae*&fBZ+F2Cj8_WVg$YrsXl)*t$cvTdz1AF*ZhOYwaP{yq%f=p^(@w?$ui zaG7HGD0G>8#EiX-GPIv*TOT;oHfOcUSD>_89dJ>{vEHh8NH_YJ?(AVN51CmYW0xL7 zTt`uc$~TVvDH3)8`>$>Mi1owHgKkjk(zilqzkq&qXshl*J=`0q*G9MFw_PNBmXDZ@=fGbf@K-EFJeLFg zJTPHpMGa!Q*v4bnKOHi&{r+hkTd@qW74?X%coVS|cRo_kv_i*l>2+Sja0L*GX7EHhIcJVoX4rkELzx@EF?HxTCL|G@-4tZEavNe3$((&Rm7I zr9Vuq<)|~AG+t)`ubdCK5X;291(416M#6>>uA9?jR#Z4Y?1D?{jIVR8E zJsUS`Am8nAquTEjH)gC$N8hyK#@xTB<1ehZA%DSl^`7=`QAZ>kY|np~7rw{m+#eBz zcLDnlIUZxqFrBfh*%<5fn0greMmw8hYeO@gDr@o<*GZ0^gkXa?VSgK>f+NFLBEG?}=Ii@mgx0`ygz*^;jQQb5-i9c>i=f zYj3k7mvxl#KeCQ)fR$sKoOjCgtu3wVwz~hNF9i}yaJ}~m>|k7H3fD?_mm`;00nRZc z%nJcC$eU`PxzerKpO0x~zTs7v zUrV^;TF+Y&rf<@2w+`A}agKI>(_y=>`s~HZ?=ex>8#qTk1$~@7zto!@X)EV`sAlw? zG5aFgww3tc*v$Av(hNNBapl;MPZ}{LmN=?J#AjlB*`9#91GebK6APa7KHDR{d_VjP zp|PQ@^HccV?_KB=sc zXC>kMDVv`^-WF6%z>mY4BPC z;Qk)!oP#+IV?p-=E_HTLf*)r?c?jz=z*qvfR!X>RD1$RM0oOB-aqb=e6uuX>$$Z(H zVB_=e>j3eVvBBID}{6 z`1T}xCf(p`sfTYV7kf3Z=dupxF4avmM8h)pMGgUWFMLZ$>qXrjtnD6J73w40+V?=c z$9+O;=tIJDWdluE4mjHrf?T?w z5pvsZ9RWHSpU>LC+<~dlCEk_7C}*B!0iV^Lh~foY>lb+Lg6&J%lAgpX@kyGp&+IF0 z*CVid_P6$naptPOTo=C&aPsVC1wUi#7>mcgCHe2hJN8B3YJ1<)Ux4R?m#}sNe*uPu zkVMcJ@?jkA*uQnA@I9$pNOKM6=YN8|1e}oWgs;9iu$p{A-k5FL(Ps+%-;Mm)9ZLT4 zAb+r_+RI;L=kf>LQwdx{f1O|c%y|cK(@y@9x*&h0M#u68SUZ$Iz(wCGZ3!FYa7`9ojMl0V2*JNbjGrGobD1WHBS zW)W6?2!2AH&t-(+Xt*2oKQ2PI9zvVg+u6Jhxd)hs1m)%YMaM-c+fVITh8fzL8>Uz1xnazCH|Bye{_IJ_t8y=@)xJ>qVJL5~ALLl6^TYH) zJX=qhAEpraumfH-mMUBR68I}vkMcvuA@?uFF~oZX=ZA5@*QoQuFn7yloWU(~x3F)Z zU1xpco)YGhA-pP|jLKm{m^93s$7+~w0gP7o2=D1N?e{52I~XzJDxZdmF>^a?<%rvZ zo@H!XqTDM}>_To10b4wWbDUWJ8uW`kHI*~R+`|U@gYB2#8U{bxS@w2NJ2l|%KFm3T zSiarhGt!Uyl;@+Lsj$BW|BC0ssy)pmup5ZiyB|M)y{V|z z%1cMGWqnTB!fzwbB3t-qWsy4cQ2)}SU zx?1Wc&DMfGdLP9y%;QM2zs>FZ8~AcwEI@onK~h@`o_=-!&r0w<8}Day@cv0W(`8o$ zz2}^o_3lJ$ALn!QH}e^B3V*|k^f@l#ydCov&O6A{^gYss-X!A-^qz3W3MTk#5qGBi z3beQREZ#p9&$KT=pIb&Av&QGhwoos99c}F~rk8DEFFfc;eMp}H>-V*5hyKR|e{$+ZHE8F{P_eqi8T}2!+xHP~n2p%U9L$X-nemduSvF!MiJxDZIOI3{&3fsR zcpP}M)>DXjwES?~!`y$unL@><2hkUvXSN5jMja#lzNNzRCUWeLM63bUPwJRor+~Ta z&HOrqLAO~CoyK;lPuTWk^ecdvPK<)h0pKT)0v}uieaDK2t>0>RZ@0#90zMbyL&K;0 zA>|2haSez*8RBOY;;{DN?;=}VLnY*=0RD!%mSG(Pyqpi4JPqgcWaF%(5%7a7g`c